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