I2C
概述
Linux I2C 编程接口支持主机端(Master)和从机端(Slave)之间的总线交互。编程接口围绕两种驱动程序和两种设备结构构建。
I2C“适配器驱动程序”将控制器硬件抽象化。它通常绑定到一个物理设备(可能是 PCI 设备或 platform_device)并通过 struct i2c_adapter 表示每个 I2C 总线段。连接在每条 I2C 总线段上的 I2C 设备通过 struct i2c_client 表示,并绑定到一个 struct i2c_driver,该驱动程序遵循标准的 Linux 驱动模型。内核提供了各种函数以执行标准的 I2C 协议操作。
SMBus(System Management Bus)是 I2C 的一个同级协议。大多数 SMBus 系统也兼容 I2C。相比 I2C,SMBus 对电气特性要求更为严格,并标准化了一些协议消息和使用习惯。通常支持 I2C 的控制器也能执行大多数 SMBus 操作,但 SMBus 控制器未必支持所有 I2C 协议选项。Linux 内核提供了执行多种 SMBus 协议操作的接口,可以使用基础的 I2C 操作,也可以通过向不支持这些 I2C 操作的 i2c_adapter 发出 SMBus 命令。
Linux 内核中的 I2C 驱动框架如下:
关键特性
- 仅支持 HOST 模式
- 支持标准模式(100Kbit/s)和快速模式(400Kbit/s)
- 符合 Philips I2C 总线规范 版本
- 支持 7-bit 和 10-bit 寻址模式
- 支持 Start / Restart / Stop
- 16 字节 FIFO
- 单次传输长度 65535 字节
- 模块启用/禁用功能
- 可编程 SCL 时钟频率
- 8-bit 位宽数据访问
- 自动触发 Clock Stretching
运行原理
I2C 是一种双线双向串行总线,通过 SDA 和 SCL 两根线进行设备间的高效数据交换,适用于多个设备间的短距离通信。
- SDA 和 SCL 通过上拉电阻连接至正电源电压
- 当总线空闲时,两条线路均为高电平
- 连接到总线的设备输出端必须为 open-drain 或 open-collector,实现“线与”功能
I2C 支持以下速率:
- 标准模式:最高 100kbit/s
- 快速模式:最高 400kbit/s
- 高速模式:最高 3.4Mbit/s