本帖只适用AT24C16及以下的芯片,AT24C32及以上的芯片读写方式不一样,故不适用!!!

如果你的代码可以正常读写24C01/02,直接拿来读取24C16是可以的,但是只能读取256字节。

AT24C16与AT24C01/02/04/08 不同,它引脚的A2,A1,A0是无效的,也就是它没有自己独立的地址,总线上只能挂一个AT24C16设备。

AT24C16总共2048字节,分为128页,每页16字节,地址范围是0~2047。

128页只需要7位地址,分为高3位和低4位,高3位在设备地址中,低4位在字节地址中。

设备地址:1010+页地址高3位+读写方向(1:读 0:写)

字节地址:页地址低4位+4位页内偏移地址

例如读写地址:1864 ,首先计算该地址是多少页的多少个字节,1864/16=116(0x74)页,1864%16=8(0x08),即116页的第8个字节

其中页地址0x74=0 1 1 1 0 1 0 0,最高位忽略,分为D6、D5、D4(高3位)和D3~D0(低4位)两个部分 。

可以计算出 设备地址和字节地址:

设备地址:1010+111+0/1 (AT24C16设备地址高4位固定为1010)

字节地址:0100+1000(高4位是页地址低4位,低4位是页内偏移地址,即0x08)

最后,根据标准I2C读写时序来对这个地址进行读写即可!