当前位置:文档之家› I2C总线

I2C总线

I2C总线
I2C总线

1. I2C上拉电阻取值问题

2. I2C_示波器波形分析

3. I2C总线介绍

漏极开路上拉电阻取值为何不能很大或很小?

如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β

如果上拉电阻过大,加上线上的总线电容,由于RC影响,会带来上升时间的增大(下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢),而且上拉电阻过大,即引起输出阻抗的增大,当输出阻抗和负载的阻抗可以比拟的时,则输出的高电平会分压而减少。

I2C的上拉电阻可以是1.5K,2.2K,4.7K,电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K或2.2K

(实验:接入200K上拉电阻,结果观察到信号上升时间增大,方波变成三角波)

I2C上拉电阻确定有一个计算公式:

Rmin={Vdd(min)-o.4V}/3mA

Rmax=(T/0.874) *c, T=1us 100KHz, T=0.3us 400KHz

C是Bus capacitance

Rp最大值由总线最大容限(Cbmax)决定,Rp最小值由Vio与上拉驱动电流(最大取3mA)决定;

于是Rpmin=5V/3mA≈1.7K(@Vio=5V)或者2.8V/3mA≈1K(@Vio=2.8V)

Rpmax的取值:参考周公的I2C总线规范中文版P33图39与P35图44

标准模式,100Kbps总线的负载最大容限<=400pF;快速模式,400Kbps总线的负载最大容限<=200pF,根据具体使用情况、目前的器件制造工艺、PCB的走线距离等因素以及标准的向下兼容性,设计中以快速模式为基础,即总线负载电容<200pF,也就是传输速度可以上到400Kbps是不成问题的。于是Rpmax可以取的范围是1.8K~7K @ Vio=5V对应50pF~200pF 根据Rpmin与Rpmax的限制范围,一般取5.1K @ Vio=5V , 负载容限的环境要求也容易达到。在2.8V系统中,console设计选3.3K,portable/handset等低供耗的设计选4.7K牺牲速度换取

电池使用时间

总的来说:电源电压限制了上拉电阻的最小值;负载电容(总线电容)限制了上拉电阻的最大值

补充:在I2c总线可以串连300欧姆电阻RS可以用于防止SDA和SCL线的高电压毛刺: I2c从设备的数量受总线电容,<=400pF的限制

上拉电阻阻值的确定

由于I2C接口采用Open Drain机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的!

RP不宜过小,一般不低于1KΩ

一般IO 端口的驱动能力在2mA~4mA量级。如果RP阻值过小,VDD灌入端口的电流将较大,这样会导致MOS管不完全导通,有饱和状态变成放大状态,这样端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V);如果灌入端口的电流过大,还可能损坏端口。故通常上拉电阻应选取不低于1KΩ的电阻(当VDD=3V时,灌入电流不超过3mA)。

RP不宜过大,一般不高于10KΩ

由于端口输出高电平是通过RP实现的,线上电平从低到高变化时,电源通过RP对线上负载电容CL充电,这需要一定的时间,即上升时间。端口信号的上升时间可近似用充电时间常数RPCL乘积表示。

信号线负载电容(对地)由多方面组成,包括器件引脚、PCB信号线、连接器等。如果信号线上挂有多个器件,负载电容也会增大。比如总线规定,对于的400kbps速率应用,信号上升时间应小于300ns;假设线上CL为20PF,可计算出对应的RP值为15KΩ。

如果RC充电时间常数过大,将使得信号上升沿变化缓慢,达不到数据传输的要求。

因此一般应用中选取的都是几KΩ量级的上拉电阻,比如都选取4K7的电阻。

小阻值的RP电阻增大了端口Sink电流,故在可能的情况下,RP取值应稍大一点,以减少耗电。另外,通产情况下,SDA,SCL两条线上的上拉电阻取值是一致的,并上拉到同一电源上。PCB布局布线与抗干扰设计

I2C信号线属于低速控制线,在手机PCB设计时,按通常的控制IO对待即可,无需做特别的

保护设计,一般不用担心受到噪声源干扰。

