I2C协议
通信协议可以按照通信方式分为单工,半双工,全双工三种。
单工:发射端和接收端固定,有一条数据通路,通路上数据单向流动。
半双工:发射端和接收端可变,有一条数据通路,通路上数据双向流动。
全双工:发射端和接收端,有两条数据通路,一条从TX到RX,另一条从RX到TX。
1 什么是I2C协议
- 双向两线总线。半双工协议(即同一时刻,数据单向流动),也是一种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备,I2C的出现主要是用来实现不同集成电路组件之间的控制功能,比如通过I2C协议,连接MCU与LCD驱动器,远程I/O口,RAM,EEPROM或数据转换器。
- UART,SPI,I2C协议都属于低速通用协议接口,I2C协议,每个主设备和每个从设备都对应一个地址,通信的时候先发送地址信号,若一致,则被选中。
- I2C仅需要两根信号线即可完成通信
SDA(Serial Data) :串行数据线,用来传输数据信号。
SCL(Serial Clock):串行时钟线,用来传输时钟信号,一般是主设备向从设备提供。 - 连接方式 可以是单主设备,单从设备,也可以是单主设备,多从设备,还可以是多主设备,多从设备。
- I2C的数据传输格式
空闲时SDA与SCL默认都是高电平,对应于主设备状态机IDLE(默认态)时的输出为高
SCL为高电平的时候 ,主设备控制SDA从1到0,为起始位,进入起始位后,SCL按照始终的要求进行翻转,从设备接收到起始位信息,状态机发生跳变,等待地址信号的输入,从设备在这里需要使用到下降沿检测电路,作为状态机跳变的控制信号 - 地址位与读写控制
主设备按照从高到低的顺序,依次发送地址位,从设备进行接收,通常情况下,地址位为7bit,读写选择为1bit。每个从设备有且只有一个唯一的地址编号,写为0,读为1
为了确保采样时信号稳定,对于主设备,我们在下降沿的时候将信号放在SDA上,对于从设备,我们在上升沿的时候进行采样。 - 应答位(ACK/NACK)
发送了标题为5.3的8bit后,主机释放对SDA的控制权,由于上拉电阻的作用这个时候SDA默认为高电平,从机接管SDA的控制权,假如从机正确的接收了数据,会将SDA拉低,假如没有正确的接收数据,在从设备的控制下,SDA依旧为高电平。
成功收到ACK信号后,就可以正式传输数据位了,每一次默认传输一个字节(即8bit),每个字节的传输都需要跟一个应答位(ACK/NACK) - 停止位
SCL先拉高,在SCL为高电平的时候,SDA从低到高,即为停止位,此后,I2C协议重新进入到空闲状态。这里使用了上升沿检测电路, - 总结
首先为起始位S(start),接着传输地址7位SLAVE ADDRESS和1位读写控制信号R/W,再往后8位8位的传输数据位,每个字节紧跟ACK信号,最后为停止位
所有的阴影部分,都是主设备在操作总线,而A对应的ACK,则为从设备在操作总线。
2. 可配置变量
- 传输模式
标准模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(单向传输) - 地址位宽
标准I2C:七位寻址
扩展I2C:十位寻址
多出来的3位地址相当于提供了8倍潜在设备数量 - 设备地址
每个主设备与从设备需要设置互不相同的七位地址或十位地址。
3. 仲裁机制
- SCL同步问题
总线天生带线与逻辑,即总线的几个输入端,任意有一个拉低,总线表现为低电平,全部位高电平时,总线才是高电平
假设有两个主设备都想拉低SCL信号,Master1先拉低 ,Master2后拉低,那么SCL会按照CLK1的时间来拉低自身(线与逻辑的应用),而假如Master1先拉高,Master2后拉高,SCL又会按照CLK2的时间来拉高自身。 - SDA仲裁问题
SCL上升沿到来,对SDA上的数据进行采样,结果为0,与DATA2上的数据0相同,与DATA1上的数据1不同,通过这种比较 Master1退出了对总线的控制,而Master2所发送的数据都是正确的,完成仲裁。