这一章在干嘛?

I2C 实验:I2C 协议(起始/停止/应答)、AT24C02 EEPROM 读写、STM32 HAL_I2C_Master_Transmit / Master_Receive。理解后所有 I2C 传感器一通百通。

26.1 IIC 及 24C02 介绍

26.2 硬件设计

26.3 程序设计

26.4 下载验证

26.1 IIC 及 24C02 介绍

26.1.1 I2C 协议

I2C(Inter-Integrated Circuit):两线制同步串行总线。

信号方向作用
SCL主机→从机时钟
SDA双向数据

原书图 26.1.1.1:I2C 总线拓扑原书图 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 时序图原书图 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 / SDAI2C 总线
WP写保护(高电平禁止写)

26.2 硬件设计

PB8 / PB9 作 I2C1_SCL/SDA;外接 AT24C02。

原书图 26.2.1:I2C 与 24C02 硬件连接原书图 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 后重启开发板,再读出来 → 一致。