对于嵌入式开发人员来说,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写流程
- Master发送I2C 7位的地址和写操作位,等待ACK。
- Slave发送ACK。
- Master发送寄存器地址位,等待ACK
- Slave发送ACK
- Master发送data。即写入寄存器数据
- Slave发送ACK
- 反复5 6步,可写入多个寄存器数据
- Master发起STOP
I2C读流程
- Master发送I2C 7位的地址和写操作位,等待ACK。
- Slave发送ACK。
- Master发送寄存器地址位,等待ACK
- Slave发送ACK
- Master重新执行起始条件
- Master发送I2C 7位的地址和读操作位,等待ACK。
- Slave发送ACK
- Slave发送8位的data,即寄存器里的值
- 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 常见的几类问题
-
SCL上升时间tr大于datesheet标准
上升时间大,则意味着与标准相比,上升的较为平缓,驱动能力弱。这种问题往往是上拉电阻阻值选择不合理导致的。负载本身含有电容,如果上拉电阻的选取过大,RC延时电路,进而导致上升变得平缓。
解决办法:减小上拉电阻;软件调节驱动能力。 -
SDA SCL波形整体略微被抬高,低电平很难接近0V,甚至超过0.4V
这类问题,存在两种可能性。
A:测试时,示波器探头未进行校准,导致测试时,出现这类问题。
B:上拉电阻选取过小导致驱动电流过大。
解决办法:校准示波器;适当的减小上拉电阻阻值。 -
SDA信号出现毛刺。
小编曾在以前的项目中就遇到过。这种问题必须要重视。I2C的每个高电平以及低电平都有特殊含义,如果地址位,写或者应答位的低电平因毛刺的存在,误被识别成高电平,都是会影响到从机的正常工作的。
解决办法:PCB走线包地;SDA信号串小电阻。
- I2C地址冲突
在硬件设计时,我们往往会在一组I2C上挂多组器件。有时稍不注意就会将地址一样的两个设备挂在同一组I2C上。
解决办法:有些芯片带有AD脚,例如smart pa芯片,可根据AD接地或者接电源来改变地址。亦或者回板后,手动返工。
- 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通讯。