newlined 发表于 2025-3-21 11:10:00

关于CAN通讯接收的数据的处理

大家好,我用STC的CAN做了一个接收数据,再回复的板子,
每几十秒收一次数据,然后马上回复,
程序是用例程《CAN总线标准帧收发测试》(汇编)改的,程序的工作过程是这样的,
1、CAN总线收到数据,置位一个标志。
2、一个4mS的中断去读这个标志,有数据,就读出。
3、识别是否是发给自己的数据,是的话,就把回复的数据写入发送缓冲区.
4、另一个4mS的中断,读发送缓冲区中是否有数据,有的话,就写入CAN发送缓冲区,启动CAN发送。

在实际测试中发现有时不回复,几个小时才出现一次,我还没有用示波器抓到是哪个环节出了问题。
我看例程中,每次发送数据之前,都会检测当前CAN是否在BUS-OFF 状态,是的话就清零MR的RM位,
退出这个状态。如果CAN处于BUS-OFF 状态的话,是不是就不能接受数据了?
我是否可以在一个中断中,每过一段时间,去检测CAN是否处于BUS-OFF 状态状态,
如果处于BUS-OFF 状态状态的话,就执行退出BUS-OFF 状态?

国芯人工智能 发表于 2025-3-21 11:12:00

关于您提到的CAN通讯接收数据处理的异常情况,建议从以下几个方面进行排查:<br><br>1. CAN总线状态检测:在发送数据前,确保检测CAN控制器是否处于接收(RX)状态。如果CAN控制器正在接收数据,直接发送可能会导致冲突或数据丢失。建议在发送前增加状态检测逻辑,确保CAN控制器处于空闲状态。<br><br>2. 中断优先级与冲突:您提到使用了两个4ms中断处理接收和发送。建议检查中断优先级设置,确保接收中断优先级高于发送中断,以避免发送中断抢占接收中断,导致数据丢失。<br><br>3. 缓冲区溢出:长时间运行中,可能出现缓冲区溢出。建议在接收和发送时增加缓冲区状态检测,避免数据覆盖或丢失。<br><br>4. CAN总线负载与错误处理:CAN总线负载过高或出现错误帧可能导致通信异常。建议启用CAN错误检测机制,并在程序中增加错误处理逻辑。<br><br>5. 硬件与信号完整性:使用示波器检查CAN总线信号波形,确保信号完整性,排除硬件故障或干扰。<br><br>通过以上步骤,应能有效定位并解决通信异常问题。希望这些建议对您有所帮助。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]

王昱顺 发表于 2025-3-21 12:37:33

是可以这么做的
不过还有一种可能是,内部接收数据比较多导致fifo满溢出而没有接收到数据
这里有一种解决方式就是通过设置过滤寄存器,从硬件上对信息进行一次基础过滤
如果需要判断是否给自己的,是只用ID来判断的话,甚至可以通过设置过滤,省略掉判断这个步骤
这样对于处理压力来说,也会小很多



newlined 发表于 2025-3-21 14:28:23

王昱顺 发表于 2025-3-21 12:37
是可以这么做的
不过还有一种可能是,内部接收数据比较多导致fifo满溢出而没有接收到数据
这里有一种解决方 ...

谢谢版主的回复,我按照这个思路检查下。
页: [1]
查看完整版本: 关于CAN通讯接收的数据的处理