IIC协议
(不论如何,控制SDA时,都先保证SCL为低电平)
1.开始与结束
IIC的默认空闲电平位高电平,在开始前首先要了解:
低电平优先级最高。例如在电路中,给一根导线接地,无论这根导线以前是什么电位,接地后均和地线电位相同,所以将低电平作为敏感信号。IIC总线默认高电平时直接接地会不会构成短路,答案是不会,因为总线上接有限流电阻。
在通讯开始时需要一个开始信号,在通讯结束时需要一个结束信号。
- 开始:当SCL为高时,SDA由高到低跳变一次
- 开始的前提是SCL和SDA都为高。
- 结束:当SCL为高时,SDA由低到高跳变一次
- 结束的前提是SCL为高,SDA为低。
(图片网上粘的)
- 结束的前提是SCL为高,SDA为低。
2.数据传输
(SCL为时钟控制总线,当SCL为高电平时,设备需要采集SDA上的数据)
数据传输控制方法
(图片网上粘的)
- 当SCL为低电平时,可随意控制SDA变化
- 当SCL为高电平时,不要动SDA,保证SDA上的电平稳定,此时设备采集SDA的电平
数据传输总控制流程
- 首先保证SCL为低电平
- 在SCL为低电平时,控制SDA位的电平
- SCL从低到高跳变一次,再从高到低跳变一次,类似于一个完整的方波,此时设备会记录一位
- 将上述过程循环八次,即组成一个字节数据
- 注意:数据传输顺序,先高位后低位
3.主从关系
在IIC通讯中存在主设备和从设备
-
主设备:控制时钟总线SCL的设备为主设备,同一个总线上可以有多个主设备
-
从设备:有对应自己的设备地址,因为不能控制时钟总线SCL,只能被动的依照时钟总线的跳变,处理SDA上的电平数据。
-
设备地址:
开始信号之后,第一个字节数据的前7位为设备地址位,最后一位为读写位。
-
产品的设备地址是由产品决定的,不能人为的设定。
-
读写位为“0”时,是写操作
-
读写位为“1”时,是读操作
设备地址位 + 读写位 = 一个字节
-
-
4.应答信号
当一个字节数据传输结束,接受数据的设备需要应答一次
- 在传输一个字节数据后,传输数据的一方A会释放数据总线SDA(即让SDA为高电平),此时由接受数据的一方B控制数据总线SDA
- 在下一个时钟信号SCL为高电平时,传输数据的一方A接受SDA上B的应答信号,从而判断之前传输的数据是否被成功接收到。
- 应答信号均由数据的接收者发出
应答信号有两种:应答和非应答
- 应答:接收者接收完一个字节数据后,在下一个时钟脉冲SCL来临之前,将SDA置“0”
- 非应答:接收者接收完一个字节数据后,在下一个时钟脉冲SCL来临之前,将SDA置“1”
应答信号的应用
-
正常通讯状态下,从设备只发应答,应答完成后,主设备可以继续发送下一个指令,也可以直接发送停止信号;
-
当从设备繁忙时,主设备向从设备发出指令,此时从设备发出非应答信号。
-
主设备读取从设备数据时
- 读一个字节后,主设备发出应答信号,从设备会继续向主设备发送下一个数据
- 读一个字节后,主设备发出非应答信号,从设备会停止向主设备发送数据,并释放数据总线(即将数据总线SDA拉高)等待主设备发出结束指令
所以,当主设备在读到最后一个字节时,通过非应答信号,可让从设备释放数据总线,停止从设备继续发送数据,再通过停止信号终止本次通讯。具体操作根据实际情况决定。
5.总结
- IIC协议,难点在于对应答信号的掌控,其中主设备的应答信号,即起到应答的作用,也起到控制的作用,是编程注意的一个细节。