但在一些特定的情况下,比如折叠、滑盖机型中,I2C的两根信号线需要通过转轴或滑轨处的FPC,此时由于信号路径比较长,距离天线比较近,而且Open drain的输出级对地阻抗大,对干扰比较敏感,因此比较容易受到RF信号源的干扰。在这种情况下,就应适当注意对I2C 信号线的保护。比如I2C两条信号线(SDA,SCL)等长度地平行走线,两边加地线进行保护,避免临近层出现高速信号线等。

上拉电阻应安置在OD输出端附近。当I2C总线上主从器件(Master & Slave)两端均为OD 输出时,电阻放置在信号路径的中间位置。当主设备端是软件模拟时序,而从设备是OD输出时,应将电阻安置在靠近从设备的位置。

I2C协议还定义了串联在SDA、SCL线上电阻Rs。该电阻的作用是,有效抑制总线上的干扰脉冲进入从设备,提高可靠性。这个电阻的选择一般在100~200ohm左右。当然,这个电阻并不是必须的,在恶劣噪声环境中,可以选用。

比如常用的FM 接收模块或者Capsense触摸感应功能块,都是通过I2C接口控制的。I2C接口信号从处理器出发,经过PCB上的信号路径,进入上述电路单元。I2C信号线上载有一定干扰,这种干扰虽然幅度并不很大,但还是会影响敏感的FM接收模块或Capsense触摸感应功能块。此时,可以通过在靠近FM模块或触摸感应模块的I2C信号线上串接Rs电阻,即可有效降低干扰的影响。此外,上拉电阻端的电源也要进行退耦处理。

软件模拟I2C时序

由于一般的I2C应用速率并不高(400kbps),使用处理器的IO口模拟I2C波形,完全可以胜任(处理器一般担任Master,占有I2C通信的控制权,无需担心随机的I2C通信服务中断其他任务的执行)。

处理器分配给I2C任务的IO口,要求可以输出高低电平,还能配置为输入端口。处理器根据总线规范以及从设备的时序要求,利用2条IO信号线,模拟I2C接口时序波形,进行I2C 通信。

处理器发送数据时,通过IO口输出高电平,上升时间基本与外部上来电阻阻值无关,且比用外部上拉电阻上拉到高电平快很多。处理器在接受数据时,即便上拉电阻阻值选的大一些,从设备输出数据的波形上升沿缓慢,但由于处理器使用软件采样的而非硬件采样,因此,对数据传输的结果并不影响。也就是说,使用IO口模拟I2C时序时,上拉电阻阻值可以适当选的大一些。

需要指出的是,使用软件模拟最多只能完成单Master的应用,对于多Master应用,由于需要进行总线控制权的仲裁管理,使用软件模拟的方法很难完成。

I2C总线空闲的时候,两条信号线应该维持高电平。否则,上拉电阻上会有耗电。特别是在上电过程中,IO线上电平也应保持在高电平状态。也就是说:当Master的I2C使用的是IO 软件模拟时,一定要保证该两个IO上电默认均为输入(或高阻)或者输出高电平,切不可默认为输出低电平。IO默认为输入时,可以通过外部上拉电阻将I2C信号线拉至高电平。

I2C应用中上拉电阻电源问题

在部中分应用中,还存在主从设备以及上拉电阻电源不一致的情况,比如Camera模组。在很多设计方案中,Camera模组不工作时,并不是进入Power Down模式,而是直接关闭模组供电VDDS。此时,处理器与模组相互连接的所有信号线都应该进入高阻态,否则就会有电流漏入模组;而对于此时的I2C控制信号线来说,由于上拉电阻的存在,必须关断上拉电阻电源VDDP。如果上拉电阻使用的是系统电源VDDM(VDDP=VDDM),无法关闭,就会有漏电流进入模组;因此这种情况下,应该使用VDDS作为上拉电阻电源(VDDP=VDDS),这样上拉电阻电源与Slave电源即可同时关闭,切断了漏电路径。

另外需要注意的是,在上述应用实例中选择的IO,应该选取上电默认为输入(或高阻)才行。

I2C设备调试及波形分析

