深入解析 IIC:嵌入式系统中最常用的通信协议

目录

引言

1. IIC简介

2. IIC 总线的电气特性

2.1 IIC电气特性

 2.2 开漏输出结构

2.3 为什么使用开漏输出

2.4 上拉电阻

2.4 电平标准

3. IIC总线的解析

3.1 IIC总线的寻址方式

3.2  IIC总线的起始信号

3.3  IIC总线的停止信号

3.4 IIC总线的应答信号

3.5 IIC总线的数据有效性

3.5 IIC总线的字节顺序

3.6 IIC总线的数据帧格式

4. IIC 通信流程

4.1 写操作流程

4.2 读操作流程

4.3 特殊的操作流程(ReStart)

 4.3.1 场景 1:写后读操作

4.3.2 场景 2:访问多个从设备


🌈你好呀!我是 程序猿

🌌 2025感谢你的陪伴与支持 ~

🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!


引言

       在嵌入式系统的广阔天地中,通信协议犹如连接各个组件的桥梁,而 IIC(Inter - Integrated Circuit)协议无疑是其中一座极为重要且应用广泛的桥梁。它以其简洁高效的设计,在众多嵌入式设备通信场景中发挥着关键作用。无论是传感器数据的采集,还是芯片间的协同工作,IIC 都无处不在。


1. IIC简介

        IIC通信协议,也称为I2C(Inter-Integrated Circuit),是一种简单、高效、多主多从的双向二线制同步串行的半双工总线,由Philips公司(现NXP)于1980年代开发,广泛应用于嵌入式系统中连接各种低速外围设备。主要用于近距离、低速的芯片(如传感器、存储器、显示屏等)之间的通信。

I2C协议采用两根双向的信号线进行通信:

  1. 串行数据线(SDA):用于传输数据的双向线路。
  2. 串行时钟线(SCL):由主设备产生,用于同步数据传输。

        这种协议支持多主多从架构,多主设备(多个微控制器或主控制器)和多从设备(外部设备)的连接。每个设备都有一个唯一的7位或10位地址,主设备通过地址选择需要通信的从设备进行数据传输。

I2C协议的优点包括简单、灵活、成本低廉,适合在资源有限的嵌入式系统中使用。

I2C总线外设结构

        SDA和SCL都是双向的,所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。


2. IIC 总线的电气特性

2.1 IIC电气特性

        I2C 总线上的 SDA 和 SCL 线均采用开漏输出结构。这意味着总线设备无法直接驱动线路为高电平,而是通过总线上外接的上拉电阻将线路拉高。当设备需要输出低电平时,通过将对应的引脚接地来实现。这种设计允许多个设备共享同一总线,并且在同一时刻只有一个设备能够拉低总线,避免了信号冲突。

 2.2 开漏输出结构

  • 开漏输出是一种只有下拉晶体管(通常是MOSFET或BJT)的输出结构,没有上拉晶体管。

  • 当设备需要输出低电平时,下拉晶体管导通,将信号线拉低到地(GND)。

  • 当设备需要输出高电平时,下拉晶体管关闭,信号线通过外部上拉电阻拉到高电平(VCC)。

2.3 为什么使用开漏输出

  • 多设备共享总线:I2C支持多主多从架构,多个设备可以共享同一组SDA和SCL线。开漏输出允许多个设备同时控制总线,而不会造成短路。

  • 电平兼容性:开漏输出可以适应不同的电源电压(VCC),只要上拉电阻连接到相应的VCC即可。

  • 总线仲裁:在多个主设备同时尝试控制总线时,开漏输出可以通过“线与”逻辑实现仲裁。如果一个设备输出低电平,总线就会被拉低,其他设备检测到总线被拉低后会停止发送数据。

2.4 上拉电阻

  • 外部上拉电阻是I2C总线正常工作的重要组成部分。

  • 它的作用是在没有设备拉低总线时,将总线拉到高电平。

  • 上拉电阻的阻值需要根据总线电容、通信速率和电源电压来选择。通常,阻值在4.7kΩ到10kΩ之间。

2.4 电平标准

        I2C 总线的电平标准与所连接的设备电源电压相关。常见的有 3.3V 和 5V 电平系统。在混合使用不同电平设备的系统中,需要注意电平转换问题,以确保通信的可靠性。

I2C总线物理拓扑图
I2C总线物理拓扑图

3. IIC总线的解析

3.1 IIC总线的寻址方式

在I2C(IIC)通信协议中,寻址是确定要发送或接收数据的目标设备的过程。以下是关于I2C寻址的关键点:

  1. 地址格式:

    • 每个I2C设备都有一个唯一的7位或10位地址。
    • 7位地址是最常见的,但有些设备支持10位地址,这取决于设备的制造商和规范要求。
  2. 地址类型

    • 写地址(写操作):主设备(通常是微控制器)向从设备发送数据。写地址的最低位为0。
    • 读地址(读操作):主设备从从设备接收数据。读地址的最低位为1。
  3. 地址传输

    • 在I2C通信的起始阶段,主设备通过SDA线发送目标设备的地址。
    • 主设备发送一个字节的数据,包括从设备的地址和读写位(最低位),告诉从设备是发送数据还是接收数据。
    • 如果设备支持10位地址,首先发送两个字节的扩展地址,然后再发送读写位。
  4. 地址确认

    • 每当主设备发送完设备地址和读写位后,接收设备会发送一个应答信号(ACK)来确认它被正确地寻址和准备好进行数据传输。
    • 如果没有设备响应(应答),或者设备拒绝通信,则没有应答(NACK)信号被发送,通信将中止或重新尝试。
  5. 多主设备冲突

    • I2C支持多主设备的连接,但是在多主模式下,会出现地址冲突的情况。
    • 主设备在发送地址后,会监视SDA线的状态,如果检测到其他主设备也在发送,则会停止发送,并等待总线空闲。

