S2.6 iic(上)

S2.6 iic

此文章内容由祁学长提供,我负责修订。 在本篇开始前,我更希望你能看完 这个视频

本章内容为IIC与SPI通信的教学,便于日后使用更多的外部设备 在开始讲解之前,我们先来了解一下他们的作用

IIC协议与SPI协议创造出来的用途

为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室(后被NXP收购)开发了“Inter-Integrated Circuit”,IIC或I2C ,一种只使用二根线接连所有外围芯片的总线协议。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。 SPI总线是微控制器四线的总线协议。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。

内容参考于这篇文章,可以看到,IIC和SPI在最基本的连接所需要的线缆数量上就有所不同,使用场景也不太一样 我们先从连接只需要使用两根线的IIC总线开始讲起

IIC那两根线是干嘛的,它是怎么只使用两根线连接所有外围芯片的?

iic的两条线分别称为 serial data(sSDA)serial clock(scl),即串行数据线和串行时钟线,可以以一种简单的形容来理解它 SDA是一条双向单车道 而 SCL则是收费站上的杆子 数据位就是在车道上的车 一次只能放一辆过去 而所有设备都在这个车道上连接,如何判断信息是哪个芯片发送和接收的呢?这时不妨看看IIC的协议规定

IIC协议规定:

  • 每一支IIC设备都有一个唯一的七位设备地址。
  • 数据帧大小为8位的字节。
  • 数据(帧)中的某些数据位,用于控制通信的开始、停止、方向(读写)和应答机制。

从这部分我们可以看到, IIC设备都有一个唯一的七位设备地址作为唯一标识码,你可以理解为我们需要设备的门牌号来定位要与哪个设备进行交互。 那么,IIC的多设备通信就很直观了,主机在数据线上发送数据,然后对应的从设备接收数据。 但是这里我们需要注意一下,在IIC总线上所有的从设备都会接到消息,但只有地址位对应上的设备才会开始接收 如果出现了多主机同时发出信息的问题就要引入仲裁,但今天的教学暂时不讲解

怎么在8051上使用iic总线?

at89c52并没有硬件IIC外设,所以IIC的时序与数据由GPIO模拟实现(理论模拟的速度不会太高,但IIC本身就是低速通信,比如b站上的纸带IIC(笑))

这时就要看看IIC的数据是如何发送的了

首先,在SDA上,主设备发一个START信号(起始位) ,这个信号提示所有其它设备开始监听总线以准备接收数据。 这个信号是在一个SCL周期内,SDA由1变为0在数据发送的同时,SCL作为时钟信号告诉从设备一个数据位的周期。 IIC总线标准规定:SDA线的数据转换必须在SCL线的低电平期,在SCL线的高电平期,SDA线的上数据是稳定的。 伪代码如下

SCL = 1;
Delay();
SDA = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;

接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。

当所设备接收数据后,比对地址自己是否目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACKNOWLEDGE作回应。

SDA = 1;
Delay();
SCL = 1;
Delay();
SCL = 0;
Delay();
SDA = 1;

当主设备收到应答后便开始传送或接收数据。数据帧大小为8位,尾随一位的应答信号。主设备发送数据,从设备应答;相反主设备接数据,主设备应答。

当数据传送完毕,主设备发送一个STOP信号01,向其它设备宣告释放总线,其它设备回到初始状态。

SCL = 1;
Delay();
SDA = 0;
Delay();
SDA = 1;
Delay();
SCL = 0;

作业

今日进行理论学习,最好是看完开头的视频,明日实战交作业

Licensed under CC BY-NC-SA 4.0