stm入门教程--IIC总线解析(超详细!!!)

IIC总线简介

IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线。主要用于近距离低速芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方的时钟同步;IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。

半双工 意味着IIC既可以发送数据,也可以接收数据,但发送和接收数据这个过程不能同时进行

IIC适用于近距离的通信,如果说想进行一些长距离的传输,比如几十米、几百米、几千米的传输,用IIC是不合适的,IIC抗干扰能力差一些,所以距离一长的话可能会出现一些错误

IIC传输的速度比较低,比如想传输一些视频,这种对带宽要求高的,用IIC也是不行的;一般应用在一个电路板上,假设有多个芯片,芯片之间想进行简单的数据交互,这种情况使用IIC的会比较多。

 如果有两个芯片想通过IIC进行通信的话,硬件连接也很简单,分别把两个芯片的SCL连接到SCL总线,SDA连接到SDA总线上,两个芯片连接好之后就可以用IIC去进行通信了。

IIC在真正项目开发的时候,用的是特别特别多的,也是咱们在面试的时候经常会问到的一个总线协议。

IIC总线是一种多主机总线,连接在IIC总线上的器件分别为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每一个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机,也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他期间的正常工作,IIC总线在通信时总线上发送数据的旗舰作为发送器,接收数据的旗舰作为接收器。

在UART通信中,A设备的tx与B设备的rx相连,B设备的tx与A设备的rx相连,彼此之间是点对点的通信,A发送肯定是发给B,B发送肯定是发给A。

而IIC总线是一种多主机总线,一条IIC总线上可以挂很多很多的芯片或者很多很多的器件,所以,IIC并不是点对点的通信,在这上面可以有很多的芯片或器件。

这些器件可以分为主机和从机,我们举例来说,比如一条电话线上挂满了很多很多电话,作为主机的电话,它有权利拿起电话,去给别人打电话,电话打完以后,主机也有这个权力去把这个电话挂掉;而从机不能主动的去给别人打电话,打完电话以后也不能去主动的挂断,它只能等待被主机呼叫和被主机挂断。

而作为多主机总线,就有可能会出现多个主机同时启用总线,那我们总线只有一条,那多个主机想用,就会发生冲突,所以IIC里有冲突检测的功能,如果检测到冲突,它就可以去仲裁,去选择一个谁来用这条总线,没有被选中的,就只能等会儿再用,这种功能就可以来防止错误的产生。

每一个连接到IIC总线的器件都有一个唯一的地址,大家来想想,在咱们通信的时候一个东西为什么要有地址,比方说ip地址,那地址的作用就是为了去区别不同的主机,比如说,电脑甲想发送一个地址给电脑乙,那我们要怎么确定我们发送的是给电脑乙而不是给了其他的电脑?每个电脑上都有一个ip地址,那我们发送到指定的ip就能把数据发送到指定的电脑上了。那IIC也是一样的,一条总线上连有多个主机,在通信的时候肯定是其中的某一个芯片去给其中的另一个芯片通信,而IIC上每一个芯片都有一个确切的地址,就是为了区别不同的芯片。

IIC总线通信过程

宏观上

假设我们把A作为主机,向地址为0x02的从机发送数据

1、主机A向总线发送一次起始信号启用总线(表示一次通信的开始)

该信号一发送,其他的主机和其他的从机都能够接收到该信号,所以此时同样为主机的单片机B就不会再去启用总线,其他从机就可以知道已经有主机发起通信了,从此之后,总线就处于被占用的状态。

2、主机发送一个字节数据,指明从机地址和后续字节的传送方向

一条总线上会有很多个从机,主机启用完总线后,会发送一个数据表明要和哪个从机进行通信

以地址为0x02的从机为例

 一个字节有八位数据,前七位作为从机的地址,第八位作为数据的传送方向,IIC为半双工通信,所以主机可以给从机发送数据,从机也可以给主机发送数据,我们前面的假设为主机向从机发送,所以第八位数据传送方向的数据应为0。

