I2C详细讲解

一:I2C的特性

1.1物理特性

1.1.1 I2C属于两线同步传输协议

一条数据线SDA,一条时钟线SCL。

1.1.1.1 同步和异步的区别

同步:同步传输协议要求发送方和接收方的时钟保持同步,数据以帧或连续比特流形式传输,通过时钟信号或特定同步字符确保数据收发时序一致

异步:发送方和接收方时钟独立,通过起始位、停止位或消息机制实现数据帧同步

对于常用的通信协议,我们去区分同步和异步其实很简单,就看有没有时钟线,有时钟线的是同步传输,没有时钟线的是异步传输。

在我们学习过的通信协议中,属于同步传输的通信协议有:I2C,SPI等

异步传输的有;串口,RS232,RS485,MQTT,CAN等

1.1.2 I2C属于串行数据总线

为什么说IIC属于串行通信协议呢?

了解这个首先得理解什么是串行,什么是并行。

1.1.2.1 串行和并行

串行:数据传输方式是顺序逐位传输,每次传输仅靠一根数据线传输。传输的通道只有一个。

例如发送的数据是:0xF3  从LSB发送。

LSB:低位开始发送   MSB:高位开始发送

并行:数据传输方式是多数据多通道传输,每次传输可以通过多条数据线。传输的通道有多个

串行和并行的应用区别如下

对比项串行传输并行传输
数据线数量1 条(或 2 条,如差分信号)N 条(N 为数据位宽,如 8、16、32)
数据传输单位1 位(bit)逐位传输N 位(如 1 字节 = 8 位)同时传输
传输速度受限于单条线路的速率,但可通过高速时钟提升理论速度为单线路速率 ×N,但受限于线路同步问题
时钟同步需要时钟信号(或自同步,如 USB 的 NRZI 编码)需要统一时钟信号确保所有位同时接收
抗干扰能力强(单线路,干扰影响单一信号)弱(多线路间易串扰,距离越长越明显)
传输距离长(如 USB 可达 5 米,光纤串行传输可达千米)短(如并行 IDE 接口通常<0.5 米,因同步和串扰)
成本低(线路少,硬件简单)高(线路多,需精密同步电路,PCB 布线复杂)
典型应用USB、UART、SPI、I²C、以太网、光纤通信并行打印机接口、PCI 总线、IDE 硬盘接口、早期 CPU 总线

1.1.3 I2C属于半双工通信协议

在 I2C 通信中,数据的发送和接收是通过同一条 SDA 线进行的,同一时刻只能进行发送或接收操作,不能同时进行。

主机通过 SCL 线控制时钟信号,在时钟信号的配合下,在 SDA 线上依次发送或接收数据位。例如,主机向从机发送数据时,就在 SDA 线上按位输出数据;

而当主机要从从机读取数据时,就会在 SDA 线上接收从机发送过来的数据,不能在发送数据的同时接收数据,反之亦然,这符合半双工通信的特点。

1.2 上拉电阻与电平

I2C的SCL和SDA都需要接上拉电阻将电压拉高。

为什么要接上拉电阻呢?

因为I2C的总线接口得实现电平翻转,即输入输出模式之间切换。

那么在GPIO口的模式中只有开漏输出能满足这个条件。

那么什么是开漏输出呢?接下来我们来看一下STM32 IO 的基本结构图。

再查看这个结构图的时候我们只需要查看下半部就可以,开漏输出的本质就是P-MOS和N-MOS之间的状态变化。

在开漏输出时,上方的P-MOS一直处于关闭状态,只有下面的N-MOS打开,那么就会出现IO没法输出高电平的状态。当N-MOS闭合时只能呈现高阻态,当MOS管导通时下方的N-MOS导通,连接Vss,输出低电平。

所以需要接一个上拉电阻,让IO口可以输出高电平。

那么这个高阻态有什么好处呢?这里会有一个“线与”特性,看到“与”,顾名思义只有当线上的所有信号都是高电平时,才能输出高电平,否则输出低电平。

在这里,有一个笔者设计的有源蜂鸣器驱动电路图,大家可以思考以下,这个电路的蜂鸣器怎么关闭?

1.3 设备地址

在I2C中,每个连接到总线的设备都有唯一地址,主机通过该地址访问从机。地址分为 7 位或 10 位,实际中 7 位地址应用更广泛。

1.4 多主机和仲裁

在I2C中,支持多个主机及从机,多个主机同时使用总线时,通过仲裁方式避免数据冲突,决定总线占用权。

当STM32A和STM32B都想读取MPU6050的数据的话,那么应该怎么仲裁呢?

其仲裁过程如下:

1. 起始信号
  • STM32_A 和 STM32_B 同时检测到总线空闲(SDA 和 SCL 均为高电平),各自发起起始信号(SCL 为高电平时,SDA 由高电平变为低电平)
