I2C协议

I2C协议_第1张图片

I2C协议介绍

协议基本特点

  • 双线制串行总线: I2C 只使用两条双向线进行通信,分别是串行数据线 SDA (Serial Data Line) 和串行时钟线 SCL (Serial Clock Line)。这大大简化了硬件连接,节省了引脚。

 

  • 半双工通信: 数据在同一时间只能在一个方向上传输。

 

  • 多主多从: I2C 总线上可以连接多个主设备和多个从设备。任何一个主设备都可以发起数据传输,但总线上同时只能有一个主设备处于活动状态。

 

  • 开漏输出: SDA 和 SCL 线对应的引脚都采用开漏(Open-Drain)输出结构,这意味着它们不能主动输出高电平,需要通过外部上拉电阻来实现高电平。这使得多个设备可以连接到同一条总线上,并通过线与(wired-AND)的方式实现通信。

 

  • 寻址机制: 每个从设备在 I2C 总线上都有一个唯一的地址(7 位或 10 位),主设备通过这个地址来选择要通信的从设备。

 

  • 传输速率: I2C 支持多种传输速率,常见的有:标准模式:100 kbit/s  快速模式:400 kbit/s  高速模式:3.4 Mbit/s

 

  • ACK/NACK 机制: 每传输一个字节后,接收方都会发送一个应答信号(ACK 或 NACK),以确认数据是否成功接收,提高了通信的可靠性。

 

I2C协议的工作原理

主设备扮演的角色

 

  • 时钟源: 只有主设备才能生成时钟信号 SCL。所有的从设备都必须同步到这个由主设备发出的时钟信号。

 

  • 通信发起者: 主设备是总线上唯一能够发起通信的设备。它通过发出起始信号来启动数据传输。

 

  • 总线控制权: 在一个通信会话中,主设备拥有总线的控制权,决定何时传输数据、传输哪个从设备的数据,以及何时结束通信(通过发出停止信号重复起始信号)。

 

 

