4.1 简介
I2C Bus(IlC,Inter-Integrated Circuit Bus)是由 Philips公司(现被NXP收购)推出的一种在电子通信控制领域常用的通信协议。它由时钟线(SCL)和数据线(SDA)两根线构成通信线路,利用上拉电阻将它们拉成高电平(表示总线空闲),其典型的电压准位为+3.3V或+5v,具有电路简单、连接线少、控制简单、通信速率高等优点。
I2C总线是一种主从结构(Master/Slave)总线,I2C总线上的每一个设备都可以作为主设备或者从设备,但一个总线上一般只有一个主设备,可以带多个从设备。其中主设备用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU;而从设备只能被动响应主设备发起的通信请求,所以各种I2C接口芯片将作为从设备使用。
4.2 从设备地址
因为一个I2C总线上可以有多个从设备,这样主设备需要通过地址来确定与哪个器件进行通信。l2C总线上每个从设备都有一个唯一的 7bit 地址物理识别,这个地址固化在芯片内部,并可以从芯片datasheet上找到。因为I2C地址全0为广播地址,所以I2C总线理论上最多能带2^7-1=127个从设备。
有些时候一个总线上可能需要挂多个同一芯片,这样有些芯片还需要引出一个或几个引脚,由开发板设计电路来决定其具体地址,从而让不同芯片具有不同的 7bit 物理地址。如下左图的SHT30温湿度传感器,如果ADDR连VSS 则其7bit地址为Ox44,而如果ADDR连VDD则其7bit地址为Ox45。
4.3 通信时序
介绍
在I2C总线上传送的每一位数据都由一个同步时钟脉冲相对应,即在SCL串行时钟的配合下,数据在SDA上从高位向低位(MSB)依次串行传送每一位的数据。下面是l2C通信的时序图:
起始位和停止位
I2C总线在空闲时SDA和SCL都处于高电平状态(由上拉电阻拉成高电平),当主设备要开始一次I2C通信时就发送一个START(S)信号,这个起始位就可以告诉所有I2C 从机,“我”要开始进行l2C通信了;当要结束一次l2C通信时,则发送一个STOP§信号结束本次通信。
I2C协议起始位: 当SCL保持高电平时,SDA出现一个下降沿,产生一个起始位;
I2C协议停止位: 当SCL保持高电平时,SDA出现一个上升沿,产生一个停止位;
读写地址
主机在发送START信号之后,第2个时序应该立刻给出要通信的目标从机物理地址。此外,I2C总线是一种能够实现半双工通信的同步串行通信协议,站在主设备的角度来看应该具有读/写从设备的功能。
这时候I2C的读写地址除了7bit 物理地址以外,还有1bit用来标识读/写方向位。这样I2C的从设备读写地址通常是一个字节,其中高7bit 是上面描述的物理地址,最低位用来表示读写方向(0为写操作,1为读操作)。
应答信号
主机往I2C总线上传输器件地址,所有的从机接收到这个地址后与自己的地址相比较若相同则发出一个应答ACK信号,主机收到这个应答信号后通讯连接建立成功,若未收到应答信号则表示寻址失败。
此外,主/从机在之后的数据通信中,数据接收方(可能是主机也可能是从机)收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。
若希望继续,则给出“应答(ACK,Acknowledge)”信号,即 SDA为低电平;
若不希望继续,则给出“非应答(NACK,Not Acknowledge)”信号,即 SDA为高电平;
数据位收发
主机在收到从机的应答信号之后,开始给从机发送数据。SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制,每个字节发送完成之后,从机必须跟一个应答信号。
I2C总线通信时数据位传输采用MSB(最高位优先)方式发送,其中高电平表示数据位1,低电平表示数据位0。当传输的数据位需要改变时(如上一个位发送的是1,下一个位要发送0),必须发生在SCL为低电平期间。另外在传输过程中,SDA上的数据位在SCL高电平期间必须保持稳定不变。
总线速率
I2C总线是一种同步、半双工、采用电平信号收发的串行总线,其速率支持:
标准模式(Standard-mode) : 速率高达100kbit/s
快速模式(Fast-mode) : 速率高达400kbit/s
快速模式+(Fast-mode Plus) : 速率高达1Mbit/s。
高速模式(High-speed mode) : 速率高达3.4Mbit/s
超快速模式(Ultra Fast-mode) : 速率高达5Mbit/s(单向传输时支持)
4.4 主机发送数据流程
- 主机在检测到总线为空闲时,发送一个启动信号"S",开始一次通信的开始;
- 主机接着发送一个从设备地址,它由 7bit 物理地址和 1bit 读写控制位R/W组成(此时R/W=0);
- 相对应的从机收到命令字节后向主机回馈应答信号ACK (ACK=O);
- 主机收到从机的应答信号后开始发送第一个字节的数据;
- 从机收到数据后返回一个应答信号ACK;
6.主机收到应答信号后再发送下一个数据字节;
7.主机发完最后一个字节并收到ACK后,向从机发送一个停止信号Р结束本次通信并释放总线;
8.从机收到Р信号后也退出与主机之间的通信;
4.4 主机接收数据流程
- 主机发送启动信号后,接着发送地址字节(其中R/W=1);
- 对应的从机收到地址字节后,返回一个应答信号并向主机发送数据;
- 主机收到数据后向从机反馈一个应答信号ACK;
- 从机收到应答信号后再向主机发送下一个数据;
- 当主机完成接收数据后,向从机发送一个NAK,从机收到非应答信号后便停止发送;
- 主机发送非应答信号后,再发送一个停止信号,释放总线结束通信;