参考文章:AT24C02、04、08、16 操作说明 - schips - 博客园
单字节写入
- Start 起始
- 发送器件写地址
0xA0→ 等待 ACK - 发送 EEPROM 内部内存地址(8bit)→等待 ACK
- 发送要写入的 1 字节数据 →等待 ACK
- 发送 STOP 停止信号✅(必须 Stop,才会启动内部烧写)
- 芯片进入内部写周期 tWR ≈5ms。
时序总结:
Start → 0xA0[W] → ACK → MemAddr → ACK → Data → ACK → STOP
页写
- Start 起始
- 写器件地址0xA0 →ACK
- EEPROM 起始内存地址→ACK
- 连续发送最多 16 个数据字节,每发 1 字节,24C08 返回 ACK;中途不要发 STOP!
- 我认为页起始地址可以发16个,如果不是起始地址发16个会覆盖这页头部数据
- 全部数据发完,发送 STOP 停止,芯片启动一次内部 tWR=5ms 烧写。
时序:
Start→0xA0[W]→ACK→MemAddr→ACK→Data1→ACK→Data2→ACK...DataN→ACK→STOP
读操作:3 种读模式
- 当前地址读(Current Address Read)
- 随机读(Random Read,指定任意内存地址读)
- 顺序读(Sequential Read,连续批量读)
24C08 内部自带8 位地址计数器:每次读写之后,硬件自动把内部地址 + 1;读到地址 0xFF 之后会回卷到 0x00。
1、当前地址读 Current Address Read
不发送内存地址,直接读上一次操作结束后的那个内部地址。 24C08 内部保存了上次访问后的地址指针。
总线流程
- Start
- 发从机读地址
0xA1→ 等待 ACK - 24C08 输出当前地址的 1 字节数据
- 主机发 NACK(非应答)
- Stop 结束
时序:Start → 0xA1(R) → ACK → Data ←(从机输出) → NACK → STOP
2、随机读 Random Read(你波形里的,最常用)
指定任意 EEPROM 内存地址读取 1 字节。 技巧:要读地址,需要先做一次 “伪写”,把内存地址发给芯片,不发 Stop,用重复起始 Repeated‑Start 切换到读模式。
总线流程
- Start
- 器件写地址
0xA0→ ACK - 发送你要访问的 EEPROM内存地址(8bit) → ACK(假装要写,后面发重新读)
- Repeated‑Start(重复起始,不发 Stop!)
- 器件读地址
0xA1→ ACK - 24C08 输出该地址的 1 字节数据
- 主机 NACK
- Stop
Start → 0xA0(W) → ACK → MemAddr → ACK → Repeated‑Start → 0xA1(R) → ACK → Data → NACK → STOP3、顺序读 Sequential Read(批量连续读)
在【当前地址读】或者【随机读】的基础上,主机回复 ACK 而不是 NACK,24C08 会自动地址 + 1,继续输出下一个地址的数据,可以一口气读很多字节。
流程(基于随机读,接着连续读多字节)
- Start
- 0xA0(W) → ACK
- 目标起始内存地址 → ACK
- Repeated‑Start
- 0xA1(R) → ACK
- 读第 1 字节,主机返回 ACK(告诉芯片:我还要继续读下一个)
- 读第 2 字节,主机返回 ACK
- …… 循环
- 读到最后一个字节的时候,主机发 NACK,通知芯片不再继续读
- Stop
重点区分 ACK/NACK:
- 主机发 ACK:还要继续读下一个字节
- 主机发 NACK:读完了,结束传输
地址溢出行为:读到 0xFF 之后,下一个会回卷到 0x00,不会停止。
下面的表先跳过
| 型号 | 比特容量 | 字节容量 | 单页长度 | 总页数计算 | 总页数 | 地址说明要点 |
|---|---|---|---|---|---|---|
| AT24C02 | 2Kbit | 256Byte | 8Byte | 256÷8 | 32 页 | A2A1A0 全部为硬件片选,仅 8 位片内地址 |
| AT24C04 | 4Kbit | 512Byte | 16Byte | 512÷16 | 32 页 | 借用器件地址最低位 P 作为 A8,9 位地址,分为两块 256Byte |
| AT24C08 | 8Kbit | 1024Byte | 16Byte | 1024÷16 | 64 页 | 占用器件地址 2 位高位地址 A8、A9,4 块 256Byte |
| AT24C16 | 16Kbit | 2048Byte | 16Byte | 2048÷16 | 128 页 | 占用器件地址 3 位高位地址,8 块 256Byte |
| AT24C32 | 32Kbit | 4096Byte | 32Byte | 4096÷32 | 128 页 | 不再借用器件地址,固定 1 字节器件地址 + 2 字节片内地址 |
| AT24C64 | 64Kbit | 8192Byte | 32Byte | 8192÷32 | 256 页 | 双字节片内地址,32 字节 / 页 |
概念:控制字里包含器件地址和读或写信息 控制字 就当作 器件地址
控制字一个字节 : 固定格式:1 0 1 0 A2 A1 A0 R/W,其中1 0 1 0是固定的,A2 A1 A0是器件硬件地址 R/W 写=0 读=1,
内存地址一个字节:0-255
AT24C02:2Kbit 2048/8 = 256{Byte}页长度 =8Byte超页会页内回绕,写9个字节会覆盖第一个
一页8个数据 第一页地址是 0x00-0x08 第二页 0x09-0x0F 256/8=32页
C2的 A2 A1 A0 可以组成8个地址,所以可以使用8个C02
C4 512个字节,内地址都是0-0xFF 256个,所以要占用A0等,A0这时也叫P,
控制字1 0 1 0 A2 A1 P R/W,P=0或1 相当于256*2=512字节
C8:P占用了 A1 A0 组成4个块= 4*256,C16 P占用了A2 A1 A0 8个块= 8*256
每个块地址是0-FF 8个FF
C4 C8 C16 ,页写一次都是可以写16个字节,页地址为 0x00 0x10 0x20...F0, 间隔0x10
24C32/64:32 字节 / 页,地址是16位地址,发送地址高低位 在发数据 ,页首间隔 0x20
可通过A2A1A0 挂8个,
- AT24C3232Kbit ÷8 = 4096Byte 地址范围:
0x0000 ~ 0x0FFF(12 位有效地址),128 页 ×32Byte - AT24C6464Kbit ÷8 = 8192Byte 地址范围:
0x0000 ~ 0x1FFF(13 位有效地址),256 页 ×32Byte 横向对比速记
- 24C02:8 字节 / 页,页首间隔 0x08
- 24C04/08/16:16 字节 / 页,页首间隔 0x10
- 24C32/64:32 字节 / 页,页首间隔 0x20