FM25L256操作子程序

存储技术

606人已加入

描述

  在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部份代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。接下来我们就来看看关于FM25L256的操作子程序。

  #include\;

  //FM25L256数据读取子程序;

  //参数:*pDestination要读入数据的;

  //参数条件:uiSourceAddress+(;voidReadFM25L256(unsigne;unsignedcharucHighAddres;EnableFM25256;//CS变低SPDR;

  SPDR=0;//为了读取数据,需要写入数据,发;wh

  #include \

  //FM25L256数据读取子程序

  //参数: *pDestination要读入数据的主机内存地址指针; uiSourceAddress要读取的数据在FM25L256中的地址(整形); uiNum数据个数(整形)

  //参数条件: uiSourceAddress+(uiNum-1)不能大于器件的最高地址; uiNum必须》0;

  void ReadFM25L256(unsigned char *pDestination, unsigned int uiSourceAddress, unsigned int uiNum) {

  unsigned char ucHighAddress = uiSourceAddress 》》 8; //高位地址 SPCR = (1《

  EnableFM25256; //CS变低 SPDR = 0x03; //写入读命令字 while((SPSR&(1《 0;uiNum--) {

  SPDR = 0; //为了读取数据,需要写入数据,发送SCK,故写入0

  while((SPSR&(1《

  pDestination++; }

  DisableFM25256; //CS变高 }

  //FM25L256数据读取并发送至串口子程序

  //参数: uiSourceAddress要读取的数据在FM25L256中的地址(整形); uiNum数据个数(整形) //参数条件: uiSourceAddress+(uiNum-1)不能大于器件的最高地址; uiNum必须》0; //返回值:所发送数据的检验和

  unsigned char ReadFM25L256SendToUsart(unsigned int uiSourceAddress, unsigned int uiNum) {

  unsigned char ucHighAddress = uiSourceAddress 》》 8; //高位地址 unsigned char ucTemp;

  EnableFM25256; //CS变低 SPCR = (1《

  while((SPSR&(1《 0;uiNum--) {

  SPDR = 0; //为了读取数据,需要写入数据,发送SCK,故写入0

  while((SPSR&(1《

  DisableFM25256; //CS变高 return (1); }

  //FM25L256数据写入子程序

  //参数: *pSource要写入数据的主机内存地址指针; uiDestinationAddress要写入的数据在FM25L256中的地址(整形); uiNum数据个数(整形)

  void WriteFM25L256(unsigned char *pSource, unsigned int uiDestinationAddress, unsigned int uiNum) {

  unsigned char ucHighAddress = uiDestinationAddress 》》 8; //高位地址 EnableFM25256; //CS变低 SPCR = (1《

  while((SPSR&(1《

  DisableFM25256; //CS变高 _delay_us(50);

  EnableFM25256; //CS变低 SPDR = 0x02; //写入写命令字

  while((SPSR&(1《

  SPDR = ucHighAddress; //写入高位地址CI-FM25H20-DG

  while((SPSR&(1《

  SPDR = (unsigned char) (uiDestinationAddress & 0x00FF); //写入低位地址 while((SPSR&(1《

  for(;uiNum 》 0;uiNum--) {

  SPDR = *pSource; //发送要写入的数据

  while((SPSR&(1《

  pSource++; }

  DisableFM25256; //CS变高 }

  //FM25L256自检子程序

  //返回值:0:自检成功,1:自检失败 unsigned char FM25L256SelfTest(void) {

  unsigned int uiTemp;

  uiTemp = ReadInt(FM25L256_CHECK_ADDRESS);

  if (uiTemp == 0xA55A) //判断是否存储器是否能读 return (0); else

  { //存储器不能读或未进行出厂设置 SetDefault(); //出厂设置,函数定义在System.c WriteInt (0xA55A,FM25L256_CHECK_ADDRESS); //设置已出厂设置标志 uiTemp = ReadInt(FM25L256_CHECK_ADDRESS);

  if (uiTemp == 0xA55A) //若读取正确返回0 return (0); else

  return (1); //若仍读取错误则返回1 } } /*

  //测试FM25L256子程序 void VerifyFM25L256(void) {

  unsigned int uiCheckAddress = 0;

  unsigned int uiMemoryNum = ReadInt(MEMORY_ADDRESS); unsigned int uiOldData; unsigned char ucError = 0; unsigned char ucSendChkSum; unsigned char i;

  union tagSTOREINT siUsartDataInt; //整型共用体,将整形分解为字节型存取,在DataStore.h中定义

  for (;uiCheckAddress 《 uiMemoryNum;uiCheckAddress += 2) {

  uiOldData = ReadInt(uiCheckAddress); //保存原有数据 WriteInt (0xA55A,uiCheckAddress); //写入测试字 // __delay_cycles(10);

  if (ReadInt(uiCheckAddress) != 0xA55A) {

  WriteInt (uiOldData,uiCheckAddress); //写回原有数据

  SendChar(COMM_FRAME_START); //发送反馈帧头

  ucSendChkSum = COMM_FRAME_START; //计算反馈帧的校验和 SendChar(VERIFY_FRAM_COMMAND); //发送命令字

  ucSendChkSum += VERIFY_FRAM_COMMAND; //计算反馈帧的校验和 siUsartDataInt.uiStoreInt = uiMemoryNum; //发送地址总长 for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  siUsartDataInt.uiStoreInt = uiCheckAddress; //发送测试地址 for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  SendChar(FINISHED_SEND);

  ucSendChkSum += FINISHED_SEND; //发送结束上传标志 SendChar(ucSendChkSum); //发送检验和 SendChar(COMM_FRAME_END); //发送帧尾 ucError = 1; //置错误标志 break; //退出循环 }

  else if ((((uiCheckAddress + 2) % 1024) == 0) && ((uiCheckAddress + 2) 《 uiMemoryNum)) {

  WriteInt (uiOldData,uiCheckAddress); //写回原有数据

  SendChar(COMM_FRAME_START); //发送反馈帧头

  ucSendChkSum = COMM_FRAME_START; //计算反馈帧的校验和 SendChar(VERIFY_FRAM_COMMAND); //发送命令字

  ucSendChkSum += VERIFY_FRAM_COMMAND; //计算反馈帧的校验和 siUsartDataInt.uiStoreInt = uiMemoryNum; //发送地址总长 for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  siUsartDataInt.uiStoreInt = uiCheckAddress + 2; //发送测试完成地址

  for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  SendChar(GO_ON_SEND);

  ucSendChkSum += GO_ON_SEND; //发送结束上传标志 SendChar(ucSendChkSum); //发送检验和 SendChar(COMM_FRAME_END); //发送帧尾 // __watchdog_reset(); //复位看门狗 }

  WriteInt (uiOldData,uiCheckAddress); //写回原有数据 }

  if (ucError == 0) {

  SendChar(COMM_FRAME_START); //发送反馈帧头

  ucSendChkSum = COMM_FRAME_START; //计算反馈帧的校验和 SendChar(VERIFY_FRAM_COMMAND); //发送命令字

  ucSendChkSum += VERIFY_FRAM_COMMAND; //计算反馈帧的校验和 siUsartDataInt.uiStoreInt = uiMemoryNum; //发送地址总长 for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  siUsartDataInt.uiStoreInt = uiCheckAddress; //发送测试完成地址 for (i = 0;i 《= 1;i++) {

  SendChar(siUsartDataInt.ucStoreBuff[i]);

  ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }

  SendChar(FINISHED_SEND);

  ucSendChkSum += FINISHED_SEND; //发送结束上传标志 SendChar(ucSendChkSum); //发送检验和 SendChar(COMM_FRAME_END); //发送帧尾 } } */

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分