目录
I2C协议概述
同步通信 半双工(分时) 串行传输 电平信号
特点:①有两根传输线(时钟线SCL、双向数据线SDA)
②主从模式:通信双方为主设备(Master)和从设备(Slave),在总线上的每一个设备都可以作为主设备或从设备,但一个总线上一般只有一个主设备和多个从设备。主设备是用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU,而从设备只能被动相应主设备发起的通信请求,所以各种I2C接口芯片作为从设备使用
③I2C上每个从设备都有7bit的物理地址(MSB),且该地址是唯一的,固化在芯片上,可以从datasheet中获取。I2C地址中全0为广播地址,所以I2C总线上理论可以有2^7-1个从设备
I2C通信原理
通过对SCL和SDA线高低电平时序的控制,来产生协议信号进行数据的传递。在I2C总线上传递的每一位数据都由一个同步时钟脉冲相对应,即在SCL串行时钟的配合下,数据在SDA上从高位向低位依次串行传送每一位的数据。
I2C通信时序
1)起始位 (主设备发起)
I2C总线在空闲的时候,两根传输线都是高电平(通过上拉电阻变成高电平)。当要开始通信的时候,主设备就发起一个START(S)信号,告诉所有的从设备准备开始通信。当要结束通信的时候,主设备会发起一个STOP(P)信号结束此次通信。
- 起始位:当SCL保持高电平时,SDA产生一个下降沿,从而发起一个起始位
- 停止位:当SCL保持高电平时,SDA产生一个上升沿,从而发起一个停止位
2)读写地址
主设备在第一时序中发起START信号,在第二个时序要紧跟从设备的地址。除了从设备的地址7bit之外,还要加上一位作为读写位(0表示写、1表示读)。所以相当于从设备读地址是为一个字节,高7位是从设备物理地址,最低位表示读写状态。
例如: 0x44<<1 | 1 表示读 0x44<<1 表示写
3)应答信号
当主机在总线上传输从设备地址时,各个从设备开始进行地址匹配,如果地址匹配成功,那么从设备将发出ACK应答信号。当主机收到应答信号,则表示通信成功建立,否则表示寻址失败。
地址匹配从设备发送应答信号,在第九个时钟,然后这时候发送端是释放SDA线控制权(注意:这里是主设备内部上拉,不是外部上拉电阻,因为如果是外部,从设备无法下拉电阻,没有控制权),将SDA拉高,由接收方控制。
- 若要继续通信,从设备发出ACK应答信号,即是SDA为低电平
- 若不要继续通信,从设备发出NAK非应答信号,即是SDA为高电平
4)数据位收发
主机收到从设备应答信号之后,开始给从设备发送数据,SDA数据线上的每个字节必须是8位,并且是以MSB方式发送,每次传输的字节数量没有限制,但是每个字节发送完成之后,从机都要发送一个应答信号,代表是否继续通信。
发送数据位的时候,高电平代表数据位为1,低电平代表数据位为0。当传输的数据位发生变化时(由1变为0、由0变为1),此时必须要确保SCL保持低电平。
5)主机发送数据流程
- 当总线空闲的时候,主机发送一个起始信号S,代表开始通信
- 主机接着发送一个从机的物理地址7bit和一位读写控制位(0为写、1为读)
- 从机进行地址匹配,匹配成功后发送一个应答信号ACK(低电平为0)
- 主机收到应答信号,接着开始发送第一个字节的数据
- 从机收到数据后返回一个ACK
- 主机收到应答信号后,接着发送下一个字节
- 当主机发送完最后一个字节,并且接收到从机的应答信号时,接着发送一个停止信号P结束通信,并且释放总线
- 从机收到P信号之后也推出和主机之间的通信
6)主机接收数据流程
- 当总线空闲的时候,主机发送一个起始信号S,代表开始通信
- 主机接着发送一个从机的物理地址7bit和一位读写控制位(0为写、1为读)
- 从机进行地址匹配,匹配成功后发送一个应答信号ACK(低电平为0),接着开始发送第一个字节数据
- 主机收到数据之后向从机返回一个ACK
- 从机收到应答信号后,接着发送下一个字节
- 当主机接收完数据之后,向从机发送一个NAK信号,从机收到非应答信号后停止发送数据
- 主句发送ACK之后,发送一个停止信号结束通信,并释放总线
Ps:主机接收数据的时候,就是Master控制时钟线,当有一个脉冲的时候,从设备就发送一个位的数据。因为是MSB,所以收到一个数据就左移一位,主机收到一个字节的数据后,就给从机发一个应答信号。
典型代表:SHT20温湿度传感器、SHT30温湿度传感器、OLED显示屏、RTC、触摸屏