IIC总线协议

介绍

IIC(Inter Integrated Circuit,集成电路总线)是由数据线 SDA 和时钟 SCL 构成的串行半双工总线

I/O结构:
在这里插入图片描述特点:
硬件结构简单,成本低(就两根线当然简单)
IIC是多主机总线,如果两个主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。(相比较,UART是点对点通信)
多个IIC从机器件可以并联在IIC总线上,每个器件有特定的地址,分时共享IIC总线
在这里插入图片描述

应用场合:
近距离低速芯片间通信,比如EEPROM。标准速率100k, 高速模式3.4M

如何控制
1. 寻址方式: 每次通信要先发送地址信号,地址信号也通过SDA发送
2. 读写数据: 见“基本通信帧”
3. 安全通信: 一次通信过程,什么时候开始和结束,发送器知道接收器收到数据没——每个字节结束后发送ACK/NACK信号实现应答
4. 信号同步: 发送器什么时刻把数据放到总线上,接收器什么时候采数据,即接收器怎么区分序列是10还是1100(UART:设置波特率,但是收发双方用各自的时钟,时间长了时钟不同步,所以一次只能发1字节数据)
IIC: 用SCL时钟线。SCL为低电平期间,发送器向数据线上发送一位数据,时钟线SCL为高电平期间,接收器从数据线上读取一位数据,在此期间数据线上的信号必须保持稳定。
在这里插入图片描述


详细协议如下

基本通信帧

空闲,都拉高-主机发送起始位-主机发送一个字节数据-从机发送应答位,循环上述两个步骤 - 主机停止位

总共四个信号:
起始/停止位:SCL为高电平时,SDA由高变低表示起始信号;SCL为高电平时,SDA由低变高表示停止信号;起始信号和停止信号都由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线处于空闲状态。两种信号都是一种电平跳变信号,而不是一个电平信号。
在这里插入图片描述

一字节数据:每个字节为8位长度,先高位后低位(UART是先低后高)
所有的SDA 信号变化都要在SCL 时钟为低电平时进行:SCL拉低,在此状态下master将1bit数据放到SDA上;SCL拉高,此状态下SDA上的数据保持稳定,供slaver(自动)读取;重复此过程8次,完成一个Byte的传输

应答信号ACK: 发送器发送完一个字节数据后,接收器必须发送1位应答位来回应发送器,即一帧共有9位。(UART没有)
第9个时钟,SCL低电平时,SDA被master释放(高电平),slaver接管SDA将其拉低,发出一个响应信号ACK。如果低电平,则认为收到了来自slaver的响应(ACK)**,否则认为slaver没有响应(NACK)刚才发送的那一个Byte。
(如果是写,slave发送ACK;如果是读,master发送ACK)
只有一个特殊情况不用应答位,就是主机(给时钟信号的一方)作为接收方时,在收到最后一个字节信息时发送NON ACK,

在这里插入图片描述
下面的波形:SCL,主机产生的时钟脉冲
上面的波形:SDA,主机发送的8位数据
中间的波形:SDA,从机在第9个时钟信号进行拉低回应,表示收到了主机发来的数据,拉高则表示不应答
注:实际上,上面和中间是同样的SDA线,这里只是分开示意。
在这里插入图片描述

实际通信时序

  1. 主机向从机发送数据**(主机写)**
    最后一帧可以是主机不想发了,也可以是从机没应答,主机遂停止通信
    图片
    主设备会先传送一个字节:7 位的Slave 地址,第8位指明后续字节的传递方向,称为Read/Write 位。用“0”表示主机写数据,“1”表示主机读数据。

2.从机向主机发送数据**(主机读)**
图片
(如果最后是非应答,那么这一帧正常接收没有?)

3.主机先向从机发送数据,然后从机再向主机发送数据
中间不停止,直接Restart。(防止被其他总机抢走控制权)
在这里插入图片描述
注:阴影部分表示数据由主机向从机发送,无阴影部分表示数据由从机向主机发送,A表示应答,A非表示非应答,S表示起始信号,P表示停止信号(起始和停止信号必须由主机发送)。

在这里插入图片描述

拓展

1. Slave如何告诉Master 我要发送message,你该来读了?(大疆一面)
方法一:slave给一个中断信号,通过GPIO触发master,你该读了。
(GPIO, General Purpose Input Output,通用输入输出。既能当输入口使用,又能当输出口使用。
总结:GPIO就是芯片上的一根干啥都行的引脚。怎么用?写软件控制。
输入经常被用作中断信号,通常是边沿触发,但也有可能是电平触发。这些中断可以配置为系统唤醒事件。)

方法二:master读某个寄存器a1内状态,然后根据里面的内容,决定是否读一下a2。比如读到1,就不管;读到2,开始读a2;读到3,开始读a3。
实际上我做的项目有的部分就是这样,很多时候是master隔一段时间读一下某寄存器,读完内部算法计算一下对不对,不对的话要读另一个寄存器看看是啥问题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值