最新在开发OLED屏驱动,需要用到I2C总线,下面大体上讲解一下I2C设备的调试及波形分析,为大家做一些参考,由于刚涉及这部分内容,因此有什么错误的,还请赐教~

一、概要

I2C总线只需要两条线,一条SDA数据线,一条SCL时钟线;根据这两条线的高低电平、上升沿、下降沿就可以实现主机与I2C设备的通讯;其中有:

(1)I2C总线相关

传输开始条件:SCL处于高电平,SDA下降沿时;

传输接收条件:SCL处于高电平,SDA上升沿时;

传输数据:开始传输后,SCL处于高电平时,SDA的数据为所传输的数据;

回应:当传输完一个字节后,I2C设备需要回应一个ACK,这样主机才继续发送;因此回应信号是在传输完8bit后的下一个数据位(SDA值),当SDA为0表示有回应,为1表示没回应;

正常I2C总线的数据是:Start + I2C devece id + R/W + ACK + Data(first byte)+ ACK + ... + Data (n)+ ACK + Stop

(2)I2C设备相关

设备地址:有7位和10位两种,具体见I2C设备芯片的DataSheet,由于目前用到的是7位,因此下面主要针对7位讲述;在讲I2C设备地址是有可能有两种说法,主要是用8位表示还是用7为表示,比如对于我的OLED来说,当用8位表示时则为0x78地址,当用7位时则为0x3c(即0x78右移1为),在驱动中用0x78还是用0x3c要看具体平台的I2C总线驱动,我在AMLOGIC平台上用的是0x78,而在MV平台上用的是0x3c;

寄存器reg:一般的I2C设备芯片都有带reg,一般在传输正式的数据之前需要先传输reg地址,比如我的OLED来说,在传控制命令时需要先发送0x00的reg地址,在传输数据时需要发送0x40的reg地址;

二、调试及波形分析

一般当我们拿到一个I2C设备时,就必须涉及到驱动的编写,就比如对于OLED来说,就要用编写OLED驱动,这样我们才能控制它,对于OLED屏来说,第一步也是最重要的一步就是点亮它;当我们做完这一步,那后面剩下的就只是细节问题了;”万事开头难“,这句话真的不假,对于OLED来说,如何才能点亮,我们该怎么调试呢?当我们写完OLED驱动,但OLED屏还是不亮,可能问题会出现在哪?是硬件问题还是软件问题?;若为软件问题,那会是I2C总线驱动问题,还是我们I2C设备驱动有问题?那么我们该如何判断问题出现位置呢?这就需要我们对I2C总线上的数据进行分析;那么下面我将详细讲述如何获取和分析I2C总线上的数据;

(1)示波器

对于I2C总线的数据,我们要用到示波器,这样我们才能抓取到信号,而且必须同时采集SDA 和SCL的数据;该如何抓取呢?我这边的方式是将示波器调成边下降沿触发模式(因为开始信号是SDA下降沿),并且设置成单次模式(这样抓取完一次就会stop,便于我们数据分析);(2)波形

由于我的OLED设备的地址是0x78(8位),而第一次我必须将OLED设置成off状态,通过命令表可以查到,必须发生0xAE,而刚刚有讲到在发送命令前必须先发送寄存器reg地址,即0x00;于是我发送的数据为0x78+0x00+0xAE;下面是我用示波器抓取到的波形:

分析(其中黄色的为SDA信号,浅蓝色为SCL信号):从上述波形中我们可以读取到数据依次是:01111000 0 00000000 101011100;即:0111100(7位OLED设备地址) + 0( 读写为,0为写,1为读)+0(ACK回应)+00000000(寄存器reg)+ 10101110(0xAE OLED off命令);(这里还有一点我还没弄明白就是reg后没有回应,还望大家不吝赐教)

下面当我来随便发送一个地址时,比如当我发送0x56(8位地址),测到的波形如下:

分析:从波形可看出数据依次为:010101101 即0101011(设备地址)+0(读写位)+1(NACK 无应答),由于没有相应的I2C设备因此无应答ACK信号,于是就停止传输;

