SPI或I2C:用于较长的总线


36

我正在考虑一个需要几个AVR通过总线相互通信的项目。它们之间的间隔最大为6英尺。

看起来I2C和SPI都可以让一系列的微处理器通过总线进行通信,但是我还没有看到有关它要持续多久的信息。有没有人尝试在几英尺的距离上连接这些协议?


我曾经通过电缆运行过I2C总线。 事后看来,我应该改用CAN或RS-485(两端都有微控制器)。
尼克Alexeev

Answers:


19

正如其他人所说,只要上拉电阻,时钟频率等,SPI和I2C可以在很长的距离上使用。

RS485CAN是主要的替代产品(具有更好的抗噪能力)。两者都使用差分线,以最大程度地减少噪声问题,并且比I2C或SPI更适合于这种长度的数据传输。但是,我认为没有太多(任何一个)AVR带有内置的CAN外设,这使CAN的使用更加容易。

我要说的是,选择总线时要考虑的最重要的事情是确保用于设备之间通信的协议包括CRC或等效协议,以便您可以确定是否已正确接收消息(CAN将其作为消息的一部分)。数据包)。考虑到这一点,将ACK / NACK类型的响应作为协议的一部分也是有用的,以便可以重新传输损坏的消息。


听起来任何一个都行得通。我主要考虑这两个特定的协议,因为大多数AVR本身都支持它们,而没有添加额外的组件。否则,RS485或CAN将是一个不错的选择。
edebill 2009年

如果您不局限于通孔封装,则ST拥有其经济高效且功能强大的STM32和STM8微控制器以及CAN,NXP拥有一系列LPC17xx微控制器,还有其他一些微控制器。在许多微控制器上,CAN变得越来越普遍(且负担得起)。
DrAl 2010年

1
确实有一些内置了CAN接收器的AVR,但与其他供应商一样,它仅在其芯片的有限子集中。
davr 2010年

1
Microchip有一些带有CAN的PIC。microchip.com/wwwproducts/Devices.aspx?dDocName=en010302。但我会承认,它们的编程有点“笨拙”,尤其是在Microchip的C18 / C30库中。在代码审查中,我们发现一些库代码由于实现的特殊性而很难阅读-一个用作接收缓冲区的发送缓冲区,标志名称实际上与它们所代表的相反。当然,我不建议微控制器开发新手使用。
J. Polfer

2
CAN和RS-485确实是苹果和橘子。CAN定义了位级别协议以及物理电层(PHY)。RS-485只是物理层规范,它对协议没有任何规定。在RS-485 PHY之上查找或实现实际协议完全取决于您。CAN是为高噪声环境设计的,它主要用于汽车和制造业。它的协议是一个相当复杂的消息传递系统,具有很高的开销(较低的实际数据速率),但是具有很高的数据完整性。
标记

10

几英尺应该没有问题,如果可以的话,请使用双绞线。SPI比I2C更容易缓冲(如果需要),因为SPI信号都是单向的,而I2C的信号在共享线路上。

AVR微控制器可以处理I2C和SPI从模式以及主模式吗?(您都需要)


2
绞线?切勿扭曲I2C数据和时钟线!使用SPI,这可能不是问题,但是除非信号线是平衡对,否则我绝不会扭曲信号线,在这种情况下,扭曲是一个好主意。
Wouter van Ooijen 2011年

永不说永不; 我会每天在数据+时钟之间进行较小的电容耦合(由于扭曲),而不是对嘈杂的电力电子设备进行较小的电感耦合(因为不扭曲)
Jason S

4
抱歉,我绝对不同意。在1状态下,线路具有相当高的阻抗。看到完成,看到失败。最好的选择是在I2C线的两侧之间或什至更好的位置使用小电流接地线。
Wouter van Ooijen 2011年

10

对于长距离的I2C,您可能需要寻找一些“ I2C总线中继器”解决方案。请记住,对于I2C或SPI通信可能找到的最大距离主要是指总总线距离,而不是总线中两个节点之间的距离。

您可能需要研究RS485来解决这些问题。这是一种串行总线协议,可通过差分线路进行通信,因此,在使用双绞线时,噪声的机会会最小化。这样可以达到很长的距离。缺点是您的电路中需要一个额外的RS485编码器IC(例如MAX485,但价格并不昂贵)。


