股票

AT24C16–EEPROM读取妥协办法

折腾了两天,不想再整,妥协了。对AT24C16的访问走的是IIC总线,为了区分单字节和多字节访问,我编了两个读写函数:

  1. EEPROM_ReadBuff(FM24C16_ADDRESS, EE_ADDR_MODULE, sizeof(moduleInfor), pstr);  
  2. EEPROM_ReadBuff(FM24C16_ADDRESS, EE_ADDR_CALIBRATE_FLAG, 1, &magCalibrated);  
  3. EEPROM_WriteOneByte(FM24C16_ADDRESS, EE_ADDR_ERROR, *(ps_err+i));  

一个是访问一个字节就挂起总线,一个是连续访问多个字节再挂起总线。之前的操作一直没有问题,今天碰到的种种灵异事件让我相当无语,就测试了一下访问情况,发现无论是哪种数据类型,当地址执行数据类型的初始地址时,使用单字节循环访问都不会出问题,为此,我使用了妥协办法。

存储:

  1. uchar *pstr = NULL;  
  2. uchar *ps_err = NULL;  
  3. pstr = (uchar *)&moduleInfor;  
  4. ps_err = (uchar *)&initu;  
  5.   
  6. for(i=0; i<sizeof(initu); ++i)  
  7. {  
  8.     EEPROM_WriteOneByte(FM24C16_ADDRESS, EE_ADDR_ERROR, *(ps_err+i));  
  9. }  

读取:

  1. for(i=0; i<sizeof(initu); ++i)  
  2. {  
  3.     ps_err[i] = EEPROM_ReadOneByte(FM24C16_ADDRESS, EE_ADDR_ERROR+i);  
  4. }  

暂时能正常工作了,可以看到我这里的访问方式很奇怪:sizeof(moduleInfor)的大小是64个字节,使用多字节访问函数访问没问题;只访问magCalibrated这个参数值时,使用的也是多字节函数,也没有问题。但是当我储存initu这个结构体变量的时候,多字节方法就会出错。没办法,只能使用单字节循环。

打赏
原文链接:,转发请注明来源!

发表评论