文章目录
I2C 调查
标准I2C协议介绍
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的设备之间通信。I2C的两根线SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出,需通过上拉电阻接电源VCC,当总线空闲时,两根线都是高电平。
常见的硬件结构图(一个适配器,两根线,若干设备而已)
I2C时序介绍
起始信号
启动信号描述: SCL为高电平时,SDA由高电平变成了低电平
停止信号
停止信号描述:SCL为高电平时,SDA由低电平变成高电平
重启信号
在I2C总线启动了起始信号,并且未启动停止信号过程中,再次发送起始信号,那么这个信号也被称为重启信号
总线闲信号
当SDA和SCL都为高,此时主控制器和从设备都未对这两根线进行操作,仅由I2C的上拉电阻将这两根线拉高
总线忙信号
当主控制器发起了START信号时,到发起STOP信号期间,I2C总线都处于忙状态
读写信号
应答信号
一般情况下,主控制器或者从设备,谁读取到对方的发过来的数据,谁就需要发送应答信号,比如主控制器将数据发送给从设备,从设备接收到后,将在总线上回复应答信号
非应答信号
非应答信号出现有两种情况,一种是异常情况,比如主控制器发送的数据,从设备未回复应答信号,即认为回复的是非应答信号,那么说明在传输数据过程中出现了异常,比如设备地址未设置正常,又比如,在某些需要主设备额外给设备提供时钟的情况下,并没有提供时钟,即从设备未能正常工作,都会认为从设备回复的是NCK。
还有一种是正常情况,即当主控制器接收到了从设备发送的数据后,主控制器主动发送NCK,来告诉从设备,已经成功读取到了数据,不再继续读取数据了。
标准I2C协议读写介绍
I2C写一个寄存器
- 整体流程如下
-
抓包分析如下
从设备地址为0x34,寄存器地址为0x01,写入的值为0x04
I2C 读一个寄存器
读从设备地址为0x34,寄存器地址为0x01的值
- 发送START信号
- 发送设备地址+写命令(0x34+Write), 等待设备回复ACK
- 写入即将要读的设备的寄存器地址(0x01),等待设备回复ACK
- 发送STOP信号
- 发送START信号(步骤4, 5其实可以合并为一个操作,即重启信号)
- 发送设备地址+读命令(0x34+Rread),等待设备回复ACK
- 读取设备回复的寄存器的值(0x04),主控制器发送NCK(高电平),告知设备结束接受数据,再发送STOP信号,停止当次传输
I2C 连续写多个寄存器
标准的I2C支持连续写多个I2C寄存器,需要I2C控制器和I2C从设备都需要支持该标准时,才真正有这个特性。
通过I2C,连续写入n个数据,从设备的某一个基地址(连续,依次写入,硬件一般会自动递增寄存器地址)
I2C 连续读多个寄存器
标准的I2C支持连读读错了I2C寄存器,需要I2C控制器和I2C从设备支持该标准时,才真正有这个特性。
通过I2C,连续读n个数据,从设备的某一个基地址(连续,依次读出,硬件一般会自动递增寄存器地址)
I2C数据仲裁介绍
一般只有在I2C总线系统中同时存在2个I2C住设备时,才会出现总线仲裁失败的问题。
参考链接: I2C总线的仲裁机制