I2C 通信主要涉及以下几个步骤:

  1. 起始信号 (START Condition): 主设备通过将 SDA 线从高电平拉低到低电平,同时 SCL 保持高电平,来发出起始信号,表示通信开始。

  2. 发送从设备地址和读写位: 主设备发送要通信的从设备的 7 位或 10 位地址,以及一个读写位(R/W#)。读写位为 0 表示写操作,为 1 表示读操作。

  3. 从设备应答 (ACK): 如果从设备识别到自己的地址,它会发送一个 ACK 信号(将 SDA 线拉低),表示已准备好进行通信。

  4. 数据传输:

    • 写操作: 主设备将数据字节逐个发送给从设备。每发送一个字节后,从设备都会发送一个 ACK 信号。

    • 读操作: 从设备将数据字节逐个发送给主设备。每接收一个字节后,主设备都会发送一个 ACK 信号(表示继续接收),或者发送一个 NACK 信号(表示不再接收)。

  5. 停止信号 (STOP Condition): 主设备通过将 SDA 线从低电平拉高到高电平,同时 SCL 保持高电平,来发出停止信号,表示通信结束,并释放总线。

I2C协议_第2张图片

 

I2C协议工作过程SDA线和SCL线的电平变化

I2C 协议的通信过程就像一场精心编排的舞蹈,SDA(串行数据线)和 SCL(串行时钟线)的电平变化严格遵循特定的时序,以确保数据的准确传输和总线控制。

I2C协议_第3张图片

1. 总线空闲状态 

  • SCL: 高电平

  • SDA: 高电平

解释:没有任何设备进行通信时,I2C 总线通过外部上拉电阻将 SDA 和 SCL 线拉到高电平。这是总线的默认状态,表示总线可用。这主要是因为 I2C 协议的开漏输出特性和上拉电阻的作用:

  • 开漏输出: I2C 设备(无论是主设备还是从设备)的 SDA 和 SCL 引脚都是开漏输出。这意味着它们只能将线拉到低电平(接地),而不能主动输出高电平。

 

  • 上拉电阻: 为了确保在没有设备将线拉低时,SDA 和 SCL 能够回到高电平,这两条线上都必须连接外部的上拉电阻。这些电阻将总线线缆连接到电源电压(VCC)。

 

2. 起始信号 (START Condition)

  • SCL: 保持高电平

  • SDA: 从高电平变为低电平

解释: 主设备想要开始通信时,会在 SCL 保持高电平的同时,将 SDA 线从高电平拉低到低电平。这个独特的下降沿是所有从设备识别通信开始的标志。

 

 

3. 地址&读写控制位发送阶段 (Address Transmission)

  • SCL: 周期性地在高电平和低电平之间切换(由主设备产生时钟)

  • SDA:
            在 SCL 处于低电平时改变电平(低电平的时候可以改变电平,具体是否要改变电平取决于当前电平状态以及下一位想要要发送的电平电位高低,如果是0(当前电位)->1(下一位电位)/1->0,则需要在SCL为低电平的时候改变SDA的电平;如果是0->0或1->1,则不需要在SCL为低电平的时候改变SDA的电平)。
            在 SCL 处于高电平时保持稳定(高电平的时候不能改变电平)。

 

主设备会发送 7 位或 10 位的从设备地址,以及一位读写控制位(R/W#)。

 

数据有效性: I2C 协议规定,在 SCL 为高电平期间,SDA 上的数据必须保持稳定。这意味着,当 SCL 处于高电平阶段时,SDA 的电平(高或低)代表一个数据位。

 

数据改变时机: SDA 的电平只能在 SCL 处于低电平期间发生改变。这样可以避免 SDA 在 SCL 高电平时变化被误判为起始或停止信号。

 

4. 应答/非应答 (ACK/NACK)

  • SCL: 主设备在第 9 个时钟周期产生一个时钟脉冲。

  • SDA:

    • 应答 (ACK): 如果从设备成功接收了地址或数据,它会在第 9 个时钟脉冲的低电平阶段将 SDA 线拉低,并在高电平阶段保持低电平。主设备检测到 SDA 为低电平,表示收到应答。

    • 非应答 (NACK): 如果从设备没有接收到(或无法应答,或者数据传输完成)它会释放 SDA 线(让其通过上拉电阻保持高电平)。主设备检测到 SDA 为高电平,表示收到非应答。

解释: ACK/NACK 机制用于确认数据或地址是否被成功接收。这是一个至关重要的步骤,确保了数据传输的可靠性。

 

5. 数据传输阶段 (Data Transmission)

  • SCL: 周期性地在高电平和低电平之间切换(由主设备产生)

  • SDA: 在 SCL 处于低电平时可以改变电平在 SCL 处于高电平时必须保持稳定

解释:

  • 与地址传输类似,每个数据字节(8 位)也是在 SCL 的时钟脉冲下传输的。

  • 写操作: 主设备在 SCL 为低电平时设置 SDA 的电平,在 SCL 为高电平时让从设备读取。

  • 读操作: 主设备产生时钟,从设备在 SCL 为低电平时设置 SDA 的电平,在 SCL 为高电平时让主设备读取。

  • 每个 8 位数据字节之后,都会有一个 1 位的 ACK/NACK 信号

 

6. 停止信号 (STOP Condition)

  • SCL: 保持高电平

  • SDA: 从低电平变为高电平

解释: 主设备完成通信后,会在 SCL 保持高电平的同时,将 SDA 线从低电平拉高到高电平。这个独特的上升沿标志着当前通信会话的结束,并释放总线,使其恢复到空闲状态。

 

 

重点!!!对I2C协议的一些感悟(先看)

主设备与从设备的交互模式

  • 主设备开启通信: 不论主设备是想向从设备发送数据(写操作)还是想从从设备读取数据(读操作),都必须由主设备来发出起始信号 (START Condition) 从而开启 I2C 通信。主设备是通信的发起者和控制者。

 

  • 从设备不能主动开启通信: 从设备在 I2C 总线上是被动的。它们持续监听总线上的活动,等待主设备发出起始信号并广播它们的地址。从设备无法主动发起与主设备或其他从设备的通信。它们只有在自己的地址被主设备呼叫到之后,才会参与到后续的数据传输中。

 

  • 从设备只能被动回应: 从设备的角色就是被动回应主设备。

    • 当主设备呼叫其地址并指示为写操作时,从设备就准备接收数据并发送 ACK。

    • 当主设备呼叫其地址并指示为读操作时,从设备就准备发送数据并等待主设备的 ACK/NACK。

 

数据传输完成的判断与停止信号

  • 主设备向从设备发送数据(写操作): 主设备在将所有数据发送给从设备后,会等待从设备返回最后一个数据字节的 ACK 信号。一旦收到这个 ACK,主设备就会立即发送停止信号 (STOP Condition),结束本次通信,并释放总线。

 

  • 主设备从从设备接收数据(读操作): 当主设备从从设备接收数据时,它每接收一个字节,通常会返回一个 ACK 信号,表示希望继续接收下一个字节。然而,当主设备接收到它所需要的最后一个数据字节时,它不会发送 ACK,而是发送一个 NACK (Non-Acknowledge) 信号。这个 NACK 明确告诉从设备:“我(主设备)不再需要更多数据了,请停止发送。” 在发送完这个 NACK 之后,主设备会立即发送停止信号,从而结束本次读取操作。

 

主设备和从设备形象的比喻

主设备:傲娇的女生

  • 她掌握主动权: 就像傲娇的女生决定什么时候理你、什么时候不理你一样,主设备决定何时开始 I2C 通信,何时结束,以及是发送数据(“她要告诉你什么”)还是接收数据(“要你告诉她什么”)。

  • 她发出指令: 她会直接告诉你(从设备)她想做什么,比如她想写数据,或者她想读数据。

  • 她期望回应: 她希望你(从设备)对她的每一个指令都有明确的回应(ACK),否则她就会不高兴(收到 NACK 后可能会终止通信)。

  • 她决定何时结束: 所有的对话都由她来发起和结束。当她觉得够了,就会直接说“不聊了”(发送停止信号)。

 

从设备:忠诚的“舔狗”

  • 永远被动等待: 它无法主动发起任何对话,只能默默地守候在总线上,等待主设备(“女神”)的召唤。

  • 随叫随到: 一旦主设备发出起始信号并呼叫到它的地址,无论何时何地,它都必须立即响应。

  • 言听计从: 主设备要求写数据,它就乖乖接收;主设备要求读数据,它就立刻准备好发送。

  • 及时应答: 每完成一步操作,它都要立刻给主设备一个明确的“好的,收到!”(ACK),生怕主设备不高兴。

  • 接收到 NACK 就知道止步: 如果主设备说“够了”(发送 NACK),它会立刻停止发送数据,并且知道这次互动要结束了。

 

 

 

你可能感兴趣的:(I2C,STM32)