2. 发送设备地址
  • 两个主机开始发送要通信的从机设备地址(如 MPU6050 的 7 位地址)以及读写位。在发送每一位数据时,主机都会将自己发送的位与 SDA 线上的实际电平进行比较。
  • 假设在发送某一位时,STM32_A 发送高电平,而 STM32_B 发送低电平。由于 I2C 总线的 “线与” 特性,只要有一个主机将 SDA 线拉低,总线就会呈现低电平。此时,STM32_A 检测到自己发送的高电平与 SDA 线上的实际低电平不一致,它会判定自己在仲裁中失败,然后放弃对总线的控制,进入接收状态
  • 而 STM32_B 发送的位与 SDA 线上的实际电平一致,它会继续发送后续的数据位,直到完成设备地址和读写位的发送。
3. 获得总线控制权
  • 经过逐位比较,最终 STM32_B 成为仲裁的获胜者,获得总线的控制权。它可以继续向 MPU6050 发送数据或接收数据,完成通信操作。
  • STM32_A 则等待总线再次空闲,然后可以再次尝试发起通信。

1.5 传输模式与速率

I2C具有三种传输模式分别是:

        标准模式速率为 100kbit/s,

        快速模式为 400kbit/s,

        高速模式可达 3.4Mbit/s(但许多设备不支持高速模式)。

对于STM32F103C8T6而言,硬件I2C只有标准速度模式和快速模式。没有高速模式。

二:I2C的协议层规则

2.1 起始与停止位

起始位:在SCL高电平期间,SDA由高电平向电平跳变,SDA出现下降沿,表示起始位。

(图片来自正点原子)

停止位:在SCL高电平期间,SDA由低电平向高电平跳变,SDA出现上升沿,表示结束位

(图片来自正点原子)

2.2 数据有效性

1.在I2C发送和接收数据时,只有当SCL高电平期间,SDA发送的数据才有效。

2.在SCL低电平期间,允许SDA发生电平转换,为下次发送数据做好准备。

(图片来自正点原子)

3.每次发送的数据以字节为单位发送(一个字节8位),每次通信过程传输的字节无限制。

2.3 响应信号

响应信号包括 “应答(ACK)” 和 “非应答(NACK)” 。

数据接收端接收到数据后,若想继续接收数据,则应当向发送端发送应答信号ACK(低电平)

若接收端不想接收到数据,则应当向发送端发送非应答信号NACK(高电平)

2.3 地址及数据方向

在主机发送通信时,主机会占用SDA的使用权,先通过SDA发送7-10位的地址+1位读写位。

读写位为“0”时表示向从机写数据,为“1”时表示向从机读取数据,此时SDA控制权交给从机。

下面是一个完整的I2C写时序:

三:数据传输流程

3.1 写操作

  • 主机发送起始信号(S)。
  • 发送从机地址及写方向位(如 7 位地址 + 0),等待从机应答(ACK)。
  • 主机发送数据(8 位),每发送完一个字节,等待从机应答。
  • 重复发送数据,直至完成。
  • 主机发送停止信号(P),结束传输。

(图片来自正点原子)

3.2 读操作

  • 主机发送起始信号(S)。
  • 发送从机地址及读方向位(如 7 位地址 + 1),等待从机应答(ACK)。
  • 从机发送数据(8 位),每发送完一个字节,等待主机应答(ACK)。
  • 主机若需停止接收,返回非应答信号(NACK)。
  • 主机发送停止信号(P),结束传输。

(图片来自正点原子)

四:I2C没有应答的几种情况

4.1硬件连接问题

  • 线路断路或短路:I2C 总线由数据线(SDA)和时钟线(SCL)组成,如果这两条线路存在断路,信号无法正常传输,从设备就无法接收到主机的命令,自然不会给出应答。而短路则可能导致信号电平异常,影响通信的正常进行。
  • 设备未正确连接或损坏:若从设备没有正确连接到总线上,或者从设备本身存在硬件故障,例如芯片损坏、引脚接触不良等,都可能使它无法对主机的请求做出应答。

4.2 电气特性不匹配

  • 电平不匹配:主机和从设备的工作电平不一致,例如主机输出的高电平电压低于从设备识别的高电平阈值,或者从设备输出的低电平电压高于主机识别的低电平阈值,这会导致双方无法正确识别信号,从而出现无应答现象。
  • 上拉电阻问题:I2C 总线通常需要上拉电阻来确保信号在空闲状态下保持高电平。如果上拉电阻的阻值不合适,或者没有连接上拉电阻,会导致信号电平不稳定,影响通信,使从设备不能正常应答。

4.3 时序问题

  • 时钟信号异常:I2C 通信依赖于准确的时钟信号来同步数据传输。如果时钟信号的频率不稳定、占空比不正确或者出现时钟抖动,可能使从设备无法正确采样数据,进而无法给出应答。
  • 数据传输速度不匹配:主机和从设备的数据传输速度设置不一致,例如主机以过高的速度发送数据,而从设备无法在规定时间内完成数据的接收和处理,就可能错过发送应答的时机。

4.4 软件配置问题

  • 地址设置错误:主机发送的从设备地址与实际连接的从设备地址不匹配,导致从设备不会对主机的请求做出响应。
  • 寄存器配置错误:从设备的相关寄存器配置不正确,可能使其处于错误的工作模式,或者禁止了应答功能,从而无法给出应答信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值