IIC通信协议

一、IIC(Inter-Integrated Circuit)通信的基本概念:

硬件结构:

  • 只需要两根线:SCL(串行时钟线)和SDA(串行数据线)
  • 可以连接多个设备,每个设备都有唯一的地址(7bit)
    iic连接图

通信原理:

  • 主从通信:一个主设备,多个从设备
  • 同步通信:由SCL线提供时钟信号
  • 串行、半双工:数据可以双向传输,但同一时刻只能单向

基本通信过程:

  • 起始条件:主设备发送
  • 地址帧:选择要通信的从设备
  • 数据帧:传输实际数据
  • 停止条件:主设备发送

二、IIC总线的基础知识

  • IIC上的设备既可以作为主机使用,又可以作为从机使用,同一时刻只能有一个主机。
  • 发起通信的设备为主机,接受通信的设备为从机
  • 主机可以发起和结束一次通信,而从机只能被主机呼叫。
  • 总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁功能来防止错误产生。(谁先发起起始信号,谁就拥有总线通信权,直到停止信号发起)
  • IIC总线上的设备都有自己唯一一个地址(7bit)
  • 总线上增加和去除设备,不会影响其他设备工作。
  • 发送数据的设备为发送器,接收数据的器件为接收器。

三、IIC总线的通信过程

  1. 主机发送起始信号启用总线
  静默状态:SDA为高电平、SCL为低电平。
  起始信号的产生:SCL为高电平时、SDA由高变低,即为起始信号。(下降沿)
  
  起始信号产生后,总线处于占用状态,不接受其他的主机发起起始信号。

在这里插入图片描述

  1. 主机发送一个字节数据指明从机地址和数据的传送方向
一个字节8bit
数据格式 = 7bit从机地址 + 1bit读写位(从从机读数据:1,给从机写数据:0)。
可以理解为:  data = 7bit从机地址 | 读写位(0x01:主机读数据。0x00主机发送数据)。

例1:
从机地址为0x78,需要从从机获取数据。
0x78 = 0111 1000
0x01 = 0000 0001
或运算后:
data = 0111 1001
发送的数据为:0x792:
从机地址为0x34,需要给从机发数据。
0x34 = 0011 0100
0x00 = 0000 0000
或运算后:
data = 0011 0100
发送的数据为:0x34

在这里插入图片描述

  1. 被寻址的从机发送应答信号回应主机
从机收到地址后,跟自身的地址进行比对,如果是自己的地址,就会识别最后一个读写位。

从机校验完地址后,向主机发送一个应答信号 0(ACK),表示接收到了主机建立通信的请求。
  1. 发送器发送一个字节数据
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. 接收器发送应答信号回应发送器
从机收到数据后,向主机发送1个数据位。(0 / 10 : 表示从机收到信息。(ACK)
1 : 表示从机没有收到信息。(NACK)
  1. 循环步骤4、5。

  2. 通信完成后主机发送停止信号释放总线。

停止信号的产生:SCL为高电平时,SDA由低变高表示停止信号。(上升沿)

停止信号产生后,总线处于空闲状态,允许所有主机发起起始信号,谁最快发起谁占用。

在这里插入图片描述

四、IIC的典型时序

  1. 主机向从机发数据(发送一个数据后停止通信)

例如:从机地址为 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为高电平
  1. 从机向主机发数据

例如:从机地址为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为高电平
  1. 主机向从机发数据后,从机向主机发数据

例如:主机想要获取从机存储的数据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为高电平
  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值