用了战舰的例程读写24C04发现一个BUG

2019-07-21 01:41发布

            在文件24Cxx里面,会发现读写24C04上超过256的地址的时候出问题, 经过验证,是代码读指令有个bug,写是没有问题的。不知道是不是我发现的比较晚,还是有人发现了。

  u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{     
 u8 temp=0;                         
    IIC_Start(); 
 if(EE_TYPE>AT24C16)
 {
  IIC_Send_Byte(0XA0);    //发送写命令
  IIC_Wait_Ack();
  IIC_Send_Byte(ReadAddr>>8);//发送高地址
  IIC_Wait_Ack();  
 }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据    IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
 IIC_Wait_Ack();    
 IIC_Start();        
 //IIC_Send_Byte(0XA1);           //进入接收模式      ,这里错了, 正确的应该是下面
IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); 
 IIC_Wait_Ack(); 
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件    
 return temp;
}

   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
dzkmr
1楼-- · 2019-07-21 07:07
 精彩回答 2  元偷偷看……
八度空间
2楼-- · 2019-07-21 10:16
回复【楼主位】xuzhenglim:
---------------------------------
楼主注意一下,24C04的设备地址格式,相对于24C02来说,A0位在24C04中对应的是存储阵列地址字地址,所以你在超过256个数据进行存储的时候发送这个器件设备地址的时候就要注意了
sea1216
3楼-- · 2019-07-21 14:32
 精彩回答 2  元偷偷看……
张招
4楼-- · 2019-07-21 17:21
sea1216 发表于 2018-5-31 10:45
新手有不明白处:24c04手册上器件地址最后一位P0相当于是ReadAddr/256,内存地址ReadAddr实际上应该是高 ...

24C04如果使用256以上的空间,是不是需要将现在硬件上的24C02换成24C04并且将它的P0连接到一个IO口上。
Acuity
5楼-- · 2019-07-21 19:42
张招 发表于 2018-10-9 21:02
24C04如果使用256以上的空间,是不是需要将现在硬件上的24C02换成24C04并且将它的P0连接到一个IO口上。

24系列EEPROM通用驱动:
https://blog.csdn.net/qq_20553613/article/details/82733817
xlyl9999
6楼-- · 2019-07-21 20:22
 精彩回答 2  元偷偷看……

一周热门 更多>