读写EEPROM_AT24CXXX
读写EEPROM_AT24CXXX
概述: 最近一个小的项目需要单片机驱动OLED上显示30张以上的BMP图片,所选单片机Flash较小存不下这30张图片,于是捡起了身边的EEPROM*–*,选用芯片为AT24C256。
说明: 照片分辨率为128×64,格式为BMP,一张照片所需的存储单元128×64=8192bit (1024Byte)。
30张照片所需的存储空间为30×1024=30720Byte。
AT24C256存储单元为32768×8bit,及可存储32768Byte,刚好存储这30张照片。
注意: 芯片手册所谓的256K,指的是256Kbit而不是256KByte。1Kbit=1024bit,即256K=256×1024bit=262144bit=32768Byte。
通俗的讲比如我们定义的一个8bit数据
文章目录
手册下载官网https://www.microchip.com/
1.AT24CXXX容量
AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256…不同的xxx代表不同的容量。
AT24CXXX | bit容量 | Byte容量 |
---|---|---|
AT24C01 | 1Kbit | 128Byte |
AT24C02 | 2Kbit | 256Byte |
AT24C04 | 4Kbit | 512Byte |
AT24C08 | 8Kbit | 1024Byte |
AT24C16 | 16Kbit | 2048Byte |
AT24C32 | 32Kbit | 4096Byte |
AT24C64 | 64Kbit | 8192Byte |
AT24C128 | 128Kbit | 16384Byte |
AT24C256 | 256Kbit | 32768Byte |
AT24C512 | 512Kbit | 65536Byte |
2.AT24CXXX页与页内单元
总容量(Byte容量) = 页数 × 页内字节单元数。
AT24CXXX | Byte容量 | 页数 | 页内字节单元数 |
---|---|---|---|
AT24C01 | 128Byte | 16页 | 8Byte |
AT24C02 | 256Byte | 32页 | 8Byte |
AT24C04 | 512Byte | 32页 | 16Byte |
AT24C08 | 1024Byte | 64页 | 16Byte |
AT24C16 | 2048Byte | 128页 | 16Byte |
AT24C32 | 4096Byte | 128页 | 32Byte |
AT24C64 | 8192Byte | 256页 | 32Byte |
AT24C128 | 16384Byte | 256页 | 64Byte |
AT24C256 | 32768Byte | 512页 | 64Byte |
AT24C512 | 65536Byte | 512页 | 128Byte |
3.AT24CXXXX寻址方式(不是IIC地址,是存储器内部寻址)
对AT24CXXX进行读写操作时,都得先访问存储地址、比如AT24C01写一个字节的IIC时序:
先发送设备地址,收到应答后再发送需要写数据的地址(WORD ADDRESS)。AT24C01容量为128Byte则WORD ADDRESS只需要7bit就可以覆盖128Byte的数据地址。通俗的讲就是128Byte就占用了128个地址,一个7bit的数据范围为(0-127)刚好128,所以128Byte的字节地址需要一个7bit的数据来表示。
AT24CXXX 字节地址如下(*表示无效位):
AT24CXXX | 容量(Byte) | WORD ADDRESS(占用bit数) | WORD ADDRESS |
---|---|---|---|
AT24C01 | 128Byte | 7bit | |
AT24C02 | 256Byte | 8bit | |
AT24C04 | 512Byte | 9bit | |
AT24C08 | 1024Byte | 10bit | |
AT24C16 | 2048Byte | 11bit | |
AT24C32 | 4096Byte | 12bit | |
AT24C64 | 8192Byte | 13bit | |
AT24C128 | 16384Byte | 14bit | |
AT24C256 | 32768Byte | 15bit | |
AT24C512 | 65536Byte | 16bit |
4.AT24CXXX页地址与页内单元地址
比如AT24C256有512页每页64个字节,15bit的地址数据对其寻址,低6bit(D5-D0)为页内字节单元地址,高9bit(D14-D6)为页地址。
如第16页开始写,则WORD ADDRESS = 0x0400(0000 0100 0000 0000)
0:地址无效位
000 0100 00:9位页地址
00 0000:6位页内字节单元地址
下表如AT24C01
16页:需要4bit寻址(2^4=16)
8Byte:需要3bit寻址(2^3=8)
AT24CXXX | Byte容量 | 页数 | 页内字节单元数 | 页地址 页内偏移地址 |
---|---|---|---|---|
AT24C01 | 128Byte | 16页 | 8Byte | |
AT24C02 | 256Byte | 32页 | 8Byte | |
AT24C04 | 512Byte | 32页 | 16Byte | |
AT24C08 | 1024Byte | 64页 | 16Byte | |
AT24C16 | 2048Byte | 128页 | 16Byte | |
AT24C32 | 4096Byte | 128页 | 32Byte | |
AT24C64 | 8192Byte | 256页 | 32Byte | |
AT24C128 | 16384Byte | 256页 | 64Byte | |
AT24C256 | 32768Byte | 512页 | 64Byte | |
AT24C512 | 65536Byte | 512页 | 128Byte |
查看手册
AT24C01字节寻址需一个7bit地址:
AT24C128字节寻址需一个14bit地址:
以此类推,其实就是上面总结的那张表。
5.AT24CXXX IIC地址
IIC通信需要先向从设备发送设备地址,AT24CXXX芯片上有A2、A1、A0引脚,通过这三个引脚我们就可以自定义AT24CXXX芯片的通信地址。
地址构成如下(手册上都会有写),比如A2、A1、A0接地,则IIC写地址为1010 0000(0xA0),读地址为1010 0001(0xA1),有关IIC地址详情请看IIC协议详解
6.AT24CXXX 数据的读写
AT24C256为例
字节写
按页写
★注意:
往AT24CXXX中写数据时,每写一个Byte的数据页内地址+1,当前页写满后会重新覆盖掉这一页前面的数据,而不会自动跳转到下一页,但是读会自动翻页。
具体看手册:
如何翻页写
按页写其实就是执行一次下面的时序,也就是发送一次从机设备和字节地址最大就可以写入64字节的数据,如果要连写多页,就重新按照以下时序发送从机地址和字节地址等。
读
有以下模式,和写差不多
7.读写代码
没时间整理了,要不参考:IIC协议详解
注意:不同的芯片读写会不同,具体查看相应的手册。
★★★如有错误欢迎指导!!!