存储技术
在计算机科学中,子程序(英语: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); //发送帧尾 } } */
全部0条评论
快来发表一下你的评论吧 !