IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据

2019-07-21 08:20发布

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);//发送高地址    
 }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_Wait_Ack(); 
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件    
 return temp;
}

IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据

((ReadAddr/256)<<1)这个是干什么用的,难道可以实现自动器件寻址?但我又不理解。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
八度空间
1楼-- · 2019-07-22 03:33
回复【5楼】Tang青:
---------------------------------
原子哥的程序是通用的
Tang青
2楼-- · 2019-07-22 05:35
回复【6楼】正点原子:
---------------------------------
我也知道,公司那块EEPROM 上面写着ATMLU204  2ECL,都不知道是什么,他们又说是24C256,弄了一天弄不好,我用24C16试又没问题,所以应该不是程序的问题也不是我的问题。
SHIBO
3楼-- · 2019-07-22 10:55
 精彩回答 2  元偷偷看……
华兄
4楼-- · 2019-07-22 12:32
本帖最后由 华兄 于 2017-11-28 17:19 编辑

详细解读:https://wenku.baidu.com/view/689 ... 4e852458fb39cd.html
maqiufeng
5楼-- · 2019-07-22 17:04
24c02 1片字节地址范围 00-255   加上地址引脚
a2 a1 a0 可以扩展2kb  是8片24c02 地址范围就是00-255  256 -511   512 -1023 。。。。。以此类推,假如写一个数据到300的地址  此时应该是第二片的范围即256-511 此时a2 a1  a0 应该是001   8位写从起见地址应该是 1010 a2a1 a0 0 (1010 0010)16位应该是0x a2    程序中0xa0+300/256<<1 即 0xa0+0x02=0xa2 刚好符合
烈日灼心
6楼-- · 2019-07-22 22:14
其实你可以用标准I2C去尝试谢谢, 就会知道A0 什么了

一周热门 更多>