【发布时间】:2023-04-06 06:35:01
【问题描述】:
我正在使用 CAN 协议的微控制器 STM32L433 上开发堆栈层;堆栈的一个基本部分是设备的身份验证。
在身份验证期间,可能会出现两个(或更多)设备开始发送具有相同标识符和不同有效负载(真实随机值)的 CAN 消息(身份验证消息)。在这种情况下,每个设备都应该能够检测到此消息是否首先从另一个设备发送。
我研究过这个案例,可能会出现三种情况:
- 设备同时开始发送消息;在这种情况下,只有一台设备能够发送消息,因为所有其他设备都检测到一个错误,然后中止传输。
- 在所有其他设备加载 CAN 外设的传输 MAILBOX 之前,或在其他设备的 CAN 外设设置将要发送到 SCHEDULED 中的消息之前,只有一个设备能够发送消息并占用总线状态。 在这种情况下,无法发送消息的设备将收到接收中断;在接收的 ISR 例程中,我可以中止传输。
- 只有一个设备能够发送消息并占用总线,其他设备的所有其他 CAN 外围设备的消息处于 SCHEDULED 状态并等待总线空闲。 在这种情况下,无法发送消息的设备将收到接收中断。同样在这种情况下,我想在接收的 ISR 例程中停止传输(如情况 2)),但我不确定这是否能保证所有消息,因为如果 CAN 外设设置将要发送的消息在ISR内部代码执行前处于TRANSMIT状态,abort操作无效。
我的问题是(与情况3有关):发送MAILBOX中处于SCHEDULED状态的消息是在执行接收ISR例程中的代码之后设置为TRANSMISSION状态还是这个东西不保证?
【问题讨论】:
-
1.不,这不可能发生,因为繁忙的总线不是错误。有效载荷中具有更多隐性位的节点将退出并在总线下次可用时再次尝试发送。这将由 CAN 控制器处理,并且 tx 缓冲区将保持忙碌/占用,直到消息成功发送。
-
我也不熟悉这个特殊的 CAN 控制器,但通常邮箱寄存器只是单独的 rx 和 tx 缓冲区之上的程序员接口。也就是说,一旦您将数据写入缓冲区,它通常会被转移到没有内存映射且您无法直接访问的实际 tx 缓冲区中。
-
@Lundin 非常感谢。如果错误发生正常,我可以中止传输,但我的问题与情况 3)有关。
标签: embedded interrupt stm32 can-bus