嵌入式常见协议:IIC详细讲解

目录

简介

主要特性

硬件结构

总线结构

总线的高低

时序

1)开始和结束信号

2)数据有效性

3)字节格式

4)应答信号

7-bit设备的数据传输

1)主机写-从机收

2)主机收-从机发

10-bit设备的数据传输

1)10-bit 设备的写

2)10-bit 设备的读

应用

简介

IIC它是一种串行通信总线,使用多主从架构,使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA,属于半双工协议。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

主要特性

  • IIC用2根信号线通信:串行数据线 SDA、串行时钟线 SCL;
  • IIC总线上所有器件的SDA、SCL引脚输出驱动都为 开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系;
  • 总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为由生产厂家制定的设备类型地址,低3位为器件引脚定义地址(由使用者定义);10位地址不常见;
  • 任何时刻都只存在简单的主从关系,按数据传输的方向,主机可以是主发送器或主接收器;
  • 支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
  • IIC总线上所有器件都具有“自动应答”功能,保证数据传输的正确性; 主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
  • IIC总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)
  • IIC总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信; 支持传输速率包括:

模式

速率

标准模式(Standard Mode)

100kb/s

快速模式(Fast Mode)

400kb/s

增强快速模式(Fast Mode Plus)

1Mb/s

高速模式(High Speed Mode)

3.4Mb/s

极速模式(Ultra-FastMode)

5Mb/s

硬件结构

总线结构

IIC要求两根线都使用 开漏输出接上拉电阻 的配置,以此实现总线上所有节点SDA、SCL信号的 线与 逻辑关系。

Rp电阻的取值有一定的要求,太小会导致灌入电流过大,使’低’数据不稳定,甚至损坏端口;太大会导致信号上升缓慢,使得数据传输出错。

总线的高低

  • 拉低:设备的逻辑电路控制FET打开,总线通过导通的FET连接到GND从而被拉低
  • 拉高:设备的逻辑电路控制FET关闭,总线通过上拉电阻Rp连接到VDD从而被拉高

时序

1)开始和结束信号

开始信号(START/S): SCL为高时,SDA从高到低的跳变产生开始信号

结束信号(STOP/P)  : SCL为高时,SDA从低到高的跳变产生结束信号

重复开始信号(ReSTART/Sr): 在结束时不给出STOP信号,而以一个时钟周期内再次给出开始信号作为替代

2)数据有效性

IIC 的数据读取动作都在 SCL为高 时产生,SCL为低时是数据改变的时期,当SCL为高时,数据应当保持稳定,避免数据的采集出错。

3)字节格式

SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前 。

4)应答信号

协议规定数据传输过程必须包含应答(ACK)。接收器通过应答告知发送的字节已被成功接收,之后发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括用于应答的第9个时钟。发送器在应答时钟周期内释放对SDA总线的控制,这样接收器可以通过将SDA线拉低告知发送器:数据已被成功接收。

  应答信号分为两种:

    1)当第9位(应答位)为 低电平 时,为 ACK  (Acknowledge)   信号

    2)当第9位(应答位)为 高电平 时,为 NACK(Not Acknowledge)信号

  主机发送数据,从机接收时,ACK信号由从机发出。当在SCL第9位时钟高电平信号期间,如果SDA仍然保持高电平,则主机可以直接产生STOP条件终止以后的传输或者继续ReSTART开始一个新的传输

  从机发送数据,主机读取数据时,ACK信号由主机给出。主机响应ACK表示还需要再接收数据,而当主机接收完想要的数据后,通过发送NACK告诉从机读取数据结束、释放总线。随后主机发送STOP命令,将总线释放,结束读操作。

7-bit设备的数据传输

在START信号后的首字节由7位从机地址和1位读写位组成,结构如下图。

发送完这个字节之后,主机释放SDA总线等待从机给出ACK应答。如果从机给出了ACK应答,表示从机地址正确(有从机响应)并且已知晓是读还是写,便可以开始读写数据。如果从机没有给出ACK应答,则说明接收设备可能没有收到数据(如寻址的设备不存在或是设备正在忙碌)或无法解析收到的数据,如果是这样,则由master来决定如何处理(STOP或ReSTART)。

一个完整的7-bit通信过程如图所示:

1)主机写-从机收

主机对从机发送数据时,主机对从机发送一个开始字节,然后即可一直发送数据。以示例来讲解,其第一帧数据为要操作的寄存器地址,所以为:“[1-Byte]开始字节(写) + [1-Byte]寄存器地址 + [1-Byte]寄存器数据”。

2)主机收-从机发

主机对向从机读取数据时,方式同发送数据有所不同,要多一次通信过程。

主机需要先向从机发送一次信号,告诉从机”我要读取数据“,然后重开一次通信,等待从机主动返回数据。以示例来讲解,发送 “[1-Byte]开始字节(写) + [1-Byte]要读取的寄存器的地址”,之后结束通信,或者重开始,来进入到第二次通信中,先发送 [1-Byte]开始字节(读),然后等待读取从机发送过来的 [1-Byte]数据 即可。

10-bit设备的数据传输

随着IIC设备日益增多,7位的从机地址逐渐不能满足使用,于是从机地址从7位扩充到了10位。7位和10位地址的设备可以共存于同一个I2C总线系统互不冲突,展现了良好的兼容性。

10-bit 地址的IIC设备需要 2-Byte 来传输从设备地址信息,所以采用了这样的设计:第一个字节为 1111 0 + 地址高两位(第10、9bit) + 读写控制位,第二个字节为从设备地址低8位,除此之外与7-bit设备相同。因为 “1111 0xx” 为 IIC 中特地保留的16个特殊指令地址中的一个,所以7-bit设备不会响应该首字节的呼叫,只有10-bit设备会响应,从而实现良好兼容。

1)10-bit 设备的写

10-bit设备的写过程如下图示例,除地址部分外与7-bit相同。

2)10-bit 设备的读

10-bit设备的读过程如下图示例,需注意的是,第二次通信过程无需再次发送第2Byte地址。

应用

实战可以参考这一篇文章

嵌入式协议应用:STM32硬件IIC驱动OLED屏幕显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值