\$\开始组\$

我知道施密特触发器是一种很好的方法,可以根据阈值将浮动或噪声信号转换为高或低。它在其他中提到螺纹施密特触发器可以帮助处理长SPI信号。在我的情况下,我想以10 MHz的时钟频率在1米以上传输SPI信号,每条SPI线与地线绞合,无差分信号,33欧姆终端,26或28AWG电线,以及屏蔽并连接到地面的整个电线电缆。SPI设备是BME680型温度、压力和湿度传感器。

然而,为什么施密特触发器有助于与SPI通信,因为微处理器已经根据阈值将信号读取为高或低?或者,施密特触发器只应该集成在SPI设备端吗?在我的例子中,是BME680吗?如果是这样,施密特触发器对哪些SPI引脚有利?

\$\端组\$
4
  • \$\开始组\$ 任何旧的缓冲区都可以将噪声信号转换为高或低。施密特触发器可以做得更多。 \$\端组\$
    – 赫斯
    5月17日21:52
  • \$\开始组\$ 你能描述一下他们的额外好处吗? \$\端组\$
    – 汤米95
    5月17日22:05
  • \$\开始组\$ @Tommy95我无法理解你为什么要用10MHz通信。传感器响应时间以秒为单位。低速跑不是更好吗? \$\端组\$
    – 卡萨德
    5月19日16:32
  • \$\开始组\$ 我希望我能做到,Kaosad,但目前我有一个每隔2毫秒发生一次的重复计时器中断例程,持续1毫秒。我每隔2秒测量一次传感器,所以我有2000个1毫秒处理器时间的插槽来收集传感器数据,但通过spi,我不知道如何在这2000个插槽上划分任务。请你对此有一些见解好吗? \$\端组\$
    – 汤米95
    5月19日22:23

3个答案

重置为默认值
7
\$\开始组\$

SPI是一条同步总线,这意味着控制器生成的时钟周期数需要与设备看到的数字精确匹配。

在一米长的不平衡电缆上运行20 MHz方波可能会导致各种信号完整性问题,这些问题由随机噪声、内部反射和串扰引起。如果这些影响发生在时钟的上升或下降边缘,设备可能会将其解释为额外的时钟周期,并与控制器不同步。

施密特触发器比普通缓冲器更能抵抗上升和下降边缘的这种噪声。它基本上会拒绝任何属于滞后“窗口”的内容。因此,最重要的位置是SPI时钟信号的设备端。您也可以在MOSI信号上使用一个,以使延迟更加均衡。

顺便提一下,似乎没有什么必要让温度等传感器以如此高的时钟频率开始工作。对于长串行总线,较低的速度是有利的。

\$\端组\$
7
  • \$\开始组\$ 谢谢你的回答,戴夫。那么,可以在BME680端的SCK、MOSI和SS上放置施密特触发器?另一端的MISO呢? \$\端组\$
    – 汤米95
    5月17日22:19
  • \$\开始组\$ 时钟频率如此之高的原因是我的微处理器有一个循环例程,其中只有几微秒可分配给获取温度等信息。 \$\端组\$
    – 汤米95
    5月17日22:21
  • \$\开始组\$ @Tommy95我认为你无法在几微秒内完成所有传感器数据的计时。即使在10 MHz时,您也可以在1微秒内传输10位。您需要读取几个数据寄存器才能读取所有这些值,因此读取一个结果字节需要1.6us。你不可能经常获得新数据。例如,BSEC结果每3秒更新一次。 \$\端组\$ 5月17日22:32
  • \$\开始组\$ 我仅每2秒触发一次测量。我可能会把它增加到10秒。信不信由你,在15兆赫的频率下,每两秒钟测量一次,BME680在30厘米的电缆上可靠工作。虽然我可能可以使用10MHz,但我编辑了这篇文章 \$\端组\$
    – 汤米95
    5月17日22:34
  • 5
    \$\开始组\$ @Tommy95 All-micros可以处理相当数量的周期性进程,多任务(抢占式或其他方式)允许它们共存。这实际上是所有的micro—即使它没有内置到硬件中,使用类似FreeRTOS的东西也可以提供您所需要的所有正常功能。当你只需要每隔几秒钟运行一次时,没有理由把它塞进一个快速周期函数中——只需要给自己一个1的周期任务来运行它。因此,没有理由这么快运行SPI。典型的XY问题。 \$\端组\$ 5月18日17:27
4
\$\开始组\$

……为什么施密特触发器有助于与SPI通信,因为微处理器已经根据阈值将信号读取为高或低?

这是思考任何信号的错误。信号不是只有高或低两种数字状态,中间没有任何东西。

每个信号都是模拟信号,模拟信号从HIGH(高)状态转换到LOW(低)状态以及从LOW(低)状态转换为HIGH状态需要时间。

所有芯片都需要在足够短的时间内进行转换,以防止出现问题。当信号从电缆中出来时,通过长电缆的信号将具有较慢的过渡时间,因为电缆是有损耗的介质,它具有电容和电阻,所以它限制了信号的带宽。

因此,即使接收器输入具有锐利的阈值,慢信号在阈值附近花费的时间太长,任何加在信号上的噪声都可能使其多次超过阈值,因此,慢边可能被视为多个时钟边,而额外的时钟边则会破坏SPI事务。

