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条回答
maqiufeng
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 刚好符合

一周热门 更多>