FM25L256操作子程序

  • 格式:doc
  • 大小:43.50 KB
  • 文档页数:5

#include "FM25L256.h"//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<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);EnableFM25256; //CS变低SPDR = 0x03; //写入读命令字while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = ucHighAddress; //写入高位地址while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = (unsigned char) (uiSourceAddress & 0x00FF); //写入低位地址while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕for(;uiNum > 0;uiNum--){SPDR = 0; //为了读取数据,需要写入数据,发送SCK,故写入0while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕*pDestination = SPDR; //从器件读出一个字节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<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);SPDR = 0x03; //写入读命令字while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = ucHighAddress; //写入高位地址while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = (unsigned char) (uiSourceAddress & 0x00FF); //写入低位地址while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕for(;uiNum > 0;uiNum--){SPDR = 0; //为了读取数据,需要写入数据,发送SCK,故写入0while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕ucTemp = SPDR; //读取SPDRSendChar(ucTemp); //发送至串口}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<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);SPDR = 0x06; //写入写使能WREN命令while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕DisableFM25256; //CS变高_delay_us(50);EnableFM25256; //CS变低SPDR = 0x02; //写入写命令字while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = ucHighAddress; //写入高位地址CI-FM25H20-DGwhile((SPSR&(1<<SPIF))==0); //等待SPI发送完毕SPDR = (unsigned char) (uiDestinationAddress & 0x00FF); //写入低位地址while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕for(;uiNum > 0;uiNum--){SPDR = *pSource; //发送要写入的数据while((SPSR&(1<<SPIF))==0); //等待SPI发送完毕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) //若读取正确返回0return (0);elsereturn (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); //发送帧尾}}*/。