I2C 和 SMBus 简介¶
I²C (发音:I squared C,在内核文档中写作 I2C) 是飞利浦公司开发的协议。它是一种双线协议,具有可变速度(通常高达 400 kHz,高速模式高达 5 MHz)。它提供了一种廉价的总线,用于连接许多具有低频或低带宽通信需求的设备。I2C 广泛用于嵌入式系统。有些系统使用不符合品牌要求的变体,因此不宣传为 I2C,而是使用不同的名称,例如 TWI(双线接口)、IIC。
最新的官方 I2C 规范是由 NXP Semiconductors 发布的“I²C 总线规范和用户手册” (UM10204),截至本文撰写时为第 7 版。
SMBus(系统管理总线)基于 I2C 协议,并且在很大程度上是 I2C 协议和信令的子集。许多 I2C 设备都可以在 SMBus 上工作,但某些 SMBus 协议添加了超出实现 I2C 品牌所需的语义。现代 PC 主板依赖于 SMBus。通过 SMBus 连接的最常见的设备是使用 I2C EEPROM 配置的 RAM 模块和硬件监控芯片。
由于 SMBus 在很大程度上是通用 I2C 总线的子集,因此我们可以在许多 I2C 系统上使用其协议。但是,有些系统不符合 SMBus 和 I2C 电气约束;还有一些系统无法实现所有常见的 SMBus 协议语义或消息。
术语¶
I2C 总线连接一个或多个控制器芯片和一个或多个目标芯片。
简单的 I2C 总线¶
控制器芯片是启动与目标通信的节点。在 Linux 内核实现中,它也称为“适配器”或“总线”。控制器驱动程序通常位于 drivers/i2c/busses/
子目录中。
算法包含可用于实现整个 I2C 控制器类别的通用代码。每个特定的控制器驱动程序都依赖于 drivers/i2c/algos/
子目录中的算法驱动程序,或者包含其自身的实现。
目标芯片是一个节点,当被控制器寻址时,它会响应通信。在 Linux 内核实现中,它也称为“客户端”。虽然目标通常是单独的外部芯片,但 Linux 也可以充当目标(需要硬件支持),并响应总线上的另一个控制器。这称为本地目标。相反,外部芯片称为远程目标。
目标驱动程序保存在特定于它们提供的功能的目录中,例如 drivers/gpio/
用于 GPIO 扩展器, drivers/media/i2c/
用于视频相关芯片。
对于上图中的示例配置,您需要一个 I2C 控制器的驱动程序和 I2C 目标的驱动程序。通常每个目标一个驱动程序。
同义词¶
如上所述,Linux I2C 实现历史上使用术语“适配器”表示控制器,使用“客户端”表示目标。许多数据结构在其名称中都包含这些同义词。因此,在讨论实现细节时,您也应该了解这些术语。但是,首选官方措辞。
过时的术语¶
在早期的 I2C 规范中,控制器被称为“主设备”,目标被称为“从设备”。这些术语已在规范的 v7 版本中被废弃,并且 Linux 内核行为准则也不鼓励使用它们。您可能仍然会在未更新的文档引用中找到它们。但是,总的趋势是使用包容性术语:控制器和目标。替换 Linux 内核中旧术语的工作正在进行中。