三、总结

由以上可知,可以通过查看I2C总线数据来确认跟踪I2C设备,已更好地确定是软件问题还是硬件问题;

用示波器对单片机I2C时序进行图形波形分析的试验小结

I2C的概念原理网上都有就不说了,这里只把我把两个开发板通过I2C通讯的调试经验记录分享一下。

I2C要求要有一个主设备,负责发起请求和控制时钟;其它为从设备,通过设备ID地址来识别并响应主设备请求。主从设备要轮流控制SDA。一开始我没搞明白这一点,直接加了写I2C 数据代码,然后用示波器在SDA和SCL脚测量,却只能找到些凌乱的波形,没有预期的效果。后来把从设备接上,两边写好代码,互相有了响应,这才在示波器上看到波形。

这里我找了一个主设备往从设备写数据的例子,代码如下:

char buf[128];

int len;

strcpy(buf,"..huz_hello_i2c/n");

len=strlen(buf);

//deviceid: 0x3c

write_i2c(0x3c, buf , len);

接收端的代码比较简单,就不贴了。

将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:

从图中可知时序如下:

由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;

接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;

接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;

接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;还有其它数据和最后的停止位,图中被截掉了。

从图中可知,纵向一格是200mV,则SDA和SCL的电平大概就是350mV;由于信号笔上设置了信号x10,因此实际电平应该大概是3.5V(理论上应该是3.3V)。横向一格是25us,10个时钟周期大概用了4格,即4x25us=100us,平均每个时钟周期是10us,可算出传输频率为1/10us=100,000/s,即100k bps。

另外,对于读从设备内容,基本流程是主设备先往从设备写一个命令,然后再输出读取命令,然后才由从设备发送数据。过程类似,不再具体分析了。

下图示例中,主机先向从机写了一个地址命令,然后重新开始并进入读取周期。

分析波形可检测出I2C通信工作是否正常,是否符合预期,对我们编程调试诊断有辅助作用。

目录

第1章I2C总线概述 (1)

1.1 I2C简介 (1)

1.2 I2C总线局限性 (1)

1.2.1 局限性 (1)

1.2.2 解决方案 (2)

第2章I2C中继器 (3)

2.1 I2C中继器的分类 (3)

2.1.1 热插拔缓冲中继器 (3)

2.1.2 总线中继器 (3)

2.2 热插拔缓冲中继器选型 (4)

2.2.1 基本特性 (4)

2.2.2 选型方法 (4)

2.2.3 典型应用 (4)

2.3 总线中继器选型 (6)

2.3.1 基本特性 (6)

2.3.2 选型方法 (6)

2.3.3 典型应用 (7)

第1章 I2C总线概述

1.1 I2C简介

I2C BUS(Inter IC BUS)是NXP推出的芯片间串行传输总线,它以2根连线实现了完善的双向同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展方法。

I2C总线的2根线(串行数据——SDA,串行时钟——SCL)连接到总线上的任何一个器件,每个器件都应有一个唯一的地址,而且都可以作为一个发送器或接收器。此外,器件在执行数据传输时也可以被看作是主机或从机。

I2C总线是一个多主机的总线,即总线上可以连接多个能控制总线的器件。当2个以上控制器同时发动传输时,只能有一个控制器件能真正控制总线而成为主机,并使数据不被破坏,这个过程叫仲裁。与此同时,能同步多个控制器件所产生的时钟信号。

SDA和SCL都是双向线路。连接到总线的器件的输出级必须是漏极开路或集电极开路,都通过一个电流源或上拉电阻连接到正的电源电压,这样才能够实现“线与”功能。当总线空闲时,这2条线路都是高电平。总线速率越高,总线上拉电阻要越小。

1.2 I2C总线局限性

1.2.1 局限性

I2C是低数据速率方式,用于短距离用途。目前的I2C指标显示,它的速度可以做到100kHz、400kHz和3.4MHz,不过还没有出现3.4MHz的产品,3.4MHz走向应用尚需时间。这里将主要讨论100kHz、400kHz产品。

