I2C 总线介绍
I2C(Inter-Integrated Circuit,集成电路总线) 是一种串行通信协议,广泛应用于嵌入式系统和电子设备中,用于在微控制器与外围设备(如传感器、EEPROM、显示屏等)之间进行低速数据通信。I2C 总线因其简单、高效和灵活的特点,成为许多设备的标配通信接口。
1. I2C 的原理
(1) 双线通信
I2C 总线由两根信号线组成:
- SCL(Serial Clock Line,时钟线):由主设备(Master)产生时钟信号,用于同步数据传输。
- SDA(Serial Data Line,数据线):用于主设备与从设备(Slave)之间的双向数据传输。
(2) 主从结构
- 主设备(Master):控制总线的时钟和启动/停止数据传输。
- 从设备(Slave):响应主设备的请求。
(3) 多设备通信
I2C 总线支持多个主设备和从设备连接到同一条总线,通过地址区分不同的从设备。
(4) 硬件连接
- I2C 总线通过上拉电阻(通常为 4.7 kΩ)连接到电源,确保空闲状态下 SDA 和 SCL 线为高电平。
- 所有设备的 SDA 和 SCL 线分别连接到同一条总线。
2. I2C 的特性
(1) 双向通信
- 数据线 SDA 支持双向数据传输,主设备和从设备都可以发送和接收数据。
(2) 多主设备
- I2C 总线支持多个主设备同时工作,但需要总线仲裁机制避免冲突。
(3) 速度支持
- 标准模式:<= 100 kbps。
- 快速模式:<= 400 kbps。
- 高速模式:<= 3.4 Mbps。
- 超快速模式:<= 5 Mbps(部分设备支持)。
(4) 硬件简单
- 只需两根信号线,降低了电路设计的复杂性。
(5) 地址区分
- 每个从设备都有唯一的 7 位或 10 位地址,主设备通过地址选择从设备。
3. I2C 的协议
(1) 起始条件(Start Condition)
- 主设备通过拉低 SDA 线,然后在 SCL 线拉低时发送起始信号。
(2) 地址传输
- 主设备发送 7 位或 10 位从设备地址,后面跟随读/写标志位(R/W):
- 0:写操作。
- 1:读操作。
(3) 数据传输
- 在 SCL 的高电平期间,SDA 上的数据必须保持稳定。
- 每个字节(8 位)传输后,接收方需要发送一个应答位(ACK)或非应答位(NACK)。
(4) 应答信号(ACK/NACK)
- ACK(应答):接收方在第 9 个时钟周期拉低 SDA 线,表示成功接收数据。
- NACK(非应答):接收方在第 9 个时钟周期保持 SDA 线高电平,表示接收失败或不需要更多数据。
(5) 停止条件(Stop Condition)
- 主设备在拉高 SCL 线后,再拉高 SDA 线,发送停止信号。
4. 配置与使用
(1) 配置 I2C 外设
在 STM32 微控制器中,I2C 外设的配置通常基于 HAL 库。
使能 I2C 外设时钟
__HAL_RCC_I2C1_CLK_ENABLE(); // 使能 I2C1 外设时钟
配置 GPIO 为 I2C 功能
GPIO_InitTypeDef GPIO_InitStruct = {
0};
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; // I2C1 的 SCL 和 SDA 引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 开漏输出
GPIO_InitStruct