一、IIC(Inter-Integrated Circuit)通信的基本概念:
硬件结构:
- 只需要两根线:SCL(串行时钟线)和SDA(串行数据线)
- 可以连接多个设备,每个设备都有唯一的地址(7bit)
通信原理:
- 主从通信:一个主设备,多个从设备
- 同步通信:由SCL线提供时钟信号
- 串行、半双工:数据可以双向传输,但同一时刻只能单向
基本通信过程:
- 起始条件:主设备发送
- 地址帧:选择要通信的从设备
- 数据帧:传输实际数据
- 停止条件:主设备发送
二、IIC总线的基础知识
- IIC上的设备既可以作为主机使用,又可以作为从机使用,同一时刻只能有一个主机。
- 发起通信的设备为主机,接受通信的设备为从机。
- 主机可以发起和结束一次通信,而从机只能被主机呼叫。
- 总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁功能来防止错误产生。(谁先发起起始信号,谁就拥有总线通信权,直到停止信号发起)
- IIC总线上的设备都有自己唯一一个地址(7bit)。
- 总线上增加和去除设备,不会影响其他设备工作。
- 发送数据的设备为发送器,接收数据的器件为接收器。
三、IIC总线的通信过程
- 主机发送起始信号启用总线
静默状态:SDA为高电平、SCL为低电平。
起始信号的产生:SCL为高电平时、SDA由高变低,即为起始信号。(下降沿)
起始信号产生后,总线处于占用状态,不接受其他的主机发起起始信号。
- 主机发送一个字节数据指明从机地址和数据的传送方向
一个字节8bit
数据格式 = 7bit从机地址 + 1bit读写位(从从机读数据:1,给从机写数据:0)。
可以理解为: data = 7bit从机地址 | 读写位(0x01:主机读数据。0x00主机发送数据)。
例1:
从机地址为0x78,需要从从机获取数据。
0x78 = 0111 1000
0x01 = 0000 0001
或运算后:
data = 0111 1001
发送的数据为:0x79
例2:
从机地址为0x34,需要给从机发数据。
0x34 = 0011 0100
0x00 = 0000 0000
或运算后:
data = 0011 0100
发送的数据为:0x34
- 被寻址的从机发送应答信号回应主机
从机收到地址后,跟自身的地址进行比对,如果是自己的地址,就会识别最后一个读写位。
从机校验完地址后,向主机发送一个应答信号 0(ACK),表示接收到了主机建立通信的请求。
- 发送器发送一个字节数据
IIC总线通信时,每个字节为 8 bit长度,数据传送时,先传最高位,后传低位。
例如:发送的数据为 0x34
0x34 = 0 0 1 1 0 1 0 0
D7 D6 D5 D4 D3 D2 D1 D0
数据从 D7 -> D0 依次发送出去。
逻辑 1 : SCL为高电平时,SDA为高电平,表示逻辑 1。
逻辑 0 : SCL为高电平时,SDA为低电平,表示逻辑 0。
在单片机处理中
当SCL为低电平时,可以对SDA高低电平进行设置。
当SCL为高电平时,不可以对SDA电平进行设置了,因为这个时候在读数据。
- 接收器发送应答信号回应发送器
从机收到数据后,向主机发送1个数据位。(0 / 1)
0 : 表示从机收到信息。(ACK)
1 : 表示从机没有收到信息。(NACK)
-
循环步骤4、5。
-
通信完成后主机发送停止信号释放总线。
停止信号的产生:SCL为高电平时,SDA由低变高表示停止信号。(上升沿)
停止信号产生后,总线处于空闲状态,允许所有主机发起起始信号,谁最快发起谁占用。
四、IIC的典型时序
- 主机向从机发数据(发送一个数据后停止通信)
例如:从机地址为 0x34,需要发送的数据为0x78。
通信过程如下:
1、主机发送起始信号:0 //SCL为高电平时,SDA为低电平。
2、主机发送地址和读写位: 0x34 == (0x34 | 0x00) //0x34是地址 0x00是主机向从机发数据
3、从机收到地址和读写位后向主机回复ACK ACK == 0 //SCL为高电平时,SDA为低电平
4、主机收到ACK后向从机发送数据:0x78 //从高位向低位发送
5、从机收到数据后回复ACK: ACK == 0 //SCL为高电平时,SDA为低电平
6、主机收到ACK后停止通信: 主机发送停止位 //SCL为高电平时,SDA为高电平
- 从机向主机发数据
例如:从机地址为0x54,主机主动向从机获取数据,数据为0x88。
通信过程如下:
1、主机发送起始信号:0 //SCL为高电平时,SDA为低电平
2、主机向从机发送地址和读写位:0x55 == (0x54 | 0x01) //0x54是从机地址,0x01是主机向从机读数据
3、从机收到后回复ACK:0 //SCL为高电平时,SDA为低电平
4、从机向主机发送数据:0x88 //数据为0x88
5、主机收到后回复ACK //SCL为高电平时,SDA为低电平
如果从机不想继续接收可以恢复NACK //SCL为高电平时,SDA为高电平
6、主机发起停止信号:1 //SCL为高电平时,SDA为高电平
- 主机向从机发数据后,从机向主机发数据
例如:主机想要获取从机存储的数据0x88,这个数据存在于从机内存中0x11这个地址中,从机本身的IIC通信地址为0x56。
通信过程如下:
1、主机发送起始信号:0 //SCL为高电平时,SDA为低电平
2、主机向从机发送地址和读写位:0x56 == (0x56 | 0x00) //0x56是从机地址,0x00是主机向从机发送数据
3、从机收到地址后回复ACK:0 //SCL为高电平时,SDA为低电平
4、主机向从机发送从机的内存地址:0x11 //从机内容地址为0x11
5、从机收到后回复ACK:0 //SCL为高电平时,SDA为低电平
6、主机向从机发送地址和读写位:0x57 == (0x56 | 0x01) //从机地址为0x56,从从机读取数据是0x01
7、从机收到后回复ACK:0 //SCL为高电平时,SDA为低电平
8、从机向主机发送数据:0x88 //从机地址为0x11这个内容存储的数据为0x88
9、主机收到后回复ACK:0 //SCL为高电平时,SDA为低电平
主机如果不想继续接收了可以回复NACK:1 //SCL为高电平时,SDA为高电平
10、主机发起停止信号:1 //SCL为高电平时,SDA为高电平
标签:SCL,高电平,主机,通信协议,低电平,从机,SDA,IIC
From: https://blog.csdn.net/originab/article/details/140173348