Skip to content

AT24Cxx

1. 简介

AT24Cxx是常用的I2C串行EEPROM存储器,具有容量大、读写速度快、掉电数据不丢失、串行接口简单易用等特点。AT24Cxx系列存储器广泛应用于工业控制、数据采集、智能仪表、消费类电子产品等领域。

  • 封装类型有: SOT23-5(极小封装), SOP8(常用封装), PDIP-8等
  • 工作电压: 3.3V, 5V 都是可以的,但是一般建议使用3.3V,

2. 芯片的硬件连接

AT24Cxx芯片的硬件连接主要包括电源、地、I2C总线和写保护引脚。其中,电源和地引脚用于为芯片提供电源和地,I2C总线引脚用于与主控制器进行通信,写保护引脚用于控制芯片的写保护状态。 注意: I2C总线的两条线是SCL和SDA,必须要上拉至VCC,否则无法正常通信. 一般使用电阻10KΩ上拉.

3. 芯片的读写操作

  1. 芯片的初始化:在开始读写操作之前,需要先对芯片进行初始化。初始化包括设置芯片的地址、选择芯片的工作模式等。
  2. 写操作: 写操作包括字节写和页写两种方式。字节写是指将一个字节的数据写入芯片的指定地址,页写是指将多个字节的数据写入芯片的指定地址。写操作需要先发送芯片的地址,然后发送要写入的数据。
  3. 读操作: 读操作是指从芯片中读取数据。读操作需要先发送芯片的地址,然后发送要读取的地址,最后读取数据。

4. 芯片的读写时序

参考:
I2C总线的时序

读写时序如下:

时序描述
Start起始信号
Address地址
Write
Read
Stop停止信号

5. 芯片的参数设定

c
/* AT24C02参数定义 */
#define AT24C02_ADDRESS      0xA0  // AT24C02地址(写),读地址为0xA1
#define AT24C02_PAGE_SIZE     8     // 页大小(字节)
#define AT24C02_SIZE          256   // 总容量(字节)
  1. 这里要说明一下,当芯片的3个地址脚全部接地时,其地址就为0xA0,当然其它容量的芯片需要根据手册确定.

  2. 页大小是指一次可以写入的最大字节数,不同容量的芯片的页大小不同.这里需要根据手册确定. 这个页大小不是芯片的制造工艺决定的,而是芯片内部在厂家设计时设计的一个缓冲区大小.所以一般容量越大,页的大小也会设计的越大.

  3. 容量大小表

    型号容量 (bit)字节容量页大小 (字节)
    AT24C011Kbit128 字节8 字节
    AT24C022Kbit256 字节8 字节
    AT24C044Kbit512 字节16 字节
    AT24C088Kbit1024 字节16 字节
    AT24C1616Kbit2048 字节=2KB16 字节
    AT24C3232Kbit4096 字节=4KB32 字节
    AT24C6464Kbit8192 字节=8KB32 字节
    AT24C128128Kbit16384 字节=16KB64 字节
    AT24C256256Kbit32768 字节=32KB64 字节
    AT24C512512Kbit65536 字节=64KB128 字节
    AT24CM011Mbit131072 字节=128KB256 字节
    AT24CM022Mbit262144 字节=256KB256 字节
  4. 注意

    • 页写入时,如果一次写入的数据超过页边界(例如从某一页的中间开始写,写到下一页),地址会从当前页的起始地址回绕,造成覆盖,所以必须控制单次写入长度 ≤ 页大小,并且起始地址对齐到页边界比较安全。
    • 不同厂家的 24C 系列兼容芯片(如 ST 的 M24Cxx)页大小可能相同,但具体请以对应 datasheet 为准。
  5. 容量的大小计算公式为:容量大小 = 2^n * 8,其中 n 为芯片型号中的数字。例如,AT24C02的容量为2Kbit,即2^11 * 8 = 2048位= 2048/8 =256字节。

6. 芯片的相关函数

芯片的读写操作都比较简单,操作起来也没有多少要注意的地方. 主要完成以下函数即可:

c
/* 函数声明 */
uint8_t AT24C02_Init(void);
uint8_t AT24C02_ReadByte(uint16_t addr);
uint8_t AT24C02_WriteByte(uint16_t addr, uint8_t data);
uint8_t AT24C02_ReadBytes(uint16_t addr, uint8_t *data, uint16_t len);
uint8_t AT24C02_WriteBytes(uint16_t addr, uint8_t *data, uint16_t len);
uint8_t AT24C02_IsConnected(void);

7. 芯片的读写

芯片的读取操作,只需要调用AT24C02_ReadByte()函数和AT24C02_WriteByte()函数即可. 参数为地址和数据.也可以同时读取多个字节,参数为起始地址和数据指针,数据长度.

对于AT24C02,其地址范围是0x0000-0x00FF. 因为AT24C02的容量为256字节,也就是0x0000-0x00FF.

8. 芯片的代码