I2C学习
详情学习
12. I2C通讯 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 (embedfire.com)
I2C总线协议详解(特点、通信过程、典型I2C时序)-CSDN博客
彻底搞懂I2C总线(一)什么是I2C?什么是总线?什么是I2C总线?什么是I2C标准?I2C总线特点?I2C标准发展历史? - 德力威尔王术平 - 博客园 (cnblogs.com)
彻底搞懂I2C总线(2)标准模式_快速模式_快速增强模式下的I2C通信协议 - 德力威尔王术平 - 博客园 (cnblogs.com)
彻底搞懂I2C总线(3)Ultra Fast-mode超快速模式下的I2C通信协议 - 德力威尔王术平 - 博客园 (c
nblogs.com)
彻底搞懂I2C总线(4)I2C总线的其他用途 - 德力威尔王术平 - 博客园 (cnblogs.com)
彻底搞懂IIC总线(5)I2C总线传输速度详解 - 德力威尔王术平 - 博客园 (cnblogs.com)
I2C tools
I2C tool 是一个开源工具,需自行下载进行交叉编译,代码下载地址:
https://www.kernel.org/pub/software/utils/i2c-tools/
或者
<git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git>
编译后会生成 i2cdetect,i2cdump,i2cset,i2cget 等工具,可以直接在命令行上调试使用:
- i2cdetect – 用来列举 I2C bus 和上面所有的设备
- i2cdump – 显示 i2c 设备所有 register 的值
- i2cget – 读取 i2c 设备某个 register 的值
- i2cset – 写入 i2c 设备某个 register 的值
I2C tool 都是开源的,编译与使用请参考里面的 README 与帮助说明。
问题
i2c总线中scl和sda两条线的作用以及区别
在 I2C 总线(Inter-Integrated Circuit)中,SCL 和 SDA 是两条核心信号线,分别承担不同的功能。它们在设备之间的通信中起着至关重要的作用。
1. SCL (Serial Clock Line) — 时钟线
- 作用:SCL 线用于提供时钟信号,控制数据的传输速率。在 I2C 通信中,主设备通过 SCL 向从设备发送时钟脉冲,确保数据在正确的时间被读取或写入。
- 工作原理:每次时钟脉冲同步了 SDA 线上的数据位传输,主设备控制时钟线的频率和周期。
- 方向:时钟信号是由主设备(Master)发出的,所有设备都通过 SCL 来同步数据传输。
2. SDA (Serial Data Line) — 数据线
- 作用:SDA 线用于传输实际的数据。它承载从主设备到从设备或从设备到主设备的数据。
- 工作原理:数据在每一个时钟脉冲周期内通过 SDA 线传输。数据是按位传输的,每个时钟周期传输一个比特,SDA 的电平(高或低)表示数据的状态。
- 方向:SDA 线是双向的,可以由主设备或从设备来驱动,具体由当前的通信角色决定。
SCL 和 SDA 的区别
-
功能区别:
- SCL:负责传输时钟信号,控制数据传输的时序。
- SDA:负责传输数据,数据的实际值在 SDA 上体现。
-
方向区别:
- SCL:时钟信号是由主设备产生的,始终由主设备驱动。
- SDA:数据线是双向的,主设备和从设备都可以在不同时间驱动 SDA 线。
总结
- SCL 是时钟信号线,控制数据的传输速率和时序,由主设备控制。
- SDA 是数据传输线,实际传输数据,主设备和从设备都可以在不同时间控制。
为什么连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 ?
在 I2C 总线中,连接到同一总线上的设备数量是受到 总线最大电容(通常为 400 pF)的限制的,这个限制是由 I2C 总线的物理特性和信号传输的速度要求决定的。
1. 电容对信号传输的影响
- 电容 会影响信号的 上升时间(即信号从低电平变为高电平的速度)和 下降时间(即信号从高电平变为低电平的速度)。
- 当 I2C 总线上的设备增多时,每个设备的输入引脚都会增加电容,这些电容在总线上形成了一个 总电容。总电容的增大会导致信号的上升和下降时间变长,因为电容需要更多时间来充放电。
2. 影响 I2C 总线的时序和速率
- 时序要求:I2C 协议有严格的时序要求,特别是信号的上升和下降时间必须在一个合理的范围内,以确保数据能够正确地传输。过高的电容会使得总线的信号上升和下降速度过慢,导致时序错误或数据传输失败。
- 最大电容限制:I2C 总线规定了最大总线电容为 400 pF。这个限制是为了确保总线上的信号能够在规定的时序要求下正确传输。如果总线电容超过 400 pF,信号的上升和下降时间可能无法满足规定的要求,从而导致通信错误或数据丢失。
3. 设备数量与电容的关系
- 每个 I2C 设备都有一定的 输入电容,通常在几十皮法(pF)左右。随着设备数量的增加,总线的 总电容 会逐渐增大。如果连接的设备超过一定数量,电容将变得过大,从而影响信号的质量和时序。
- 除了设备本身的电容,连接线、PCB 布线等也会增加总线电容。因此,I2C 总线的最大连接设备数是由 电容限制 和 信号质量共同决定的。
4. 如何解决电容问题
- 降低电容:可以通过减少设备数量、优化 PCB 布线、使用更短的连接线等方法来降低总线电容。
- 降低通信速率:如果设备数量较多,信号传输速度可以降低,以便在较慢的速率下,信号传输时间长一些,有更多时间去充放电。
- 使用缓冲器或扩展器:可以使用 I2C 总线扩展器(如驱动器、缓冲器)来增加总线的驱动能力,从而减少因电容过大而导致的信号衰减。
总结:
I2C 总线的最大电容限制为 400 pF,主要是为了保证信号传输的质量和时序的准确性。随着设备数量的增加,每个设备引入的电容会增加总线的电容,超过一定值后,信号的上升和下降时间会受到影响,导致通信错误。因此,为了确保 I2C 总线的可靠性,最大电容限制是 400 pF。
I2C上拉电阻
高电平简单理解为高电压,串行电路根据U=IR,上拉电阻能够把总线拉成高电平(自己理解)。
I2C总线为什么要接上拉电阻_24c02芯片为什么要接电阻-CSDN博客
SDA信号线的数据有效性
SDA是串行数据线,此处的“数据”是“数据的传输地址、数据的处理命令、数据的真正内容”的统称。有些电路中的“数据”专指“数据的真正内容”。
在串行时钟SCL线的高电平期间,SDA线的“高电平”或者“低电平”状态必须保持稳定,此时SDA线上稳定的“高电平”或“低电平”就是有效数据“1”或者“0”。SDA线的“高电平”或者“低电平”状态地改变,只能在SCL线的低电平期间进行。串行时钟SCL线每产生一个高电平脉冲,串行数据SDA线就传输一位有效数据。SDA线在SCL线的低电平期间准备数据(改变电平),SDA数据准备完毕(电平改变结束并保持稳定)后,SCL线由低电平变为高电平并保持稳定,此时SDA线的稳定电平就是有效数据。
时钟同步
在空闲总线时,两个主机可以同时启动传输,必须有一种方法来决定由哪一个主机来控制总线并完成传输。这是通过时钟同步和仲裁两个步骤来完成的。在一主多从的系统中,不需要时钟同步和仲裁。
参考图1-24,使用设备的SCL接口和SCL总线之间的“线与”连接来执行时钟同步。主机一的SCL接口一旦检测到SCL总线上由高电平到低电平的转换时,主机一便拉低自己的SCL,并开始倒计数应有的SCL低电平保持时间,直到应有的低电平时间结束,便把SCL时钟拉到高电平状态。如果另一个主机二的SCL时钟仍然处于低电平周期内,则主机一的SCL时钟由低到高的转换不会改变SCL总线为低电平的状态,则主机一的SCL时钟进入高电平等待状态。因此,SCL总线被具有最长低电平周期的主机保持在低电平。
当所有相关的主机都已完成其低电平周期的计数时,SCL时钟总线被释放并变为高电平。主机SCL接口和SCL总线的状态之间保持一致,都为高电平。所有主机开始计算它们的高电平周期。第一个完成高电平周期的主机再次将SCL线拉低。
这样,就产生了同步的SCL总线时钟,其低周期由具有最长时钟低周期的主机确定,其高周期由具有最短时钟高周期的主机确定。
总线仲裁
设备的SDA接口线每次输出电平后,会立即回读SDA总线电平,用来判断自己的输出是否与总线一致。SCL线和SDA一样,也有这种回读判读机制。
仲裁协议用于多主机的系统中,单主机系统不需要仲裁。仲裁程序发生在主机之间,从机不涉及仲裁。只有当总线空闲时,主机才可以启动传输。两个主机同时发起启动后,总线需要对这两个主机进行仲裁,以确定最终由哪个主机控制总线并完成其传输。
仲裁由SCL线和SDA线一起配合来完成的,其分工如下:
SCL线负责时钟同步(参考图1-24):两个主机在空闲状态时,同时发起启动,然后各自根据自己的时序要求拉低SCL总线输出低电平,释放SCL总线输出高电平,根据前面章节介绍的SCK时钟同步机制实现时钟同步。
SDA线负责数据仲裁(参考图1-25):仲裁是在SDA线上一位一位地进行的。在每一位传输期间,当SCL为高电平时,每个主机各自判断自己SDA线输出的电平是否与SDA总线电平一致(回读判读机制),如果某主机发现输出电平和回读电平不一致,则该主机仲裁失败,失去对总线的控制权,随即关闭自己SDA输出驱动器,另一个主机赢得仲裁获取对总线的控制权,继续完成它的传输事务。这种仲裁过程可能需要进行很多位。
在仲裁过程中,赢得仲裁的主机不会丢失任何信息,仲裁失败的主机可以继续产生时钟脉冲,直到其仲裁失败的字节结束,并且可以在总线空闲时重新发起仲裁。
如果一个主机也具有从机的功能,并且在寻址阶段仲裁失败,那么获胜的主机可能正在尝试寻址它。因此,失败的主机必须立即切换到其从机模式。
根据连接到总线的主机数量,以上的仲裁方式也适合更多主机的系统。
由于对I2C总线的控制完全由参与竞争的主机发送的地址和数据决定,所以总线上没有中央控制器,也没有任何优先级顺序。
当一个主机发送重启或停止信号时,而另一个主机仍在发送数据时,如果仲裁程序仍在进行中,则会出现未定义(异常)的状态。换句话说,以下组合会导致异常情况:
主机1发送重启信号,主机2发送数据位(所以重启前一定要判断重启建立时间tSU;STA)。
主机1发送停止信号,主机2发送数据位。
主机1发送重启信号,主机2发送停止信号。
时钟拉伸(Clock stretching)
在传输一个字节时,从机可能能够快速接收数据字节,但需要更多时间来存储接收到的字节或准备要传输的字节,如果基于以上原因无法立即进行下一个字节的传输时,那么从机在接收完一个字节并应答后,可以将SCL线(主机输出)的低电平继续拉低并保持,以强制主机进入等待状态,直到从机做好了传输下一个字节的准备。
时钟拉伸通过将SCL线保持在低电平来暂停传输,直到SCL总线路再次被释放为高电平,这样可以实现高低速器件兼容。时钟拉伸是可选的,事实上,大多数从机设备不具有SCL驱动程序,因而具有拉伸时钟的功能。
参考
13. I2C通讯 — [野火]嵌入式Linux基础与应用开发实战指南——基于i.MX6ULL开发板 文档 (embedfire.com)