STM32中CAN外设的操作是否等待执行ISR例程代码?

问题描述 投票:0回答:1

我正在微控制器STM32L433上开发一个使用CAN协议的堆栈层;堆栈的基本部分是设备的身份验证。在认证期间,可能发生两个(或更多)设备开始发送具有相同标识符和不同有效载荷(真随机值)的CAN消息(认证消息)。在这种情况下,每个设备都应该能够检测此消息是否是从另一个设备首先发送的。

我研究了这个案例,可能会出现以下三种情况:

  1. 设备开始同时发送消息;在这种情况下,只有一个设备能够发送消息,因为所有其他设备都检测到一个错误而不是中止传输。
  2. 在所有其他设备加载CAN外设的传输MAILBOX之前,或者在其他设备的CAN外设设置将在SCHEDULED状态下发送的消息之前,只有一个设备能够发送消息并占用总线。在这种情况下,无法发送消息的设备将收到接收中断;在接收的ISR例程中,我能够中止传输。
  3. 只有一个设备能够发送消息并占用总线,而其他设备的所有其他CAN外设都具有处于SCHEDULED状态的消息,并且正在等待该总线变为空闲。在这种情况下,无法发送消息的设备将收到接收中断。同样在这种情况下,我想在接收的ISR例程中停止传输(如情况2)),但我不确定这是否保证所有消息,因为如果CAN外围设置将要发送的消息在执行ISR内部代码之前的TRANSMIT状态中,中止操作将不起作用。

我的问题是(与情况3有关):在执行接收ISR例程中的代码或不保证这个事情后,SCHEDULED状态的传输MAILBOX中的消息被设置为TRANSMISSION状态?

embedded interrupt stm32 can-bus
1个回答
1
投票

首先回答你的第三个案例,不能保证,你的消息不在公交车上,而是在接收时。因为,中断也可能有一些延迟,并且在这段时间内,邮箱可能能够继续传输。

您的“身份验证”听起来也有点麻烦,因为外面的任何人都无法真正决定,哪个ECU实际上就是那个,它赢得了仲裁并实际发送了该特定消息。

我们在车辆中有ECU,它们在运行时根据某些方法决定,它们通过引脚和一些CAN接收来安装,但仅在监听模式下,TX实际上在堆栈中被禁用。检测完成后,我们切换配置并重新启动通信栈,并进一步初始化SW。但是这些“设置”通常是事先定义的,例如,由于主/从(车辆/专用总线通信),或者某些连接器引脚连接到GND / OPEN / UBAT,或者某些总线消息告诉它在哪个总线上。

这似乎比你的方法更可靠。

© www.soinside.com 2019 - 2024. All rights reserved.