首页/文章/ 详情

嵌入式学习(十七)—I2C协议介绍(一)

1年前浏览5307

文章概述

一、I2C总线定义

二、工作原理

三、通信过程

四、I2C通信的优缺点

背景

昨天跟做技术的朋友在聊天,他问我,你搞硬件的了解通讯协议吗?

答:硬件肯定要懂通讯协议了,I2C,SPI,UART,CAN...

问:那你给通俗的讲讲I2C协议

答:I2C协议我研究了好多遍了,你有什么问题尽管问

问:I2C和SPI有什么区别?

答:I2C总线只需要2根线,SPI需要3~4根线,且SPI需要一根片选CS,两者的通信速率相差比较大,I2C标准最高通信400kbps,SPI可以达到10Mbps

问:知道I2C速度为什么提不上去吗?上拉电阻最小值如何计算出来的?

答:我猜是总线的对GND电容导致的,上拉电阻都是取的经验值...

经过这次讨论,我发现,我对I2C了解的程度并没有那么深,所以还是老老实实的记一下笔记。

一、I2C总线定义        

        要搞清楚一种总线,就跟了解一件事情的来龙去脉一样,首先要弄清楚由来。

I2C是Inter-Intergrated Circuit的简称,英文翻译过来是:内置集成电路。为什么I2C是内置集成电路?I2C总线是由Philips公司在80年代初开发的一种简单、双向二线制同步串行总线,为了让主板、嵌入式系统用以连接低速的周边设备而发展的,从这个字面上意思上来看,I2C是一种低速率的串行总线,为了解决低速设备接入高速设备而存在的。

I2C可以写成I²C、IIC,I2C之所以被广泛应用,因为这种通信总线比较简单,物理上只需要两根线--串行数据线(SDA)和串行时钟线(SCL),即可在连接于总线上的器件传送信息。这里说明一点,I2C仅限于板级间走线,因为通信距离受到一些参数限制,比如总线的负载电容、总线上的电流等等。 既然是双方或者多方通信,肯定会有发起的一方。我们将发起通信的这一方称为主器件,主器件用来启动总线传送数据,并产生时钟,数据在时钟脉冲的作用下,去寻址从器件。此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据的传输方向。主机负责产生时钟和终止数据传送。

二、工作原理

下图是I2C总线电路的结构分析,虚框内是IC内的电路,虚框外是外部电路。

从上图可以看出:I2C两根线:一根串行时钟线SCL、一根串行数据线SDA,且两根线对应到器件的两个pin均是双向的,也就是说主器件和从器件不是恒定不变的。

Pin脚的电路结构为开漏输出(开漏输出的典型特点是需外接上拉电阻才能对外输出高电平),所以需要通过上拉电阻接电源VCC,保证总线空闲时两根线都是高电平,且能够实现高低电平的变化。总线在传输数据时,当SCL电平为高时,SDA数据有效,且需要保持一定的时间;当SCL为低电平时,SDA数据无效,允许变化。

I2C总线有主从之分,连接总线的外部器件也都是CMOS器件,输出级也都是开漏电路,在总线上消耗的电流很小,这样保证I2C总线不需要太大的电流驱动能力。但I2C总线上可扩展的器件数量主要是由电容负载来决定,因为每个器件的总线接口都有一定的等效电容,而线路中电容会影响总线传输速度,当电容过大时,有可能造成传输错误。所以需要根据不同的负载电容去估算支持的最大从设备数量。I2C总线的电容负载能力为400pF(通过驱动扩展可达到4000pF),每一个器件的输入都相当于一个等效电容,由于I2C总线扩展器件的连接方式为并联,因为I2C总线的等效电容等于每个器件的等效电容之和,等效电容存在会造成传输信号波形的畸变,在超出范围时,会导致数据传输出错。

由上图可以看出,Rp是上拉电阻,CL就是该器件I2C接口的对GND电容,上拉电阻Rp计算方式:(VDDmax-UINLmax)/Rpmin< (2~4)mA(I/O口的灌电流)其中:VDDmax:电源电压的最大值,UINLmax:I/O口上允许的低电平的最大值(CMOS电路结构中UINL<=0.7V)

举例:评估出一个最小的上拉电阻阻值

已知:电源电压VDD=5V±%10,IO端口的驱动能力为3mA,UINmax=0.7V,则最小的上拉电阻计算如下:

(VDDmax-UINmax)/Rpmin<3mA    代入数据,得Rpmin=1.6k;

上拉电阻Rp的最大值计算

总线电容是线路连接和管脚的总电容,它决定了Rp的最大值

1)标准模式:每条总线线路的最大电容负载都为400pF,且Tr<300ns;

