问题描述:
~30 字节消息中的 1-2 个字节(通常在消息中的同一位置)有时会丢失。通常是第 13 个字节。
如果我通过 SPI 发送更短的消息,比如 10 个字节,对方会正确接收它们。
如果我在将 NSS 拉低后等待 50us,对方甚至可以正确接收到长消息。
让我们假设,在将 NSS 拉低后,传输开始得太早。为什么 msg 中间的一个字节会丢失,而不是在开头?
也许这是一个振荡的 NSS 引脚,它变高/变低,但我在示波器上看不到任何东西。我知道探头会增加走线的电容,因此任何信号上升都会变慢,并且只需连接探头即可抑制任何振荡。
暂时修复:
将 NSS 拉低后等待 50us。
问题一:
但我不明白为什么修复有效......这对我来说毫无意义。NSS 在大约 200ns 内变高/变低(使用探头测量,超短 GND 连接)。不同的测量显示 1300ns(探头上有长引线)。
数据表规定 50pF 电容为 320ns。所以第一次测量应该没问题。200ns 大约是 3 个时钟周期。
我初始化一个 60 字节的数组,并在将 NSS 拉低后执行一个 30 字节的 memcpy。这应该足以让 NSS 变低。
为什么等待会修复它?为什么中间少了一个字节?一开始不是吗?
问题2:
为什么示波器上的MOSI这么坏?为什么我什至可以用这样的 MOSI 图发送正确的消息?见附图。MOSI 的上升时间约为 2.5us。这太长了。为什么?如果是示波器的原因,我会在 SCK、NSS 或 MISO 上看到同样的现象。但我没有。
环境:
SPI 速度:8 MHz
SPI 模式:主机,全双工
时钟速度:16 MHz
单片机:
STM32L0
电源电压:1V8
SCK 迹线:~33mm,800 万
MOSI 迹线:~43 毫米,800 万
SPI GPIO 速度设置:最高速度
NSS 速度设置:低
示波器
输入电容:15pF
探头电容:18-22pF
探头补偿:10-35pF
探头设置:10x