前言
I2C总线,对嵌入式工程师来说,听上去是再基础不过的东西,大家对其物理结构和协议已经非常熟悉,比如开漏结构、上拉电阻选型(灌电流)、速率、时序、总线仲裁方式等。I2C总线是上世纪80年代的产物,其应用场景自然也非常广泛,各种传感器、EEPROM、I/O扩展器、ADC/DAC等接口都会使用,非常常见。
近几年也衍生出来I3C总线,大家都知道I3C支持推挽结构,不同于I2C的开漏结构,I3C改进了这一点。作者的理解一方面是只为了增大驱动能力,另一方面也是为了提高总线速率。可见开漏输出自然是有其弊端的,物理上,最显而易见的就是信号上升时间取决于上拉电阻的取值以及总线负载电容,当从设备多到一定数量时,其总线负载电容会超过I2C协议的标准,SCL/SDA信号的边沿也变得十分缓慢,作为同步通信总线,最终将导致信号幅值/有效脉宽不够,发生数据采样错误或偶发性采样错误。众所周知,I2C总线是7bit地址(也有10bit地址,这个另说),能够挂载的从设备数量是2的7次方-1(去除0x00地址),但由于器件引脚、PCB走线都存在寄生电容,因此,实际上总线直接挂载到理论数量并无法实现。
问题展开之前,先说下I2C总线电容、边沿时间的协议标准。下图截至“UM10204 I2C-bus specification and user manual”标准文档。不同速率的总线上升时间、总线负载电容的要求不同。大家较常用的是Fast-Mode,即要求上升时间不高于300ns,总线负载电容不高于400pF。
图 1 不同速率I2C的基本电气参数
第一种应用场景,是一根I2C总线挂载非常多的从设备,前言部分已经作了说明。这种场景多用于传感器比较多的产品(如一些物联网设备)、以及服务器产品(长走线,多设备,且带背板插拔应用)。
图 2 IIC BUFFER应用场景1–一主多从
第二种应用场景,也是作者在实际项目中正在接触到的。即即便总线上只挂载了1个从设备,但因PCB走线比较长且存在长线束连接以及跨板应用时,其总线等效电容和信号上升时间会超出标准值或处于协议的临界值附近,就需要增加此类芯片。
图3 IIC BUFFER应用厂家2–长连接
不论是上述哪种应用场景,其导致的主要结果都是总线负载电容增加。
然而,总线上的寄生电容一定是存在的。如图4、图5所示,对于I2C这种开漏结构,因为信号由低电平切换为高电平时,需要对总线电容CBUS充电,因此,我们在示波器上看到的I2C波形永远都是上升沿“缓慢”、下降沿“陡峭”。
了解I2C上拉电阻计算方法的工程师都很清楚,为了达到信号70%-VIH和30%-VIL的阈值,能尽可能缓解边沿的方法只能是降低总线电压、降低上拉电阻。总线电压通常与芯片VCCIO相关,电压越低,上升时间越小,然而总线电压是确定的值。遗憾的是,减小上拉电阻也并不能完全适用,因为I2C总线的标准模式和快速模式还有一个3mA的灌电流要求,同时减小阻值也会带来总线功耗的增加,这对多从应用以及低功耗应用的产品来说,是难以接受的。这些信息在标准文档的“7 Electrical connections of I2C-bus devices to the bus lines”有具体描述。
图4 I2C总线的开漏结构

图5 I2C总线的上升/下降时间
因此,为了提高I2C信号的压摆率,需要使用IIC BUFFER来缓解信号的边沿问题,抵消信号总线负载电容带来的影响。
如图6所示,BUFFER主要功能之一是“隔离”总线电容。即在BUFFER的两侧,它可以将原600pF总线电容(假设)分成两部分(CBUS1和CBUS2),每部分总线300pF,而BUFFER本身引脚的等效电容(CBUF)也做得很低,约10pF。
除此之外,IIC BUFFER还有上升沿加速的作用,这是它最重要的功能。具体我们在下一章节展开。
2 IIC BUFFER的基本工作原理
由下图可以看到,一些BUFFER内部是有开关的,内部是开漏结构。当主设备向A端输出低电平,BUFFER将打开B端的MOS,从而将从机的总线拉低至0电位。反过来亦是如此。这是最基本的实现逻辑。

图 7 BUFFER的基本工作原理示意
在前一章节提到,BUFFER隔离开了2个BUS,那就会有人好奇,线束那么长,从设备那么多,我需要把BUFFER芯片放在哪里?
以我们的第二种应用场景来说,放在主设备端或从设备端,都可以。BUFFER分多种类型,包括不同电源轨(类似电平转换)、带热插拔功能、不带热插拔功能的类型,有单路的,有多路的(比如4路),具体选型需要看项目需求。在图3中,因为从设备的“板B”是由主设备的“板A”提供供电,而“板A”是长供电的,即热端。作者还需要考虑线束的热插拔,因此默认优先放在“冷端”。咨询过FAE,实际上对热插拔应用,建议两端都放,因此作者在主设备端也有预留了BUFFER芯片,具体还需要看后续的实测表现。针对热插拔应用,芯片厂家网站上也有一些Application Note进行说明(如TI的“zhcac34a”文档),大家可以自行查阅。
本文以典型的IIC BUFFER芯片的内部框图进行展开。此类芯片在十几年前就已经量产了,主要生产厂家是TI、NXP,两家型号都非常多,我们以TI的TCA9511为例进行简单的说明。另外提一下,BUFFER-缓冲器、Repeater-中继器的原理和应用场景都是相似的,就是名称不一样。
图8 TCA9511 BUFFER芯片内部框图
如图8所示,我们分6个部分进行说明。(*注:下面仅代表作者个人理解,若有错误,请各位读者注意甄别)。
第一部分:输入/输出SCL/SDA信号,大家可以先整体看下芯片框图,它是对称结构,因此,此类型的芯片本身应该不区分方向(注意:热插拔是需要检测“IN”处的总线状态,因此热插拔是具有方向性的,另外,带OffSet功能的芯片需要特别注意这一点,串并联使用时需区分方向)。BUFFER芯片需要判定总线状态,以决定是否要将主从设备连接起来。因此,此类BUFFER内部,本质上就是个开关。
第二部分:SCL/SDA信号进来后,首先进入逻辑检测,经过2个施密特触发器,对脉冲信号进行了整形,当使能达到UVLO(欠压锁定)阈值并开启后,信号进入第三部分。
第三部分:检测当前总线是否处于空闲状态,以及是否检测到停止位。若总线空闲,将输出“CONNECT”信号,就是说我准备好了,可以将主从设备连接起来了。这里也是实现热插拔功能的基础,它可以过滤掉总线正在进行的操作,避免将不完整的数据告诉主或从设备,尽可能避免了总线死锁或其它异常现象。
第四部分:“CONNECT”信号经过OD门,输出READY信号,就告诉主控,现在总线空闲了,我要开始闭合开关了,你可以发数据出来了。
第五部分:“CONNECT”信号闭合开关A1/A2,使二者连接起来。但是要注意,框图内有1个“SLEW RATE DETECTOR”模块,顾名思义,它具有检测信号边沿压摆率的功能,如不符合标准协议要求,它将闭合另一个开关B1/B2,这个开关将信号连接到1个5mA电流源,它的主要作用是“加速”,全名叫“Rise time accelerator”,简称“RTA”,它可以将信号边沿变得更“陡峭”,提高压摆率。
第六部分:由芯片EN使能和“CONNECT”信号共同使能,开启1V预充电模块。此模块仅用在需要热插拔的场景,其主要作用是在热插入事件进入带电总线期间减少毛刺脉冲,并限制对总线电容的充电电流。它连接了1个1V电压源,并串接100K电阻进行弱电流充电。此功能在芯片供电电压VCC高于芯片UVLO时开启,因此,它也会受EN使能的影响。当第五部分总线的主从两端正常连接后,预充电电路将关闭,所以大家可以看到芯片框图上,第五部分和第六部分的“CONNECT”是反的逻辑。另外,针对热插拔应用,使用“长短针”的方式最佳。关于热插拔应用的详细说明,推荐大家看下TI的“zhcac34a”文档,这是一个专门的话题。
然后,我再贴一个信号波形,给大家直观感受下BUFFER芯片对IIC总线信号边沿的缓解效果。下图灰色REF1通道为加BUFFER后的波形,绿色CH2通道为加BUFFER之前的波形,可以显著看到,上升时间从350ns提升至100ns以内。
图 9 加IIC BUFFER前后信号波形对比
另外,观察波形也可以注意到,增加了BUFFER以后,信号势必会有延迟的,而且延迟是累加的,不同厂家的芯片表现不同,看上去应该是由于前面提到的“第三部分”的空闲状态检测引起,但好在它并未影响时钟和数据的相位关系,这部分具体的逻辑作者还在咨询。然后再仔细看,可以发现波形上是有个回沟,这个回沟就是因为SDA的下降沿时间比较短,由线束的串扰引起的,特别是在信号幅值比较高的时候,会更加明显,而且因为SCL的电平翻转比较多,因此SDA的回沟现象更频繁。这样就带来另外一个话题,即SCL/SDA在长走线(线长>100mm)时的参考地如何设置或减小线束串扰的方法。这部分在I2C的标准里也略有提及,自然是SCL/SDA与GND相邻走线,若无法实现,SCL参考GND(双绞),SDA参考VDD(双绞)。
芯片成本。很贵,从各家官网的参考价格就可以看出来,单路带热插拔的BUFFER芯片成本0.5USD已经算较低的报价了,具体到折算的采购价格,相信最终报价也不很低,仅BUFFER功能的话,成本应该会好很多。
最后,就是芯片功耗的问题。作者看了不同厂家同规格同类型的芯片,其规格书标称的正常工作模式通常在2-5mA@5V左右。作者实测TCA9511实测底电流约3mA@5V(含负载),当关闭使能后,底电流表现在130uA左右,供大家参考(含负载,即本案中的从设备空闲功耗是很小的)。
3 写在结尾
通过上述介绍,大家可以对IIC BUFFER的应用场景和工作原理有了基础的认识,希望能帮助到大家,并给予大家一些项目调试思路。
*注:本文部分图片来源于德州仪器发布的一些应用笔记。