这一章在干嘛? I2C 实验:I2C 协议(起始/停止/应答)、AT24C02 EEPROM 读写、STM32 HAL_I2C_Master_Transmit / Master_Receive。理解后所有 I2C 传感器一通百通。
26.1 IIC 及 24C02 介绍
26.1.1 I2C 协议
I2C(Inter-Integrated Circuit):两线制同步串行总线。
| 信号 | 方向 | 作用 |
| SCL | 主机→从机 | 时钟 |
| SDA | 双向 | 数据 |
原书图 26.1.1.1:I2C 总线拓扑
关键时序:
- 起始信号 S:SCL 高时 SDA 下降沿;
- 停止信号 P:SCL 高时 SDA 上升沿;
- 应答 ACK:接收方第 9 个时钟拉低 SDA;
- 数据有效性:SCL 高时 SDA 必须稳定。
帧格式:S | 地址(7bit) + R/W | ACK | 数据 | ACK | ... | P
原书图 26.1.1.2:I2C 时序图
地址位数:7 位或 10 位,常用 7 位。I2C 总线最多挂 127 个从机(地址 0x00 保留)。
26.1.2 AT24C02
AT24C02 是 2 Kbit(256 字节)EEPROM,I2C 接口,地址 0x50。
| 引脚 | 作用 |
| A0/A1/A2 | 从机地址线(决定地址低 3 位) |
| SCL / SDA | I2C 总线 |
| WP | 写保护(高电平禁止写) |
26.2 硬件设计
PB8 / PB9 作 I2C1_SCL/SDA;外接 AT24C02。
原书图 26.2.1:I2C 与 24C02 硬件连接
26.3 程序设计
26.3.1 CubeMX 配置
- I2C1 → Standard Mode 100 kHz 或 Fast Mode 400 kHz
- SCL/SDA 设为开漏上拉(I2C 必须)
26.3.2 关键代码
uint8_t buf[256];
HAL_I2C_Mem_Read(&hi2c1, 0xA0, 0x00, I2C_MEMADD_SIZE_8BIT, buf, len, 100);
HAL_I2C_Mem_Write(&hi2c1, 0xA0, 0x00, I2C_MEMADD_SIZE_8BIT, buf, len, 100);
地址计算:24C02 地址 = 0x50 << 1 = 0xA0(最低位 R/W)。
26.3.3 连续读多字节
AT24C02 跨页读自动翻页,但写一页(8 字节)需等 5 ms 写入完成再写下一页。
I2C 读写常见问题:SDA 一直低 = 某从机把 SDA 拉住了,硬件复位一下解决;上拉电阻 4.7kΩ 必须。
26.4 下载验证
写入字符串到 24C02 后重启开发板,再读出来 → 一致。
🧠 小测验I2C 总线最少需要几根线?
2 根(SCL + SDA)。
I2C 起始信号的时序?
SCL 高电平时 SDA 出现下降沿。
AT24C02 的 I2C 地址是多少?
0x50(HAL 中用 0xA0 写入,0xA1 读取)。