折腾了两天,不想再整,妥协了。对AT24C16的访问走的是IIC总线,为了区分单字节和多字节访问,我编了两个读写函数:
一个是访问一个字节就挂起总线,一个是连续访问多个字节再挂起总线。之前的操作一直没有问题,今天碰到的种种灵异事件让我相当无语,就测试了一下访问情况,发现无论是哪种数据类型,当地址执行数据类型的初始地址时,使用单字节循环访问都不会出问题,为此,我使用了妥协办法。
存储:
- uchar *pstr = NULL;
- uchar *ps_err = NULL;
- pstr = (uchar *)&moduleInfor;
- ps_err = (uchar *)&initu;
- for(i=0; i<sizeof(initu); ++i)
- {
- EEPROM_WriteOneByte(FM24C16_ADDRESS, EE_ADDR_ERROR, *(ps_err+i));
- }
读取:
- for(i=0; i<sizeof(initu); ++i)
- {
- ps_err[i] = EEPROM_ReadOneByte(FM24C16_ADDRESS, EE_ADDR_ERROR+i);
- }
暂时能正常工作了,可以看到我这里的访问方式很奇怪:sizeof(moduleInfor)的大小是64个字节,使用多字节访问函数访问没问题;只访问magCalibrated这个参数值时,使用的也是多字节函数,也没有问题。但是当我储存initu这个结构体变量的时候,多字节方法就会出错。没办法,只能使用单字节循环。