3.2  IIC总线的起始信号

        当 SCL 线为高电平时,SDA 线由高电平跳变为低电平,这个跳变信号被定义为 IIC 通信的起始信号。起始信号标志着一次 IIC 通信的开始,主机在发送起始信号后,开始传输后续的地址和数据。

开始信号

3.3  IIC总线的停止信号

        与起始信号相反,当 SCL 线为高电平时,SDA 线由低电平跳变为高电平,这个跳变信号即为停止信号。停止信号表示一次 IIC 通信的结束,主机在发送完所有数据后,会发送停止信号,通知从机通信已完成。

停止信号

        起始信号和停止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态(BUSY),在终止信号产生之后,总线就处于空闲状态(IDLE)。

3.4 IIC总线的应答信号

        在每传输一个字节数据后,接收方需要发送一个应答信号来告知发送方数据已成功接收。应答信号在 SCL 线的第 9 个时钟周期产生,若接收方将 SDA 线拉低,则表示应答成功(ACK);若 SDA 线保持高电平,则表示非应答(NACK)。发送方在接收到 NACK 信号后,通常会认为数据传输失败,可能会采取重发等措施。

应答--ACK                                                                                                       非应答--NACK

3.5 IIC总线的数据有效性

         在I2C总线上,数据的有效性是一个关键概念,它确保了通信的可靠性和正确性。I2C协议通过严格的时序规则来定义数据的有效性。

        在I2C总线上,数据(SDA线)的有效性是由时钟信号(SCL线)控制的。具体规则如下:

  • 数据在SCL高电平期间必须保持稳定

    • 当SCL线为高电平时,SDA线上的数据必须保持稳定,不能发生变化。

    • 只有在SCL线为低电平时,SDA线上的数据才允许发生变化。

  • 数据采样时机

    • 接收设备(无论是主设备还是从设备)会在SCL线的上升沿对SDA线上的数据进行采样。

    • 因此,发送设备必须确保在SCL上升沿到来之前,SDA线上的数据已经稳定。

3.5 IIC总线的字节顺序

        在I2C通信中,数据传输是以字节为单位进行的,每个字节中的位顺序通常是MSB优先。

示例:I2C传输一个8位数据 0b10101100

  • 传输顺序为:1 → 0 → 1 → 0 → 1 → 1 → 0 → 0

3.6 IIC总线的数据帧格式

        在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。


4. IIC 通信流程

4.1 写操作流程

  1. 主机发送起始信号(S)。
  2. 主机发送 7 位从机地址和写操作位(从设备地址 + W)。
  3. 主机等待从机的应答信号(ACK)。
  4. 若接收到应答信号,主机开始发送数据字节(数据)。
  5. 每发送一个数据字节后,主机等待从机的应答信号(ACK)。
  6. 重复步骤 4 和 5,直到所有数据发送完毕。
  7. 主机发送停止信号,结束写操作(P)。
标写操作流程

 

4.2 读操作流程

  1. 主机发送起始信号(S)。
  2. 主机发送 7 位从机地址和读操作位(从机地址 + R)。
  3. 主机等待从机的应答信号(ACK)。
  4. 若接收到应答信号,从机开始发送数据字节(数据)。
  5. 主机在每接收一个数据字节后,向从机发送应答信号(除了最后一个字节,主机发送非应答信号以结束数据接收)(ACK/NACK)。
  6. 重复步骤 4 和 5,直到主机接收到所有需要的数据。
  7. 主机发送停止信号,结束读操作(P)。
读操作流程

4.3 特殊的操作流程(ReStart)

        I2C 的 Restart 是指在一次 I2C 通信过程中,主机在发送了起始信号(S)、设备地址及相关数据后,在不发送停止信号(P)的情况下,再次发送一个起始信号,以开始新一轮的数据传输或改变数据传输方向等操作。它主要用于在一次连续的通信中,需要与同一个或多个从机进行多次数据交互,且中间不希望释放总线让其他设备占用的场景,避免了每次重新建立通信都要发送完整的起始、地址等信号的开销,提高了通信效率和灵活性。

 4.3.1 场景 1:写后读操作

  1. 主设备发送起始条件(S)。

  2. 主设备发送从设备地址(从机地址 + W)。

  3. 主设备发送寄存器地址(数据)。

  4. 主设备发送Restart条件(RS)。

  5. 主设备发送从设备地址(从机地址 + R)。

  6. 主设备读取数据(数据)。

  7. 主设备发送停止条件(P)。

4.3.2 场景 2:访问多个从设备

  1. 主设备发送起始条件(S)。

  2. 主设备发送第一个从设备地址,并进行通信(从机地址1 + W/R + 数据)。

  3. 主设备发送Restart条件(RS)。

  4. 主设备发送第二个从设备地址,并进行通信(从机地址2 + W/R + 数据)。

  5. 主设备发送停止条件(P)。


  ​期待批评指正,共同进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿!=程序员

感谢来过,感谢有你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值