RS485绝对是解决此类问题的好方法。
Scott Murphy

请记住,RS485与RS232有两个方面有所不同的两个方面:物理差分逻辑电平和多主站方面。您可以选择+选择它们,我们已经将LVDS和RS485转换器与UART(RS232)一起使用,而无需点对点地进入RS485的多点部分。
杰森S

2
btw RS485不是协议!它仅定义物理层。话虽如此,您绝对可以在RS485上使用SPI !!!如果需要的话,将通信保持在SPI模式将是一个很好的解决方案(我假设是这样,可以将其连接到远程ADC或类似设备)。使用RS485上的SPI,您需要检查收发器的转换速率是否与建议的SPI数据速率兼容
smashtastic 2010年

8

与I2C相比,尚未提及SPI的一个优势是所有SPI线都是单向的,并且始终被驱动为高电平或低电平。与I2C相比,这可以实现更快的通信,降低了对噪声的敏感性,并允许将简单的门用作转发器。另一个有用的选择是简单的异步通信(每个方向一根线)。我可以看到异步通信的唯一缺点是,它通常要求双方在保持时钟稳定的情况下保持“清醒”状态以交换数据。

对于我自己的项目,我使用了3线稍微修改的SPI协议,并且发现了令人满意的结果。我以10mbps的速率发送显示位图数据(偶尔的数据损坏不会有什么大不了),而以2.5mbps的速率发送其他数据则没有困难。


这是一个非常古老的答案,但是您要说说您发送修改后的SPI协议的距离是多少?(这就是问题的重点...)
丹尼尔·格里斯康

@DanielGriscom:通常,大约3英尺长,通过令人印象深刻的电缆铺设,但有时更长。
supercat

6

虽然I2C和SPI都是为短距离(几英寸)而设计的,但它们都可以在较长的距离上使用适当的电缆并注意总线总电容。

虽然我对SPI的经验很少,但是I2C并不是很难,因为您始终需要计算上拉电阻的合适尺寸。此外,还有专用且价格便宜的I2C缓冲器,使用起来非常容易。但是,您仍然必须为网络使用适当大小的上拉电阻。

我使用I2C在两个8英尺远的AVR之间建立网络,仅使用上拉电阻和高质量,屏蔽良好的双绞线。


您必须使用多芯电缆小心w / I2C,电容会导致总线显着降低速度。
杰森S

6

正如许多人建议的那样,I2C和SPI最适合短距离使用。尽管可以使用这些接口来实现解决方案,但我还是建议您寻找其他“更标准”的解决方案(例如,以太网,RS485,CAN等)。-特别是如果您打算使用电缆来达到微控制器之间的6英尺距离。


6

只是一个FYI,无线Nintendo Wii遥控器与其Nunchuck伴侣之间的接口在大约3英尺长的电缆上使用I2C。也有3英尺长的延长电缆将总长度延长到大约6英尺。与您的设置不完全相同(只有两个设备连接在一起),但这是在广泛使用的消费类产品中通过电缆进行I2C的示例。


4

我参与了一个项目,该项目涉及通过I2C进行通信的星型网络中约80个基于AVR的节点。这完全是一团糟,最后没有用。获取所有节点的更新仅需几秒钟,一次错误的连接将中断整个网络。最后,我与制作节点的人交谈,他说他已停止将I2C用于此类项目。不幸的是,我不知道为什么I2C在这里不够。


1
I2C比SPI慢得多...它也可能是您的项目在发生冲突时如何管理仲裁...或者电容对于所有这些节点可能已经足够高,您只需要使用慢时钟速率即可。
杰森S

2

这么短的距离应该很容易。您可以做的是找出这些距离以及电缆对电容和线路阻抗的影响,并查看可以通过哪些频率(上升/下降时间)。超过特定点,最好将它们视为传输线。如果看起来很糟,您确实可以切换到其他一些串行线,例如EIA-232或422。这可能意味着两端都需要一个额外的芯片,但是会延伸得很远。如果您确实需要走得更远,您将需要更多的东西(以太网,别指望无线电或激光技术:)。


2

如果可以控制时钟速度,并且不需要高速数据传输,则应尝试降低时钟速度。这将使其不易受到噪声的影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.