因此,由于信号必须具有快速而尖锐的转换,所以它会快速远离阈值,所以添加噪声不是问题,您可以使用施密特触发器来接收缓慢的信号边缘,它会将它们重塑为SPI芯片的快速强信号边缘。

它的作用是没有单一的阈值,只有两个用于滞后。在输入达到足够高的阈值之前,输出不会转换为高,而在输入降低到足够低的阈值之后,输出才会转换为低。因此,无论信号在两个阈值之间上升或下降的速度有多慢,或者有多少附加噪声,只要其大小不足以跨越两个阈值。

此外,由于许多原因,在1米电缆上使用20 MHz SPI总线也没有多大意义。

首先,BME680传感器仅支持10 MHz。

此外,传感器检测到的大多数变化都发生得很慢,可能每秒读取一次数据就足够了。

如果你想要1米长的电缆,可以通过I2C更容易地完成。

\$\端组\$
6
  • \$\开始组\$ 谢谢Justme。传感器每两秒钟只触发一次,但与设备的数据交换时间必须只有几微秒,因为我的微处理器有另一个循环例程。我已经在30厘米以上的15MHz频率下测试了BME680,它工作可靠,尽管数据表中提到了最大10MHz。我现在想把它扩大到100万。不幸的是,I2C不是一个解决方案,我使用的微处理器环境已知与I2C功能失调。 \$\端组\$
    – 汤米95
    5月17日22:32
  • \$\开始组\$ @Tommy95但你正在使它变得比需要的更复杂。你有整整2秒钟的时间从芯片传输新的数据,所以你不需要20兆赫。而且,您不应该将总线超频超过10 MHz的最大值,也不需要。1 MHz可以花2秒钟读取数据。您使用的I2C出现故障的处理器环境是什么?即MCU品牌/型号/类型? \$\端组\$ 5月17日22:35
  • \$\开始组\$ 谢谢你在我的案子上慷慨的花费时间,贾斯特米。想象一下,我有一个使用计时器中断的例程,每2000us发生一次,持续1000us。每两秒钟,我就决定用剩下的1000美元来收集这些环境数据,并触发下一次测量。如果你有更好的方法,请分享,我找不到更好的了。 \$\端组\$
    – 汤米95
    5月17日22:43
  • \$\开始组\$ @Tommy95我不知道你的系统为什么会这样工作,计时器中断在1ms内做了什么,主代码在1ms里做了什么。但你实际上有2000个1ms的插槽,或者说50%的CPU时间可以用来处理从传感器获取数据,对吗? \$\端组\$ 5月17日22:49
  • 1
    \$\开始组\$ 计时器isr应该像Arduino那样设置一个标志或记录刻度数。然后,您可以安排和执行合作功能来完成各种任务。由于您不会长时间占用中断,因此您可以像往常一样使用uart、spi、I2C等中断。每个任务都会一直运行到完成,并且必须在1毫秒内完成。了解有限状态机,以实现这样做的代码,而不会忘记它的位置。I2C的设计特点是总线锁定。像所有好的I2C实现一样,实现恢复超时。 \$\端组\$
    – 卡特曼
    5月19日3:31
1
\$\开始组\$

如果不知道电缆可能的阻抗,很难说。

施密特触发器将在一定程度上屏蔽反射的影响,因此它们可以帮助缓解设计不良的终端,但目前为止还没有。

在你的情况下,你可以用一个快速的示波器在你建议的接线末端测量信号(可能200MHz的示波器会给你一个好主意)。然后调整33R系列终端,直到上升和下降边缘干净。你可能会发现你需要10R到100R之间的任何地方。。。只是猜测。

现在,如果没有可怕的噪声源,你就可以使用任何足够快的门,甚至只需要接收传感器输入引脚。如果存在噪声源,那么您将受益于施密特触发器,以避免噪声在CS或CLK信号上造成意外边缘。数据信号不太可能成为问题,但它们也不能幸免。

编辑:如果您使用的是cat 5e或类似产品,那么单端信号的电缆阻抗应该是50R阻抗。

\$\端组\$
  • \$\开始组\$ 谢谢Robin。最后,我在CLK、SS、MOSI和MISO两侧都设置了Schmitt触发器,因此共有8个缓冲区。我用了一个在线计算器计算终端电阻值,对于28AWG,1米,它给了我100欧姆。我想知道这个配置是否正确:“主”微处理器SCK引脚->施密特触发器->100欧姆终端电阻器->ESD二极管->D-SUB连接器引脚。这是终端电阻器的正确位置吗? \$\端组\$
    – 汤米95
    5月19日13:32
  • 1
    \$\开始组\$ 静电放电二极管应尽可能靠近连接器。串联终端应尽可能靠近驱动器输出引脚。因此,对于sck、cs和mosi,它们位于MCU旁边的驱动程序入口。对于MISO,串联终端应位于设备端(再次尽可能靠近驱动门输出)。 \$\端组\$ 5月19日18:07
  • 1
    \$\开始组\$ 附言:一旦你建造了它,我仍然会尝试在接收端用一个示波器来测量它。你应该看到一个干净的上升和下降边缘。您应该将spi时钟设置为100Khz左右,然后查找时钟边缘之间发生的任何转换,这些转换是由反射导致的,因此终止错误。 \$\端组\$ 5月19日18:16

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.