关于IIC的24cxx的读写位的理解
代码部分
uint8_t AT24CXX_ReadOneByte(uint16_t ReadAddr)
{
uint8_t 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));
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;
}
- 按照开发板上的连接 , A2/A1/A0 均为 0 由于 I2C 通讯时常常是地址跟读写方向连在一起构成一个 8 位地址( 读、写地址), 且当 R/W 位为 0 时, 便是写方向,所以加上 7 位地址,其值为“0xA0”,通常称该值为 I2C 设备的“写地址”;
当 R/W 位为 1 时, 表示读方向,加上 7位地址,其值为“0xA1”, 常称该值为“读地址”。注意所有的 I2C 设备都是遵循(器件地址+读方向=读地址,器件地址+写方向=写地址) 。 - 在这里重点分析一下,为什么AT24C16只能挂载一个器件,而AT24C01/02能挂载8个器件,以at24c01/at24c02和at24C16 举例:
I2C总线上所有外围器件都有唯一的地址,这个地址由器件地址和引脚地址两部分组成。共7位。器件地址是I2C器件固有的地址编码,器件出厂时已经给定,不可更改。引脚地址由I2C总线外围器件的地址引脚A0、A1、A2决定,根据其在电路中接电源正极、接地或者悬空的不同,形成不同的地址代码。引脚地址数也决定了同一器件可接入总线的最大数目。 - 与P2、P1、P0有关,即页地址有关,页地址高三位是器件识别控制字节的1-3位以AT24C04为例子,由于有一位是片选地址,AT24C04的地址字节范围在0-255,256-511 两个片选,当地址字节是256时,(256/256)<<1即0x01左移一位为0x02, 将片选位+0xA0,即为IIC_Send_Byte写数据。同理可得AT24C08有4个片选 即 00 01 10 11 通过地址字节得出到的片选地址。有4个片选 即 00 01 10 11 通过地址字节得出到的片选地址。