STM32中CAN外设的操作是否要等待ISR例程代码的执行?
Does the operation of the CAN peripheral in STM32 wait for the execution of the ISR routine code?
我正在使用 CAN 协议在微控制器 STM32L433 上开发堆栈层;堆栈的一个基本部分是设备的身份验证。
在身份验证期间,可能会发生两个(或更多)设备开始发送具有相同标识符和不同有效负载(真正的随机值)的 CAN 消息(身份验证消息)。在这种情况下,每个设备都应该能够检测到此消息是否首先从另一个设备发送。
我研究过这个案例,可能会出现三种情况:
- 设备同时开始发送消息;在这种情况下,只有一个设备能够发送消息,因为所有其他设备都检测到一个错误,然后中止传输。
- 在所有其他设备加载CAN外设的传输邮箱之前,或者在其他设备的CAN外设设置要发送的消息之前,只有一个设备能够发送消息并占用总线预定状态。
在这种情况下,尚未能够发送消息的设备将收到接收中断;在接收的 ISR 例程中,我能够中止传输。
- 只有一个设备能够发送消息并占用总线,其他设备的所有其他 CAN 外设都处于 SCHEDULED 状态并等待总线空闲。
在这种情况下,无法发送消息的设备将收到接收中断。同样在这种情况下,我想在接收的 ISR 例程中停止传输(如情况 2)),但我不确定这是否对所有消息都有保证,因为如果 CAN 外设设置了将要发送的消息在ISR里面的代码执行之前的TRANSMIT状态下,abort的操作是没有效果的。
我的问题是(与情况3相关):SCHEDULED状态的发送MAILBOX中的消息是在执行接收ISR例程中的代码后设置为TRANSMISSION状态还是这个东西不保?
首先回答你的第三种情况,不,不能保证你的消息在接收时不在总线上。因为中断也可能有一些延迟,在这段时间内,邮箱可能可以继续传输。
您的“身份验证”听起来也有点麻烦,因为外部人员也无法真正决定哪个 ECU 实际上赢得了仲裁并实际发送了该特定消息。
我们在车辆中有 ECU,它们根据某些方法在运行时决定,它们通过引脚和一些 CAN 接收安装,但仅限于监听模式。 TX 实际上在堆栈中被禁用。之后,检测完成,我们切换配置,重启通信栈,进一步初始化软件上去。
但是这些“设置”通常是预先定义的,例如由于 master/slave(vehicle/private 总线通信),或者某些连接器引脚连接到 GND / OPEN / UBAT,或者一些总线消息告诉公交车开着。
感觉比你的方法靠谱
我正在使用 CAN 协议在微控制器 STM32L433 上开发堆栈层;堆栈的一个基本部分是设备的身份验证。
在身份验证期间,可能会发生两个(或更多)设备开始发送具有相同标识符和不同有效负载(真正的随机值)的 CAN 消息(身份验证消息)。在这种情况下,每个设备都应该能够检测到此消息是否首先从另一个设备发送。
我研究过这个案例,可能会出现三种情况:
- 设备同时开始发送消息;在这种情况下,只有一个设备能够发送消息,因为所有其他设备都检测到一个错误,然后中止传输。
- 在所有其他设备加载CAN外设的传输邮箱之前,或者在其他设备的CAN外设设置要发送的消息之前,只有一个设备能够发送消息并占用总线预定状态。 在这种情况下,尚未能够发送消息的设备将收到接收中断;在接收的 ISR 例程中,我能够中止传输。
- 只有一个设备能够发送消息并占用总线,其他设备的所有其他 CAN 外设都处于 SCHEDULED 状态并等待总线空闲。 在这种情况下,无法发送消息的设备将收到接收中断。同样在这种情况下,我想在接收的 ISR 例程中停止传输(如情况 2)),但我不确定这是否对所有消息都有保证,因为如果 CAN 外设设置了将要发送的消息在ISR里面的代码执行之前的TRANSMIT状态下,abort的操作是没有效果的。
我的问题是(与情况3相关):SCHEDULED状态的发送MAILBOX中的消息是在执行接收ISR例程中的代码后设置为TRANSMISSION状态还是这个东西不保?
首先回答你的第三种情况,不,不能保证你的消息在接收时不在总线上。因为中断也可能有一些延迟,在这段时间内,邮箱可能可以继续传输。
您的“身份验证”听起来也有点麻烦,因为外部人员也无法真正决定哪个 ECU 实际上赢得了仲裁并实际发送了该特定消息。
我们在车辆中有 ECU,它们根据某些方法在运行时决定,它们通过引脚和一些 CAN 接收安装,但仅限于监听模式。 TX 实际上在堆栈中被禁用。之后,检测完成,我们切换配置,重启通信栈,进一步初始化软件上去。
但是这些“设置”通常是预先定义的,例如由于 master/slave(vehicle/private 总线通信),或者某些连接器引脚连接到 GND / OPEN / UBAT,或者一些总线消息告诉公交车开着。
感觉比你的方法靠谱