2)快速模式:每条总线线路的最大电容负载都为200pF,且Tr<300ns;

I2C的速率:

标准模式SM(Standard mode):100kbit/s,

快速模式FM(Fast mode):400kbit/s,

快速+模式(Fast mode Plus):1Mbit/s

高速模式HS(High-speed mode):3.4Mbit/s

快速模式器件的输入有抑制毛刺的功能,SDA和SCL输入有施密特触发器;

快速模式器件的输入缓冲器对SDA和SCL信号的下降沿有斜率控制功能;

如果快速模式器件的电源电压被关断,SDA和SCL的I/O管脚必须悬空,不能阻塞总线;

评估I2C总线一个最大的上拉电阻阻值方法

I2C端口输出高电平是通过Rp上拉到VDD实现,线上电平由低到高的变化,电源通过Rp对线上负载电容Cl充电,从低电平切换到高电平,是需要一定时间的,即上升时间,这个上升时间可以近似用充电时间常数Rp*Cl表示,瑞昱100kbit/s速率应用,信号上升时间小于300ns,假设线上的Cl为20pF,计算出对应的Rp值为17k。(计算公式:Rpmax=tr/(0.8473*Cb)),tr为上升时间,Cb为总线电容。最大的Rpmax是变化的,需要根据实际的Cb计算。

如果Rp*Cl充电时间常数过大,将是信号上升沿变化缓慢,达不到传输数据要求;如果Rp太小,则会增大端口的sink电流,在可能的情况下,Rp取值大要一些,以减少好点。

电路干扰:在I2C设备的电源入口处要加滤波电容,一般加10nF或100nF;SDA和SCL上如果有干扰,要做滤波处理,总线上串接几十欧姆的电容,对地加几十pF电容;

三、通信流程

I2C通信特征总的来说,主要是同步串行通信、非差分、低速率。

I2C的在数据传输过程中共有三种类型的信号:开始信号START,结束信号END,应答信号ACK/NACK.

开始信号:SCL为高电平时,SDA由高电平跳变为低电平,表示开始通信;

停止信号:SCL为高电平时,SDA由低电平跳变为高电平,表示结束通信;

应答信号ACK(NACK):在接收数据的IC在接收到一个字节数据后,向发送数据的IC发出特定的低电平脉冲(NACK是高电平脉冲,应答信号一般是在第9个时钟传输),表示已经收到数据。开始和结束信号都是由主机发车,应答信号是由从机发出。

数据的有效性:当开始传输数据时,I2C是在SCL为高电平时采样,所以SDA线上的数据必须在时钟SCL高电平周期内保持稳定的高电平或者低电平状态,否则会导致通信失败。同样,只有在SCL线上的时钟信号是低电平时,SDA线上的电平才能改变。

空闲状态:SCL,SDA线上都是高电平。

ACK/NACK说明:

1.主机向从机发送数据,从机无法接收或者无法识别解析数据时,会发送NACK;

2.从机向主机发送数据,主机不想接收了,主机会发送NACK,这时从机释放SDA总线,好让主机接下来发送STOP信号。

发起通信的流程

首先主机会线拉低SDA总线,标志我要开始通信了,接下来主机会发送 7bit的地址+1bit的读写位 如果某个从设备地址和主机发的地址吻合,就会发出一个ACK信号,通信就此建立。之后的读写操作,要具体看从设备的通讯规范,比如读一个寄存器可能要如下操作:

图中,灰色表示主机发送,白色表示从机发送。主机之所以如此发送数据,是根据从机的通信手册来的,并不是标准的I2C协议规定的,主机并不知道这些数据的意义,只有从机知道。

传输步骤

1.在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信

2.主机想总线发送要与之通信的从机的7位或者10位地址,以及读写位。

3.每个从机将主机发送的地址与自己的地址进行比较,如果地址匹配,则从机将SDA线拉低一位,返回一个ACK位,如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。

4.主机发送或接受数据帧:

5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认成功接收到该帧。

6.随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。

以上是单个字节的传输步骤详解,多字节的读写和页写,后面我们根据代码再介绍。

四、I2C通信优缺点

与其他通信协议相比,I2C听起来很复杂,以下是其优缺点的总结。

优点

  • 仅使用两根线

  • 支持多个主机和多个从机

  • ACK/NACK位用于确认每个帧都已成功传输

  • 硬件比UART更简单


缺点

  • 数据传输速率比SPI慢

  • 数据帧的大小限制为8位


来源:不懂幽默的秦二
电源电路通信控制SCL
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-21
最近编辑:1年前
点墨设计
本科 | 高级硬件工程... 十年饮冰,难凉热血!
获赞 0粉丝 6文章 48课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