|
发表于 2009-7-21 12:04:25
|
显示全部楼层
没这么麻烦吧,用eeprom_read_block 和 eeprom_write_block不行吗?即能定位写也能定位读,我都用N年了,下面是我的用法,希望对大家有帮助。
另外,使用那种IDE和编译器均是自己爱好和机缘,无论是哪种编译器只要你使用得好都是好东西,不存在这个行那个不行的问题。
下面是两个读与写的函数,你也可以直接用eeprom_read_block 和 eeprom_write_block,我只是为了参数传递方便,又写了ReadDataFromEEPROM和SaveDataToEeprom
//从EEPROM中读取指定地址的指定个数字节到缓冲内;
void ReadDataFromEEPROM(byte *sBuffer,word wStAddr,byte iReadNum)
{
Reset_WDT();
eeprom_read_block(sBuffer,(void *)wStAddr,iReadNum);
}
//向EEPROM中指定地址存指定个数数据;
byte SaveDataToEeprom(byte *sBuffer,word wStAddr,byte iReadNum)
{
if( (wStAddr<5) && (wStAddr>1023))
{
return 1; //地址错;
}
if(iReadNum>30)
{
return 2; //个数太多(此处个数自己根据情况定);
}
if(iIfCanWriteEEP!=0x55) //软写保护标志,函数前手动打开。
{
return 3;
}
Reset_WDT();
eeprom_write_block(sBuffer,(void *)wStAddr,iReadNum);
return 0;
}
其中:byte、word、dword分别是unsigned char ,unsigned int,unsigned long的宏定义
函数的三个参数分别是:要读或写的数据缓冲指针,要读或写的绝对地址(M32的为0~1023),要读或写入数据的字节数;
///--------------以下为对上边函数的使用(为了使用方便,我多数用结构而不是直接用char数组,当然要用什么还看你自己的喜好了)。下面只列举读的,写的同理,不赘述
//读取系统数据;返回0成功
byte ReadSysinfoFrEEP()
{
byte sBuffer[16];
memset(sBuffer,0,sizeof(sBuffer));
ReadDataFromEEPROM(sBuffer,SYSSTRUCTSTADDR,SYSSTRUCTLENGTH); //后两个参数分别是结构在EEP中存储的开始地址和长度宏定义,
//读出后先存备份结构中
memset(&struSysInfo.wPrice,0,SYSSTRUCTLENGTH);
memcpy(&struSysInfo.wPrice,sBuffer,SYSSTRUCTLENGTH);
//验证CRC是否正确;
if(CalculateCRC8(sBuffer,SYSSTRUCTLENGTH-1)!=sBuffer[SYSSTRUCTLENGTH-1])
{
//数据校验错误,再从备份区取数据,
memset(sBuffer,0,sizeof(sBuffer));
ReadDataFromEEPROM(sBuffer,SYSSTRUCTSTADDR+BAKADDRELSE,SYSSTRUCTLENGTH);
if(CalculateCRC8(sBuffer,SYSSTRUCTLENGTH-1)!=sBuffer[SYSSTRUCTLENGTH-1])
{
return 2;
}
}
//处理将数据复制到结构;
memset(&struSysInfo.wPrice,0,SYSSTRUCTLENGTH);
memcpy(&struSysInfo.wPrice,sBuffer,SYSSTRUCTLENGTH);
return 0;
}
其中struSysInfo是一个16Byte长度的结构,其成员有uchar型的,有int型的,还有unsigned long型的。 不过定义时要注意字节对齐。 |
|