本帖最后由 timo 于 2024-1-14 11:48 编辑
简介
IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
这里要注意IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI
物理层
![20200212223950467.png 20200212223950467.png](data/attachment/forum/202401/14/103000ef78x7uc4tbfsm55.png)
IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL
SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的
所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
通信过程
![image.png image.png](data/attachment/forum/202401/14/103349hz0ds5202b5b56fy.png)
仲裁机制
连接多于一个微控制器到I²C总线的可能性意味着超过一个主机可以同时尝试初始化传输数据。为了避免由此产生混乱,发展出一个仲裁过程。它依靠线与连接所有I²C总线接口到I²C总线。
如果两个或多个主机尝试发送信息到总线,在其他主机都产生“0 ”的情况下首先产生一个“1” 的主机将丢失仲裁。仲裁时的时钟信号是用线与连接到SCL线的主机产生的时钟的同步结合。
在I²C总线上产生时钟信号通常是主机器件的责任;当在总线上传输数据时,每个主机产生自己的时钟信号。主机发出的总线时钟信号只有在以下的情况才能被改变:慢速的从机器件控制时钟线并延长时钟信号,或者在发生仲裁时被另一个主机改变。
用时钟同步机制作为握手
时钟同步机制除了在仲裁过程中使用外,还可以用于使能接收器处理字节级或位级的快速数据传输。
在字节级的快速传输中,器件可以快速接收数据字节,但需要更多时间保存接收到的字节或准备另一个要发送的字节。然后,从机以一种握手过程(见图6)在接收和响应一个字节后使SCL 线保持低电平,迫使主机进入等待状态,直到从机准备好下一个要传输的字节。
在位级的快速传输中,器件(例如对I²C总线有或没有限制的微控制器)可以通过延长每个时钟的低电平周期减慢总线时钟。从而,任何主机的速度都可以适配这个器件的内部操作速率。
在Hs 模式中,握手的功能只能在字节级使用。
信号
起始信号
数据传输
![【技术大神】用C8051F380实现特殊的IIC时序](https://files.sekorm.com/opt/fileStore/portal/ecnew/editor/new/20160930/1475216787449080835th.jpg)
![IIC原理超详细讲解---值得一看-CSDN博客](https://imgconvert.csdnimg.cn/aHR0cDovL3d3dy5lbWJlZGRlZGxpbnV4Lm9yZy5jbi91cGxvYWRzL2FsbGltZy8xMzAzMTcvMTIxOTQ1My5wbmc?x-oss-process=image/format,png)
典型时序
单一收发数据
IIC要不主机给从机发数据
要不,从机给主机发数据
区别在于7位地址后的一位
0为主机发,1为主机收
![image.png image.png](data/attachment/forum/202401/14/114227n380gbbjp3ml2g80.png)
同时收发数据
由于IIC要不只能发,要不只能收,于是有了这版,既可以发也可以收
区别在于,发送完数据后,不发送停止信号,直接再次发送起始信号
这样避免了中途发送停止信号后,被其他主机占用总线情况
![image.png image.png](data/attachment/forum/202401/14/114506qbkp54j9t911799b.png) |