对于嵌入式开发人员来说,I2C属于再也不能熟悉的东西了。在电子产品领域,使用广泛。

简介

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地 使用在系统内多个集成电路(IC)间的通讯。

I2C主要分为SCL与SDA。SCL为串行时钟线,SDA为串行数据线。既然用来传输数据,其速率相关的知识一定少不了。

I2C速率

I2C速率分三种模式:标准,快速以及高速,三者速率分别如下
标准速率:100Kbits/s
快速速率:400Kbits/s
快速模式增强:1Mbit/s
高速速率:3.4Mbits/s

谈及了速率后,我们就进行I2C的谈论,小编还是以项目中测的一组I2C来展开介绍。

I2C时序

在这里插入图片描述

起始与终止

I2c时序分为起始与终止,其均有Master控制。
起始:SCL为高,SDA由1变为0。
终止:SCL为高,SDA由0变为1。
在这里插入图片描述
重复起始条件:和起始条件相似,重复起始条件发送在停止条件之前。主机想继续给从机发送消息时,一个字节传输完成后可以发送重复起始条件,而不是产生停止条件。
在这里插入图片描述

数据的位传输

数据的每次传输都是以字节(8位)为单位,一个字节的传输需要9个时钟周期。

主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,且数据位从高位到低位的顺序进行传输。SDA上的数据必须在SCL为高电平时保持稳定,数据的高低电平的翻转变化发生在SCL为低电平时期。

从下图可以看出
SDA的电平转换永远发生在SCL为低时。
SCL为高时,SDA电平不发生变化。
在这里插入图片描述
在I2C中,前八位往往由Master发送。其中前七位为地址位,第八位为读写位。

I2C的地址位有7bit和10bit两种。对于7bit地址,最多支持寻址127设备(实际情况要考虑负载容值,总容值不允许超过400PF)。对于10bit地址,最多支持1023个设备。
在这里插入图片描述
10bit地址的协议兼容7bit地址的协议。目前用到的地址为7bit的较多,同时第八位为读写位。当第八位为0时,则代表写。为1时,则代表读。

在一些芯片的数据手册中,我们往往会看到类似如下的描述
I2C slave address :(W)OX58H,®OX59H
W代表写,R代表读。
上图则代表0X58。根据十六进制转换为二进制。
0X58=0101 1000
在这里插入图片描述
观察前八位 完全符合。

ACK与NACK

I2C最大的特点就是存在完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。

前八位地址+读/写均由Master发送。在第九个时钟周期内,Master释放总线,把总线控制权交给从机,然而在上拉源的作用下,此时总线为高电平,如果从机收到主机发来的数据为0,将SDA拉低,表示应答响应。
简单描述即:
Slave工作,为ACK。第九位电平表现为低电平。
Slave不工作,为NACK。第九位电平表现为高电平。

当Master确认了Slave是自己想要的Slave后,开始进行8位数据的字节传输。其中,每传输一次8位数据,其后都会紧接着由主机产生的应答信号。直到发送最后进入终止条件,I2C则停止数据的传输,进入空闲状态。

根据读与写,我们大致可以将I2C的传输简单的分为以下两种状态:

I2C写流程

  1. Master发送I2C 7位的地址和写操作位,等待ACK。
  2. Slave发送ACK。
  3. Master发送寄存器地址位,等待ACK
  4. Slave发送ACK
  5. Master发送data。即写入寄存器数据
  6. Slave发送ACK
  7. 反复5 6步,可写入多个寄存器数据
  8. Master发起STOP
    在这里插入图片描述

I2C读流程

  1. Master发送I2C 7位的地址和写操作位,等待ACK。
  2. Slave发送ACK。
  3. Master发送寄存器地址位,等待ACK
  4. Slave发送ACK
  5. Master重新执行起始条件
  6. Master发送I2C 7位的地址和读操作位,等待ACK。
  7. Slave发送ACK
  8. Slave发送8位的data,即寄存器里的值
  9. Master发送ACK
    重复8 9两步,可读取多个寄存器
    直到最终以Master发送NACK,进入终止。
    在这里插入图片描述
    在这里插入图片描述
    如下附上项目中抓取的波形
    在这里插入图片描述

硬件电路设计

I2C的硬件电路设计并不复杂。

I2C的IO口,因其本身属于开漏,不支持高电平的输出,要想拥有高电平,外部必须给与一个上拉源。

上拉电阻的选取,往往在1K-10K。电阻的选取往往对信号的上升沿存在一定的影响。

一般IO口的驱动电流在2-4毫安。上拉源为Vdd。同时,OC与OD的导通电压往往在0.4V左右。

所以通过计算可以得知
Rmin=(Vdd-0.4)/0.003A
Rmax=(T/0.874)*C
其中,I2C速率为100Kbits/s时,T=1us。速率为400Kbits/s时,T=0.3us。 速率为1Mbits/s时,T=0.12us。
(注:在一些电路中,MCU会将上拉进行集成,最终我们所看到的就是外围电路不需要上拉源 )

波形常见的问题

关于小编在以往的项目中I2C 常见的几类问题

  1. SCL上升时间tr大于datesheet标准
    上升时间大,则意味着与标准相比,上升的较为平缓,驱动能力弱。这种问题往往是上拉电阻阻值选择不合理导致的。负载本身含有电容,如果上拉电阻的选取过大,RC延时电路,进而导致上升变得平缓。
    解决办法:减小上拉电阻;软件调节驱动能力。

  2. SDA SCL波形整体略微被抬高,低电平很难接近0V,甚至超过0.4V
    这类问题,存在两种可能性。
    A:测试时,示波器探头未进行校准,导致测试时,出现这类问题。
    B:上拉电阻选取过小导致驱动电流过大。
    解决办法:校准示波器;适当的减小上拉电阻阻值。

  3. SDA信号出现毛刺。
    小编曾在以前的项目中就遇到过。这种问题必须要重视。I2C的每个高电平以及低电平都有特殊含义,如果地址位,写或者应答位的低电平因毛刺的存在,误被识别成高电平,都是会影响到从机的正常工作的。

解决办法:PCB走线包地;SDA信号串小电阻。

  1. I2C地址冲突
    在硬件设计时,我们往往会在一组I2C上挂多组器件。有时稍不注意就会将地址一样的两个设备挂在同一组I2C上。

解决办法:有些芯片带有AD脚,例如smart pa芯片,可根据AD接地或者接电源来改变地址。亦或者回板后,手动返工。

  1. SDA出现短暂脉冲
    I2C中,在master向slave传输8bit数据之后,sda控制权由master交由slave,此时slave控制sda发送一个ack反馈信号,sda为低电平信号,在经过clk为高时接收到sda的低电平信号,在sclk变为低电平时,sda控制权由slave交回到master,在交回过程中有一小段时间sda处于既不由master又不为slave控制的空闲阶段,在空闲阶段sda默认为高电位(因为有上拉电阻),如果master要马上传输低电平,sda将由高电平转为低电平,便产生了一个小的毛刺。
    在这里插入图片描述
    这属于正常现象,不会影响iic通讯。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