IIC 总线协议
IIC总线协议中的概念
I²C总线支持任何IC 生产过程(NMOS、CMOS、双极性)。两线——串行数据(SDA) 和串行时钟(SCL) 线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器、LCD驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。很明显,LCD驱动器只是一个接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机(见图1)。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。
IIC总线协议中存在如下概念
概念 | 描述 |
---|---|
发送器 | 发送数据到总线的器件 |
接收器 | 从总线接收数据的器件 |
主机 | 初始化发送、产生时钟信号和终止发送的器件 |
从机 | 被主机寻址的器件 |
多主机 | 同时有多于一个主机尝试控制总线,但不破坏报文 |
仲裁 | 是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程 |
同步 | 两个或多个器件同步时钟信号的过程 |
IIC硬件连接
I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,会加一个上拉电阻。上拉电阻主要用于为信号线或GPIO引脚提供默认状态(根据I2C总线规范,总线空闲时两根线都必须为高)。在I2C 的电路中,I2C设备(芯片)的 SCL 和 SDA 的内部电路是“开漏”的,这意味着它们可以吸收电流,但无法提供电流。通俗点讲就是:这种信号可以被设置为低电平,但不能被设置为高电平。
IIC数据传输过程
写操作
流程如下:
- 主芯片要发出一个start信号
- 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
- 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
- 主设备发送一个字节数据给从设备,并等待回应
- 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
- 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
读操作
流程如下:
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
从设备发送一个字节数据给主设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
IIC时序图
I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
- 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
- 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
- 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
- SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
I2C协议信号如下:
-
如何在SDA上实现双向传输?
主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。 -
主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间?
在9个时钟里,
前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据;
前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。