文章目录
前言
本文对I2C分两部分探讨
1、I2C总线结构:研究它的传输机制
2、I2C软件驱动:包括总线驱动和设备驱动
一、IIC总线结构
I2C 采⽤的GPIO⼀般为开漏模式,⽀持线与,但是开漏模式⽆法输出⾼电平,所以需要外部上拉。
2.1 开漏结构和推挽结构
这时候提出一个问题:总线必须为开漏结构吗,推挽结构行不行?
我们首先介绍下这两种结构,下图是推挽输出电路:使⽤两个三极管或 MOS管,当上面的MOS管导通时,OUT输出高电平,称为“推”,当下面MOS管导通时,OUT输出低电平0,称为“挽”。

如图是开漏输出电路,当MOS管导通时,OUT输出为低电平;当MOS管关闭时,OUT输出为高阻态(所以I2C使用开漏结构需要上拉电阻来输出高电平)。

然后我们回到I2C电路,I2C总线为多个开漏结构,MOS管导通的时候OUT输出低电平,MOS管不通的时候就是高阻态,电平就由上拉电平决定。当总线上接了多个I2C设备(DECICE1和DECICE2),DECICE1输出高,DECICE2输出低,VDD和地之间有一个上拉电阻限流不会损坏设备,同时整条总线电平为低,这也被称为线与。

但是推挽结构会产生什么问题,如下图,总线上接了两个设备,当DEVICE_1设备输出高,DEVICE_2设备输出低,VCC和GND就会形成短路,也就是推挽结构不线与,而我们开漏结构如果出现这种情况刚好会有一个上拉电阻限流,避免了这个问题。
线与:是 I2C 协议的基本,可以理解为当总线上只要有⼀个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占⽤状态。

二、I2C软件驱动
2.1 I2C物理层
I2C通讯设备之间的常用连接方式如下图。

2.2 I2C协议层
I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节
I2C通讯过程
I2C通讯过程常有如下三种方式:写数据方向、读数据方向、复合格式。



:数据由主机传输至从机
S : 传输开始信号
SLAVE_ADDRESS: 从机地址
:数据由从机传输至主机
R : 传输方向选择位,1为读,0为写
A : 应答(ACK)或非应答(NACK)信号
P : 停止传输信号
起始和停止
前文中提到的起始(S)和停止(P)信号是两种特殊的状态,起始和停止信号一般由主机产生,如下图。
- 起始条件:SCL高电平时高,SDA 由高变低
- 停止条件:SCL高电平时,SDA 由低变高

数据有效性
I2C使用SDA来传输数据,使用SCL进行数据同步(SCL为高电平的时候SDA表示的数据有效,所以SDA在SCL低电平进行电平切换,如果在SCL高电平进行电平切换会被认为是起始/终止信号)

地址和响应
地址
I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。 I2C协议规定设备地址可以是7位或10位(如果只考虑地址,I2C可以挂载的从机数量是2^7或 2^10)

这里提出一个问题:IIC实际能挂载多少个设备?(会在本文末尾给出解答)
响应
I2C的数据和地址传输都带响应。响应包括应答(ACK) 和非应答(NACK) 两种信号。传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
- 若希望对方继续发送数据 ,则需要向对方发送 “应答(ACK)” 信号,发送方会继续发送下一个数据;
- 若接收端希望结束数据传输,则向对方发送 “非应答(NACK)” 信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

I2C 传输规定
- 以
START条件开始,以STOP条件结束 - 传输的第⼀个字节为
7bit从机地址 +1bit读写位 - 每个总线上的设备都会比较
STRAT信号后⾯的7bit地址与⾃⼰的地址是否匹配 - 每个
byte(8 bits)后⾯都会有ACK或者NACK - 在
START信号或者repeated START信号后,从机必须重置⾃⼰的总线逻辑 - ⼀个
START后⾯紧跟着⼀个STOP信号,是非法格式 - 主机
master可以不产生STOP信号,而是直接产⽣⼀个repeated START信号+另外⼀个设备地址,直接开始访问另外⼀个设备
时钟延展:通过将 SCL 线保持在低电平来暂停传输。在 SCL 再次拉⾼之前,传输⽆法进行。
I2C 主设备始终控制着时钟线 SCL,不论是往设备写还是从设备读。如果从设备是处理器,在接到主机命令后要去处理⼀些运算然后得出结果返回给主机。这个时候可能造成来不及处理。从设备会主动控制时钟线把它拉低,直到数据准备好之后再释放时钟线,之后把控制权交还给 MASTER。这也是 I2C 通信系统中,从机唯⼀能控制总线的时候。
2.3 I2C同步和仲裁
在多主通信系统中。总线上有多个节点,它们都有⾃⼰的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是 I2C 总线上的仲裁。
SCL 同步是由于总线具有线与的逻辑功能,即只要有⼀个节点发送低电平时,总线上就表现为低电平。
仲裁发生在两个主节点(DATA1和DATA2)向总线所发送的数据信号不同的时候,如图中第三个时钟周期,主节点1发送⾼电平信号,⽽主节点2发送低电平信号。根据总线的线与的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不⼀样,就断开数据的输出级,转为从机接收状态。

三、总结
本章分析I2C的硬件电路和通信协议,在这里放一个IIC实战项目:心率血氧测量。
参考文档:TI: A Basic Guide to I2C
问题
IIC实际能挂载多少个设备?
IIC协议没有规定总线挂载设备数目,但是规定了总线电容的规格限制在400/550pf。总线电容主要来源于PCB寄生电容、管脚输入电容。所以需要根据总线电容限制挂载设备数量。

7642

被折叠的 条评论
为什么被折叠?



