树莓派支持包中的CAN接收阻塞:为什么CAN消息接收在一段时间后停止工作万博1manbetx?

4次浏览(最近30天)
我试图用8个数据字节从Arduino发送扩展ID CAN消息到树莓派。为此,我使用了树莓派的Simulink支持包中的CAN接收块和基于CAN模块的外部MCP2515,更准万博1manbet万博1manbetxx确地说,是Joy-it SBC-CAN0(附件中的MCP2515数据表)。为了调试通信,在树莓派上实现的simulink模型以外部模式运行万博1manbetx,这样我就可以实时看到新的can消息到达。Arduino每30ms发送CAN消息,消息之间有一个可调的延迟,并将CAN数据的第一个数据字节增加1,或者在前一个值等于255的情况下将其重置为0。
我在附件中添加的调试模型,然后还检查每个CAN通道(=CAN接收块链接到特定的CAN ID),如果接收到的数据字节的拳头每个发送周期增加超过1 (= arduino 30ms)。这将表明错过了一个CAN消息。
通信工作得很好,但在某种程度上,我无法看到任何新的消息到达Simulink模型。万博1manbetx你可以在模拟数据检查器的锯齿状图中看到这种行为。(附件画面截图)即使没有改变任何参数,通信停止工作的持续时间也从几秒到100秒不等。
我已经监视了CAN信号,中断和SPI通信,通信停止的那一刻。为此,我触发了示波器到连接到树莓的MCP2515的中断PIN的低电平,比CAN消息之间的延迟时间长。这标志着通信的停止点,因为读取mcp2515的接收寄存器和错误寄存器的过程是由下降的中断边发起的。我从 中的MW_CANInitializeInterrupt函数 MW_MCP2515_CAN.c文件用于嵌入式编码器的代码生成。我注意到通信停止前的最后一个CAN消息从MCP2515正确读取。但是中断引脚不会返回到HIGH,而是保持在LOW。由于中断引脚在此之后没有下降沿,所以没有新的CAN消息从MCP2515读取。如果我手动将高电平应用到INT PIN上,然后在不久之后释放,使其转回低电平,覆盆子再次开始从MCP2515读取CAN消息,可能是因为再次出现了下降边。
来自Arduino的有效CAN消息继续发送,如果它们不再接收到显示在Simulink模型中。万博1manbetx
对于30毫秒的周期时间,如果我减少发送CAN消息之间的延迟,如果延迟太短,通信就会更频繁地停止,甚至根本不会启动。此外,错过的CAN消息数量也会增加。
此外,为了首先启动通信,中断引脚必须手动提升到高电平并再次释放。如果没有,则没有下降沿,因此不会从MCP2515寄存器读取数据。
总之,在我看来,MCP2515中的某些东西导致中断引脚保持低电平,即使它不应该。
有人知道中断引脚保持低的原因是什么吗?还是有完全不同的原因导致通讯突然中断?
我使用带有mathworks_raspbian_R20.2.0图像和Matlab 2020b版本的树莓派4模型B。
在附件中的图中,CAN消息之间的延迟为600ms,发送周期时间为30ms, CAN接收块的采样时间为0.1ms。
7评论

登录评论。

答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!