I2C总线协议
I2C总线简介
该I2C总线由飞利浦(PHLIPS)公司推出作为一种串行传输介质,并主要用于连接微控制器及周边设备,并具备较少的接口数量、较为简单的控制手段以及较小的封装形式和较快的通信速度等优势
*I2C串行总线由两条双向信号线组成:一条是用于传输8位双向数据的SDA(Serial Data Line)信号线;另一条是负责传输时钟信号的SCL(Serial Clock Line)信号线。
*
每个连接到I2C总线上的设备均需通过唯一地址与主控制器进行通信;同时,在这种架构下;主控制器不仅可以作为发送端发送指令;也可以作为接收端处理来自其他设备的数据。
*
该协议定义了支持多设备共享同一总线的能力:当多个设备同时初始化时;通过冲突检测机制和仲裁逻辑可确保数据传输的安全性。
*
串行传输的速度在标准模式下可达100Kb/s;而快速模式可提升至400Kb/s;最高可达3.4Mb/s的高速模式。
*
I2C协议规定:在启动总线后第一个字节的高位7位即为从节点出发的信息编码;其中高位4位标识器件类型代码;中间3位用于设置片选引脚状态;最后一位则决定了操作类型:当此位为1时执行读操作;当此位为0时执行写操作。
从设备的地址由固定部分和用户自定义部分组成。
- 固定部分:四位数D7-D4是由制造过程就已经固定的值。指定器件类型
- 用户自定义部分:三位数D3-D1通常对应设备的引脚A0至A2三个端子。通过将这三个端子连接到不同的电平上即可构成一个三位数值型数据。区分相同类型的器件
I2C总线是否能支持在同一地址上挂载多个相同类型的器件?理论上是不建议这样设计的。然而,在实际应用中若需要实现这一功能,则需在硬件层面上进行特殊处理。具体而言,可以通过使用一个开关电路来控制SDA或SCL端口与总线的连接状态。
IIC总线的信号种类
- 开始信号(S):当SCL处于高阻态时,在SDA端产生一次单拍下降沿 transition ,这表示开始指令已被正确捕获;随后立即捕获输入数据。
- 结束信号(P):当SCL处于高阻态时,在SDA端产生一次单拍上升沿 transition ,这表示结束指令已被正确捕获;随后立即捕获输入停止计数器值。
- 响应确认(ACK):在接收方完成接收操作后,在下一个时钟周期内将输出一个有效有效的 low level pulse 来指示已成功捕获8 bit 数据。
**具体来说:
- 接收器检测到8位数据后,在第9个时钟周期内将 SD A 电平置低;
- 此过程即相当于接收方IC发送了一个特定的 low level pulse ;
- CPU接收到此响应脉冲之后:
- 如果判定系统应当继续执行后续操作,则会发送相应的 next instruction;
- 如果判定系统不应继续执行后续操作,则会暂停当前操作并进行相应检查;
- CPU若未接收到任何响应脉冲,则认为受控单元出现了故障。
I2C总线的主机与从机之间的通信机制

I2C arbitration on the total line
The total line may be connected to multiple devices, and there may be instances where two or more primary devices attempt to occupy the line simultaneously. This situation is referred to as total line competition. The I2C total line supports arbitration among multiple primary devices for SDA line contention. Its operation principle is as follows: when multiple primary devices attempt to use the same SDA line, if one sends a high-level signal while another sends a low-level signal, the device with an output level that does not match the current SDA line level will automatically deactivate its output stage. The arbitration process occurs on two levels. First, address bits are compared; if multiple primary devices seek communication with the same secondary device, data bits are then compared to ensure reliable arbitration. Since this mechanism utilizes existing I2C total line information for arbitration, it avoids data loss.
I2C总线的其他注意点
- 在发送数据时,在SCL处于高电平时必须维持SDA线上的恒定电平状态;只有当SCL变为低电平时才能允许SDA线上的电平发生变化,并且每次传输一个字节时高位应在前。
- 对于应答信号而言, 当ACK=0时表示成功接收该字节,表明从机已正确接收该数据;而当ACK=1时表示接收失败,此时应采取相应措施解决问题。
- 如果从机希望延迟下一个数据字节开始发送的时间,可以通过将SCL拉低并在其上维持低电平状态来迫使主机进入等待状态以确保后续操作顺利进行。
- 主机完成一次通信后若想继续占用总线执行下一次通信而又不想释放总线,就需要利用重启动信号Sr来进行切换操作;该信号不仅标志着前一次传输结束,同时也决定了下一次传输的具体起始位置与时间安排。
- 在发生总线冲突的情况下,按照"低电平优先"的原则将会把总线分配给先发送低电平信号的那一端设备以确保通信正常有序地进行下去。
- 在特殊情况下如果希望完全禁止所有I2C总线上的通信活动就可采用封锁机制来实现这一目标;具体操作方法就是在I2C总线上任何一个节点将其SCL引脚锁定在恒定低电平状态即可达到完全隔离的效果并防止任何新的通信请求被接受进入系统运行空间的可能性出现。
- SDA仲裁与SCL时钟同步处理过程并不具备严格的先后顺序而是可以同时并行地执行这一特点使得整个系统运行更加高效可靠且不易出现操作失误的风险发生情况发生概率大大降低从而保证了系统的稳定性和可靠性