I2C没有规定的电缆长度,唯一的限制是I2C总线规范,它规定I2C的最大电容是400pF,I2C总线上的负载电容不能超过400pF。如图1.1所示,当I2C总线上器件逐渐增多时,总线负载电容也相应增加。当总的负载电容大于400pF时,就不能可靠的工作。

图1.1 I2C总线

所有的I2C硬件架构均为漏极开路或集电极开路设计,具有上拉电阻。上拉电阻的值为2-10千欧,它们不超过I2C规范中3mA反向电流的规定和上升时间的规定。有一点特别重要,即设备的最大输入电容是10pF

I2C的优点是它非常简单,但是I2C总线中也存在的不少的局限性,如:

●7位地址长度,不允许地址冲突;

●总线上器件的数量和总线长度受限于总线的负载能力;

●各器件的传输电平和时钟要保持一致;

●总线的器件不能够进行直接热插拔。

1.2.2 解决方案

针对于I2C总线中存在的局限性,各大I2C的器件厂商都推出了各个系列的I2C扩展器件。

NXP公司拥有一系列的新器件用来克服规范指标上的限制,以扩展I2C使用。I2C总线的主要局限是它的7位地址,通过使用NXP的I2C多路复用器,可以在一条总线上使用具有相同地址的相同设备。多路复用器允许应用工程师将主I2C总线动态划分为几个子分支,以解决I2C地址冲突。。

在系统要求超过400pF限制的情况下,上升时间信号将超过I2C规范,这时也可以使用一个多路复用器或开关来克服这个限制。它可以做到动态分配主I2C总线给子分支,它可以编程,并可使用不止一个多路复用器。其局限是所有的子分支不能在相同时间内编址。如做一个500pF总线上通讯的主控设备,这里则需要改变总线,使其改变最大400pF的指标。放一个多路复用器进去,它将总线分成两个下行200pF线加一个100pF的上行总线。这种情形下的另一种潜在解决方案是使用I2C中继器,中继器两端各提供了400pF的负载能力。

I2C开关或I2C中继器可以用来协调同一总线的不同I2C逻辑电平。假设有一些设备在5V下工作,有一些设备在3V或4V下工作,有一个主控者在2.7V下工作,这时便可以使用一个I2C开关对所有设备进行透明地对话。

当需要在同一总线上同时使用100kHz、400kHz的设备时,可以使用一个I2C中继器,将两种设备隔离在两侧,使它们分别按自己的频率工作。

本文将主要介绍NXP公司的I2C中继器在总线中的选型和典型应用。

第2章 I2C中继器

2.1 I2C中继器的分类

I2C中继器的作用就是扩展I2C总线,使总线的应用受到更小的局限性。I2C中继器可以按其功能分为两类:

●热插拔缓冲中继器;

●总线中继器;

2.1.1 热插拔缓冲中继器

热插拔缓冲中继器支持底板与板卡在线热插拔,它可以保护总线上的时钟信号与数据信号不被破坏。从底板与板卡连接时刻开始,板卡的控制电路起着保护作用,直到底板与板卡断开连接。板卡在总线停止位出现或空闲时开始进行总线连接。热插拔缓冲中继器具有双向缓存功能,当I2C总线与SMBus总线连接时,将保持底板与板卡之间处于电容隔离状态。热插拔缓冲中继器在I2C总线中的应用电路如图2.1。

图2.1 热插拔型中继器的应用

2.1.2 总线中继器

总线中继器在保持总线操作模式和特性的情况下,通过一个双向缓存器缓冲数据线(SDA)和时钟线(SCL)的数据实现I2C总线扩展。由于I2C中继器的提供了输入输出总线的电容隔离状态,使得总线可以容纳更多的器件和具有更长的长度。总线中继器在总线中的应用电路如图2.2。

图2.2 I2C中继器扩展总线

2.2 热插拔缓冲中继器选型

热插拔缓冲中继器可以做到使板卡实时插入系统底板不影响总线上的数据和损坏设备,它可以检测总线空闲状态,提供电容隔离,防止SDA、SCL线上脉冲干扰。

2.2.1 基本特性

