IIC接口协议

I2C(Inter-Integrated Circuit) 是内部整合电路的称呼, 是一种串行通讯总线, 使用多主从架构, 由飞利浦公司在1980年为了让主板、 嵌入式系统或手机用以连接低速周边装置而发展。 I2C的正确读法为"I-squared-C" , 而"I-two-C"则是另一种错误但被广泛使用的读法, 在中国则多以"I方C"称之。 I2C 总线支持任何IC 生产过程(NMOS CMOS、 双极性) 。 两线――串行数据(SDA) 和串行时钟 (SCL) 线在连接到总线的器件间传递信息。 每个器件都有一个唯一的地址识别(无论是微控制器------MCU、 LCD 驱动器、 存储器或键盘接口) , 而且都可以作为一个发送器或接收器(由器件的功能决定) 。

在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送, 高速 IIC 总线一般可达 400kbps 以上。

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

  1. 开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
  2. 结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
  3. 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号, CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

IIC 的特征

  1. 只要求两条总线线路: 一条串行数据线SDA(因此是半双工的), 一条串行时钟线SCL;
  2. 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址, 主机可以作为主机发送器或主机接收器;
  3. 它是多主机总线, 如果两个或更多主机同时初始化, 数据传输可以通过冲突检测和仲裁防止数据被破坏;
  4. 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s, 快速模式下可达400kbit/s, 高速模式下可达3.4Mbit/s;
  5. 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制
7位寻址

在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。

I2C总线规范规定,标准模式I2C,从机地址为7位长,其次是读/写位。第一个字节的头7 位组成了从机地址, 最低位(LSB) 是第8 位, 它决定了传输的方向。

第一个字节的第8位是"0",表示主机会写信息到被选中的从机;

第一个字节的第8位是"1" ,表示主机会向从机读信息。

当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定。

在起始信号后必须传送一个 从机的地址(7位) 1~7 位为7位接收 器件地址 第8位为读写位 ,用"0"表示主机发送数据(W),"1"表示主机接收数据 (R), 第9位为ACK应答位 ,紧接着的为第一个数据字节,然后是一位应答位,后面 继续第2个数据字节

IIC 的连接

  1. IIC可以接多个主设备,多个从设备(外围 设备)。如下图,存在多个主机、多个从机。
  1. 当多主机会产生总线裁决问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线
  2. 上拉电阻一般在4.7k~10k之间,默认拉高

IIC 总线最多可以挂多少个设备

由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。

但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。

IIC 的高阻态

漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻

高阻状态 :高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态------高阻状态的门电路。电路分析时高阻态可做开路理解。

为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。

IIC 的通信协议流程:

初始(空闲)状态

因为IIC的 SCL 和SDA 都需要接上拉电阻,保证空闲状态的稳定性

所以IIC总线在空闲状态下SCL 和SDA都保持高电平

开始信号

SCL保持高电平,SDA由高电平变为低电平后,延时(>4.7us),SCL变为低电平。

停止信号

停止信号:SCL保持高电平。SDA由低电平变为高电平。

数据传输中

在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次回归空闲状态。

数据有效性

IIC信号在数据传输过程中,当SCL=1高电平时,数据线SDA必须保持稳定状态,不允许有电平跳变,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。SCL=1时 数据线SDA的任何电平变换会看做是总线的起始信号或者停止信号。也就是在IIC传输数据的过程中,SCL时钟线会频繁的转换电平,以保证数据的传输

据传送格式

SDA线上的数据在SCL时钟"高"期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线SDA上的"高"或"低"状态才可以改变。输出到SDA线上的每个字节必须是8位,数据传送时,先传送最高位(MSB) ,每一个被传送的字节后面都必须跟随一位应答位 (即一帧共有9位)。

当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成 ,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。

应答信号

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,

  1. 应答信号:主机SCL拉高,读取从机SDA的电平,
  2. 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
  3. 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答

相关推荐
嵌入式小站1 小时前
STM32 零基础可移植教程 09:串口收一行命令,用 led on 控制 LED
stm32·单片机·嵌入式硬件
搁浅小泽2 小时前
8位单片机(8位SCM/MCU)通俗详解
单片机·嵌入式硬件
星夜夏空9911 小时前
STM32单片机学习(32) —— ADC
stm32·单片机·学习
芯岭技术郦12 小时前
批量不到1元,芯岭技术集成 2.4G 射频32 位 MCU 与 USB2.0的超低功耗 SoC XL2417U
单片机·嵌入式硬件·射频工程
少年、潜行15 小时前
【开源】基于STM32的无线姿态检测仪设计
stm32·嵌入式硬件·开源·姿态检测仪
三品吉他手会点灯17 小时前
STM32F103 学习笔记-22-DMA(第1节)-DMA功能框图讲解和DMA初始化结构体讲解
笔记·stm32·单片机·嵌入式硬件·学习
陌上花开缓缓归以18 小时前
定时器和延时函数选型
单片机
华普微HOPERF19 小时前
电视冰箱洗衣机、空调风扇热水器,Matter协议如何塑造全屋智能?
嵌入式硬件·物联网·智能家居·matter协议·全屋智能
ThornArmor19 小时前
【控制篇】斩断无休止空转:4-bit 指令集里的跳转律令与时序状态机
c语言·汇编·c++·单片机·嵌入式硬件