I2C
I2C(内置集成电路)总线是由 Philips 公司开发的两线式串行总线,产生于 20 世纪 80 年代,用于连接微控制器及其外围设备。I2C 总线简单而有效,占用的 PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。I2C 总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。
组成 I2C 总线的两个信号为数据线 SDA 和时钟 SCL。为了避免总线信号的混乱,要求各设备连接到总线的输出端必须是开漏输出或集电极开路输出的结构。总线空闲时,上拉电阻使 SDA 和 SCL 线都保持高电平。根据开漏输出或集电极开路输出信号的“线与”逻辑,I2C总线上任意器件输出低电平都会使相应总线上的信号线变低
“线与”逻辑指的是两个或两个以上的输出直接互连就可以实现“与”的逻辑功能,
只有输出端是开漏(对于 CMOS 器件)输出或集电极开路(对于 TTL 器件)输出时才
满足此条件。工程师一般以“OC 门”简称开漏或集电极开路
I2C 设备上的串行数据线 SDA 接口电路是双向的,输出电路用于向总线上发送数据,输
入电路用于接收总线上的数据。同样地,串行时钟线 SCL 也是双向的,作为控制总线数据
传送的主机要通过 SCL 输出电路发送时钟信号,并检测总线上 SCL 上的电平以决定什么时
候发下一个时钟脉冲电平;作为接收主机命令的从设备需按总线上 SCL 的信号发送或接收
SDA 上的信号,它也可以向 SCL 线发出低电平信号以延长总线时钟信号周期
当 SCL 稳定在高电平时,SDA 由高到低的变化将产生一个开始位,而由低到高的变化
则产生一个停止位,如下图所示。
开始位和停止位都由 I2C 主设备产生。在选择从设备时,如果从设备采用 7 位地址,则主设备在发起传输过程前,需先发送 1 字节的地址信息,前 7 位为设备地址,最后 1 位为读写标志。之后,每次传输的数据也是 1 字节,从 MSB 开始传输。
每个字节传完后,在 SCL的第 9 个上升沿到来之前,接收方应该发出 1 个 ACK 位。SCL 上的时钟脉冲由 I2C 主控方发出,在第 8 个时钟周期之后,主控方应该释放 SDA,I2C 总线的时序如下图所示。
上文摘抄自《Linux设备驱动开发详解:基于最新的Linux 4.0内核》