●为SDA和SCL提供双向缓存,在板卡系统热插拔中,保护SDA和SCL信号特性;

●兼容I2C的标准模式、快速模式,支持SMBus标准模式;

●检测总线空闲状态;

●上升加速器支持加速SDA和SCL;

●上升加速开始电压为1V;

●掉电条件下SDA与SCL为高阻抗状态;

●支持时钟拉伸,多主机仲裁、同步机制;

●工作电压范围:2.7V~5.5V;

●支持时钟频率0Hz~400KHz。

2.2.2 选型方法

●如果系统仅需要提供热插拔功能选,推荐选用PCA9510/1/4;

●如果系统的底板和板卡的总线工作电压不同,则推荐选用PCA9512;

●如果系统的底板需要板卡提供一个电流较大的电流源,则推荐选用PCA9513。

2.2.3 典型应用

如表2.2为热插拔型中继器一览表。

表2.1 热插拔型中继器一览表

型号

特性

PCA9510PCA9511PCA9512PCA9513 PCA9514△V/△t上升时间加速禁能引脚————支持————

△V/△t上升时间在0.6到0.8V具有良好

——————支持支持

噪音容限

开漏输出的状态指示引脚支持支持——支持支持

两电源提高3.3V和5V工作时噪音容限————支持————

1V的SDA与SCL预充电电压仅输入支持支持————

提供92mA电流源——————支持——

提示:各个型号的热插拔型中继器的详细资料,请到网站下载。

图2.3 热插拔型器件PCA9510/1在PCI系统中的典型应用

图2.4 热插拔型器件PCA9512在PCI系统中的典型应用

图2.5 热插拔型器件PCA9513/4在cPCI, VME, AdvancedTCA系统中的典型应用

2.3 总线中继器选型

总线中继器可以协调同一总线上的不同逻辑电平(如3.3V和5V)的通讯,或是隔离不同工作频率(如100K和400K)的通讯,将这些不同特性的设备隔离在中继器的两侧,它们将按自己的工作方式正常工作。

2.3.1 基本特性

●兼容I2C总线和SMBus两种总线;

●使能端高电平有效;

●总线开漏输入/输出;

●无自锁运行;

●支持总线仲裁和时钟伸展;

●支持标准模式或快速模式,支持多个主机操作;

●掉电条件下I2C引脚为高输入阻抗引脚;

●I2C总线和时能端引脚最高输入电压为5.5V;

●时钟频率范围从0Hz到400KHz;

●每段提供负载能力达400pF。

2.3.2 选型方法

●如果总线仅需要协调不同标准逻辑电平和隔离不同工作频率,则推荐选用

PCA9515;

●如果总线还需要将一路扩展为4路,则推荐使用PCA9516;

●如果总线还要求提供级联扩展,进行多路扩展,则推荐使用PCA9518;

●如果总线要求协调低压和标准两个不同电平标准的总线,则推荐使用PCA9517;

如果总线要求独立4路协调低压和标准两个不同电平标准的总线扩展,则推荐使用PCA9519。

2.3.3 典型应用

如表2.2为扩展性中继器一览表。

表2.2 扩展型中继器一览表

型号功能工作电压与其他中继器级联方式PCA9515 总线中继器 3.0V~3.6V 不支持

PCA9516 5路集线器 3.0V~3.6V 不支持

PCA9517 低压中继器低压端A:0.9V~5.5V;

高压端B:2.7V~5.5V;

可与自身串联或并联,通过A

端与其他器件串联

PCA9518 可扩展5路集线器 3.0V~3.6V 提供级联接口

PCA9519 独立4通道低压集线器低压端A:1~(V cc(B) -1)V

高压端B:2.7 ~ 5.5V

——

提示:至于型号的扩展型中继器的详细资料,请到网站下载。

图2.6 总线中继器PCA9515的典型应用

图2.7 5路集线器PCA9516的典型应用

图2.8 低压中继器PCA9517的典型应用

图2.9 可扩展5路集线器PCA9518的典型应用

图2.10 独立4通道低压集线器PCA9519的典型应用

相关主题
文本预览
相关文档 最新文档