所以在主机发送数据后,各个从机都会把数据的高七位提取出来,去和自己的地址作比较,如果比较结果和自己地址结果不相同,则不做任何回应和反应,;如果比较结果和自己的地址相同,会再往下确认第八位地址,确认自己是接收数据还是发送数据

3、被寻址的从机发送应答信号回应主机

这个过程就有点类似于军训过程中,教官喊:1号,1号同学回应喊:到!

而在我们单片机IIC协议中,主机喊从机,从机给对应主机回应,这样主机才能确认有我们想要的这个从机,并且从机已经听到了我们的呼叫。

在IIC中,从机确认主机发送的地址和本身地址相同后,会向总线往主机发送应答信号,表示,我在,并且我听见了

4、发送器发送一个字节数据

5、接收器发送应答信号回应发送器

这里的发送器和接收器具体对象是谁并不是固定的,比如我们前面的假设,单片机A向地址为0x02的器件发送数据,这种情况下发送器就为单片机,接收器为0x02的器件,那假设主机第一次发送1字节数据时,最后一位为1,那这种情况,后续对应的发送器就是主机发送第一次1字节数据高7位所对应地址的器件,接收器就为该主机。

所以 具体发送器和接收器是指哪个器件,是由发送的第1字节数据最后一位数据决定。

、、、、、、(循环步骤4、5,直到数据发送完毕)这期间可以发送任意多个字节的数据

n、通信完成后,主机发送停止信号释放总线

通信完成后,向总线发送停止信号,该信号其余主机也能收到,此时其余主机就知道总线已经空闲了,如果想去发送数据,就可以去启用总线了。

停止信号发出后,从机就能知道这次通信结束了。

IIC总线的寻址方式

 IIC总线上传送的数据是广义的,既包括地址,又包括真正的数据

IIC总线信号实现

 IIC通信过程中,一共涉及4种信号

1、主机发送起始信号启用总线

2、主机发送一个字节数据、、、、

3、被寻址从机发送应答信号、、

4、通信完成后主机发送停止信号、、、

起始信号和停止信号

(IIC的两条总线在空闲状态下默认高电平)

SCL为高电平时,SDA由高电平变低表示起始信号

SCL为高电平时,SDA由低电平变高表示停止信号。

起始信号和停止信号都是有主机发出,起始信号产生后总线处于占用状态,停止信号产生侯总现处于空闲状态。

字节传送与应答

IIC总线通信时每个字节长度为8位,数据传送时,先传送最高位,后传送最低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧共有9位

如图,发送器发送完数据,接收器接收,接收器发送完发送器发的8位数据后,需要再发1位应答位,该位置为低电平0,表示接收到数据,若该位为高电平1,则为非应答状态。

同步信号

 假设A、B是两个不同的芯片,A要向B发送数据,那就是要把数据放到SDA总线上,B从SDA上接收数据,但是AB是两种不同的器件或两种不同的芯片,那B怎么知道A什么时候发送数据呢?那如果B不知道A什么时候发送数据就会出现一种情况,A数据发送了半天,B不知道,或B没接收到,或者B去接收信号的时候A还没发送。

所以AB两个不同器件在通信之前,一定要保证一件事,知道发送器什么时候发送数据,要不然数据就会接收不到。

那大家再来看一组数据,假设A要向B发送一组数据10  那就是高电平后置位低电平

那如果假设A要向B发送1100,那对应的波形是不是也是高电平后置位低电平,那B要如何来判断到底是10 还是1100呢?

我们来看下IIC是如何解决这两个问题的

IIC在每次通信之前都会发送一个起始信号,来通知接收器要接收数据了,

那具体IIC要如何区别1个高电平还是两个高电平呢?

在IIC中有两条数据线,一条数据线SDA用来传输数据,一条SCL就是用来保证收发双方的时钟的同步。

IIC总线在进行数据传送时,时钟线SCL为低电平期间,发送器像数据线上发送1位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取1位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是lamune

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值