CAN总线数据有一些位总是设置为0

Can-bus data has some bits always set to 0

我正在新的定制板上设置 CAN 总线。它使用通过 SPI 总线连接的 mcp2515 控制器。使用 'candump' 接收时,数据中的一位始终为 0(具体而言,数据的第一位)。总线上的另外两个设备工作正常。
可能相关,硬件中存在时序问题,我必须将波特率设置为高 20% 才能为其他设备获得正确的波特率。

如果我断开总线电缆并启用环回,甚至会发生这种情况!

#ip link set can0 type can bitrate 600000 loopback on
#ifconfig can0 up
#candump can0 &
# cansend can0 0FF#AABBCCDDEEFFFFFF
  can0  4FB   [8]  2A BB CC DD EE FF FF FF
  can0  0FF   [8]  AA BB CC DD EE FF FF FF
# cansend can0 0AB#AABBCCDDEEFFFFFF
  can0  4AB   [8]  2A BB CC DD EE FF FF FF
  can0  0AB   [8]  AA BB CC DD EE FF FF FF
# cansend can0 000#0000CCDDEEFFFFFF
  can0  400   [8]  00 00 4C DD EE FF FF FF
  can0  000   [8]  00 00 CC DD EE FF FF FF

为什么会发生这种情况,有什么明显的原因吗?
即使在环回模式下,硬件中的时序错误是否可能导致此问题?

编辑
删除了错误 CAN_ID 'FFF' 的示例以减少混淆

我设法找到了解决这两个问题的方法:

  • crystal 被定义为 24 MHz,但内置了 20 MHz。这解释了为什么我需要高 20% 的波特率才能进行通信。
  • SPI 总线的最大频率错误。不知何故,一些最先收到的数据在读取总线时为零。通过正确的设置,can-bus 现在可以完美地工作了。