AT24CXX系列芯片调试记录
前言
在调试AT24C32芯片时,曾经遇到过内容读写不正常的问题,因此,在此记录一下遇到的问题以及解决的方法。
问题
在使用GD32F470的芯片驱动AT24C32芯片时,直接从GD的官网下载eeprom读写例程,官网的例程是驱动AT24C02的,但是在读写AT24C32芯片的内存时不正常。
原因
网上的很多资料都是24c02的程序,读写的存储数量不能超过256个byte,在读写过程中24c0x是分页写的,每页可以存256个字节,网上的驱动程序多为24c02,默认为第一页,当输入的地址大于256时需要加一个换页,以24c08为例,一共有1K字节,每页256,一共为4页。
而I²C的发送命令格式,前面四个1010是eeprom的固定格式不能动,对应16进制为A;后面四位的前三位数据(A0,A1,A2)就是翻页所需的地址(也可以理解为页地址),第四位R/W为读写控制位,最重要的就是图中的A0,A1,A2数据位,因为24c08只有四页所以只需要两个二进制数据即可(A2位强制为0)。
A1 A2 值 | |
---|---|
00 | 第0页 |
01 | 第1页 |
10 | 第2页 |
11 | 第3页 |
24c02的page write时序如下:
从上图中我们可以看到在24c02的page write时序里面,它的内存地址(即上图中的WORD ADDRESS)是8位的,也就是说如果在不改变器件地址DEVICE ADDRESS的情况下,只依靠内存地址MEMORY ADDRESS对芯片进行寻址的话,那么最多只能寻址2^8=256个byte。
因为24c02的内存大小只有256个byte,所以,只依靠8位的内存地址MEMORY ADDRESS对芯片进行寻址,也刚刚好足够了,但是如果增大芯片内存,比如24c04、24c08、24c16、24c32、24c64、24c128、24c256呢?
以24c16为例,它的内存空间为16*128=2048byte,显然,如果只依靠8位的内存地址MEMORY ADDRESS对芯片进行寻址,是没有办法寻址256之后的地址的,所以,这个时候,就需要改变DEVICE ADDRESS的值。也就是上文提到的当输入大于256时需要加一个换页,换页就是改变A0,A1,A2这3个地址位,2^3=8,8 * 256 = 2048byte,所以,换页寻址的方法最多也只能寻址2048个byte。
如果芯片的内存超过了2048个byte,比如24c32的内存为4kbyte, 此时,换页寻址的方法也无效了,这个时候,就需要使用16位的内存地址MEMORY ADDRESS对芯片进行寻址了,24c32的page write时序如下:
可以看到24c32的page write和24c02的page write的不同之处,就在于24c02只有8位的内存地址MEMORY ADDRESS,而24c32则有16位,这样就可以确保使用16位的地址对24c32进行寻址。
解决方法
在对eeprom芯片进行读写操作时,对于芯片的地址寻址需要特别注意,否则读写出来的数据是不正确的。
总结起来就是,对于内存小于2048 byte的eeprom芯片,依靠8位的内存地址MEMORY ADDRESS + 器件地址 DEVICE ADDRESS 对芯片进行寻址,在读写过程中,需要改变器件地址 DEVICE ADDRESS;对于超过2048 byte并且小于64k byte的,依靠16位的内存地址MEMORY ADDRESS + 器件地址 DEVICE ADDRESS 对芯片进行寻址,在读写过程中,只需要改变内存地址MEMORY ADDRESS即可;对于超过64k byte的,依靠16位的内存地址MEMORY ADDRESS + 器件地址 DEVICE ADDRESS 对芯片进行寻址,在读写过程中,需要改变器件地址 DEVICE ADDRESS。
附录
下面给出一些常见型号的24C系列的设备地址和存储地址
AT24C的设备地址和存储地址
设备地址
AT24C的设备地址都是一个字节, 以二进制1010开头, 通过A0,A1,A2这三个pin进行调整. 根据容量不同, 设备地址和寻址范围有区别
AT24C01 - AT24C16
这个系列的存储地址只有一个字节, 所以内存寻址只有256字节(2048 bit), 对于AT24C01, AT24C02可以直接寻址, 对于更大容量的型号, 需要结合设备地址对内存地址分page访问
AT24C01, AT24C02: 设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备
AT24C04: 0xA0 - 0xAC, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备
AT24C08: 0XA0 - 0xA8, 第6,7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备
AT24C16: 0XA0, 第5, 6,7位是page选择, 第8位是R/W, 同一个I2C总线上只能存在1个同类设备
AT24C32, AT24C64
从这个容量开始, 存储地址变成两个字节
设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备
AT24C128, AT24C256, AT24C512
设备地址 0xA0 - 0xA6, 第5位固定为0, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备
存储地址两个字节
AT24C1024
设备地址 0xA0 - 0xA4, 第5位固定为0, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备
存储地址两个字节, 所以内存寻址只有64K字节, 128K需要分两个page进行访问
第8位是R/W, 同一个I2C总线上可以并存2个同类设备
存储地址两个字节, 所以内存寻址只有64K字节, 128K需要分两个page进行访问
写数据
对应波形:
再次读取:
读取的波形: