发 帖  
原厂入驻New
[经验]

I2C总线:硬件实现细节

2020-9-20 08:37:42  492 I2C总线 硬件
分享
12

有时候有点复杂是一件好事



I2C协议的一些不足之处在于:不仅将几个IC引脚连接在一起,而且在读取或写入适当的缓冲区时让低级硬件接管(更多或更多)。较少使用SPI(串行外围接口)或UART(通用异步接收器/发送器)。但是I2C的复杂性并非没有目的。本文的其余部分将帮助您了解有些微妙的硬件实现细节,这些细节使I2C成为用于多个独立IC之间的串行通信的通用且可靠的选择。



开漏

I2C的一个典型特征是,总线上的每个设备都必须通过漏极开路(或集电极开路)输出驱动器连接到时钟信号(缩写为SCL)和数据信号(缩写为SDA)。让我们看看这实际上意味着什么。首先考虑典型的CMOS(反相)输出级:


如果输入为逻辑高电平,则NMOS晶体管导通,而PMOS晶体管截止。因此,输出具有接地的低阻抗连接。如果输入为逻辑低电平,则情况相反,并且输出具有与V DD的低阻抗连接。这被称为推挽输出级,尽管该名称并不是特别有用,因为它并不强调控制输出的连接的低阻抗特性。通常,你不能直接连接两个推挽输出,因为如果一个为逻辑高电平而另一个为逻辑低电平,则电流将从V DD自由流到地。


现在考虑漏极开路输出配置:


PMOS晶体管已由IC外部的电阻器代替。如果输入为逻辑高电平,则NMOS晶体管提供接地的低阻抗连接。但是,如果输入为逻辑低电平,则NMOS看起来像开路,这意味着输出通过外部电阻上拉至V DD。这种安排导致两个重要的区别。当输出是逻辑低,因为电流流过电阻器,通过所述NMOS晶体管的沟道,接地(在推挽式结构,该电流是由高阻挡首先,发生非平凡功耗,阻抗的OFF-的状态PMOS晶体管)。其次,输出信号在逻辑高电平时表现不同,因为它已连接至V DD通过更高的电阻(通常至少1kΩ)。此功能可以直接连接两个(或多个)漏极开路驱动器:即使一个逻辑低电平,另一个逻辑低电平,上拉电阻也可确保电流不会从V DD自由流到地。


这是漏极开路总线配置的三个重要含义:

  • 信号始终默认为逻辑高电平。例如,如果I2C主设备试图与已无法运行的从设备进行通信,则数据信号将永远不会进入未定义状态。如果从机没有驱动该信号,它将被读取为逻辑高电平。同样,如果主设备在传输过程中掉电,则SCL和SDA将返回逻辑高电平。其他设备可以通过观察SCL和SDA在一定时间内都处于逻辑高电平来确定该总线可用于新传输。
  • 总线上的任何设备都可以安全地将信号驱动为逻辑低电平,即使另一台设备试图将其驱动为高电平也是如此。这是I2C的“时钟同步”或“时钟延长”功能的基础:主机产生串行时钟,但如果需要,从机可以将SCL保持在低电平,从而降低时钟频率
  • 只要低电压设备不会被高电压损坏,具有不同电源电压的设备可以共存于同一总线上。例如,如果将SCL和SDA上拉至5 V,则3.3 V设备可以与5 V设备通信-即使3.3 V设备无法驱动 5 V,开漏配置也会导致逻辑高电压达到5V。来自典型推挽输出级的V。

如果你有R,你就有RC

漏极开路输出驱动器绝不是数字IC的标准配置,这有充分的理由:它具有一些明显的缺点。当我们回想起电容无处不在时,这些缺点之一就变得显而易见。电压变化受与特定节点关联的电容充电或放电所需的时间限制。问题在于,SCL和SDA上的上拉电阻限制了充电电流的大小,换句话说,在控制从逻辑低电平到逻辑高电平的过渡的RC时间常数中,我们有更多的R。







如这些图所示,从低到高的过渡将明显慢于从高到低的过渡,从而产生经典的I2C“锯齿”波形:


这两个示波器捕获显示了具有1kΩ上拉电阻和最小电容(总线上只有两个器件,且PCB走线短)的I2C时钟信号的从低到高和从高到低的跳变。





上拉电阻的尺寸

在这一点上,显然上拉电阻会限制特定I2C总线的最大时钟频率。实际上,电阻和电容都是影响因素,尽管我们几乎无法控制电容,因为电容主要取决于总线上有多少个设备以及这些设备之间互连的性质。这导致了一个持久的问题,“我应该使用哪个值的上拉电阻?” 需要权衡的是速度与功耗:较低的电阻会减小RC时间常数,但会在SCL或SDA逻辑低时从V DD流到地(通过上拉电阻)的电流量增加。

该官方I2C规范(第9页)指出,直到它达到V的70%的电压不被认为是“逻辑高” DD。你可能还记得,RC时间常数告诉我们电压达到最终电压的大约63%需要多长时间。因此,为简单起见,我们将假设R×C告诉我们信号从接近地电位的电压上升到逻辑高电压需要多长时间。

现在我们如何找到电容?“简便”的方法是组装整个系统并对其进行测量。至少,这可能比尝试进行精确的计算来说明每种电容来源都容易,正如德州仪器(Texas Instruments)的应用笔记中所表达的那样,“在正常的电路结构中,会形成难以想象的数量的电容器。” 如果测量方法不是一种选择(通常是这样),则可以通过查找总线上每个设备的引脚电容来进行粗略估计(希望数据表不会让您失望),然后加3 pF每英寸PCB迹线和每英尺同轴电缆30 pF(这些数字来自同一应用笔记,第3页)。

假设我们有50 pF的总线电容,并且要遵守I2C“标准模式”规范,该规范规定最大上升时间为1000 ns。

图1.png
因此,你可以满足R上拉 = 20kΩ 的规格;此值还为你提供了最低的功耗。速度呢?假设你希望时钟高电平时间至少是上升时间的三倍。

图2.png
如果167 kHz的速度不够快,则可以降低电阻(以增加功耗为代价),直到达到所需的时钟速度。(实际上,“标准模式”将时钟速度限制为100 kHz,但是您可以根据系统需求调整这些规格。)

这些是粗略的计算,但是说实话,您无需费心寻找完美的阻力。这种通用方法可以帮助你确定一个合理的值,并且如果某些东西无法按照您想要的方式工作,你可以始终交换不同的电阻器。



结论

如果本文达到了目的,那么你现在已经完全熟悉I2C硬件设计中涉及的重要细节。我们将在另一篇文章中介绍固件实现。


相关经验

李红涛 2020-9-20 22:48:56
顶楼主。。。。。。
1 1回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表