一、绪:
IIC通信的SDA线上第一个字节,是主机发送的,前7位是欲呼叫的从机地址,第8位用于确定通信方向,若为“0”,则表示主机给从机发数据;若为“1”,则表示向从机要数据。
(1). 这个字节会发送给所有器件,下面所有器件收到该字节后会对照自身的地址码,若相同,则会成为本次通信的从机。同时其他器件也知道了此时总线被占用,进入休眠状态;
(2). 被呼叫的从机会发送应答信号“0”(ACK信号)回应主机;
(3). 接下来发送方(既可以是主机,也可以是从机,取决于主机发送第一个字节的第8位是 0 或 1)会开始发送数据给接收方,接收方只会返回ACK应答信号,若发送方收到非应答信号 “1”,会重复发送或发送停止信号;
(4). 通信完成后,主机发送停止信号释放总线。
二、IIC总线实现
IIC的3个信号:
(1). 起始信号:SCL为高电平,SDA由高电平跳变为低电平;
(2). 终止信号:SCL为高电平,SDA由低电平跳变为高电平;
(3). 空闲状态:SCL和SDA都是高电平;
IIC总线通信时每个字节为8位长度,数据传送时,先传送最高位。发送方发送完一个字节数据后,接收方须发送1位应答信号来回应发送方,即SDA线上一帧有9位,若第9位接收方发送“1”表示非应答,发送“0”表示应答。因为有9位,所以SCL线在一帧内有9个高电平(待会看完第6点后,就会明白为什么SCL是9个高电平了);
数据发送过程中,发送方什么时候发送高低电平?SCL为低电平期间发送方才能发送高或低电平到SDA线上;SCL为高电平时,SDA上的电平状态要与前一时刻相同,即在SCL为低电平时,若SDA由高电平转为低电平,则在下一时刻SCL为高电平时,SDA要保持低电平。这是因为当SCL高电平时,是接收器从SDA上读取数据的时刻,不能被干扰。以上是数据发送过程,需与停止信号区分;
三、典型的IIC时序
有以下3种情况:
1.主机发送起始信号 --> 从机应答 --> 主机发送数据 --> 从机应答......主机发送数据---从机应答或不应答---主机发送停止信号;
2.主机发送起始信号---从机应答---从机发送数据---主机应答......从机发送数据---主机不应答---主机发送停止信号;
3.主机发送起始信号---从机应答---主机发送数据---从机应答......主机发送数据---从机应答或不应答---主机发送开始信号---从机应答---从机发送数据---主机应答......从机发送数据---主机不应答---主机发送停止信号;
需要注意的是,第3种情况中,主、从机互换发送方/接收器身份时,主机没有发停止信号,而是直接发起始信号。这是因为,如果主机发停止信号,相当于释放了SDA总线,那么其他主机就有可能占线,所以直接发起始信号能一直占有总线。