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 现在可以完美地工作了。
我正在新的定制板上设置 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 现在可以完美地工作了。