STM32之CAN---错误管理分析
3 STM32的bxCAN实现
3.1 bxCAN错误状态图
3.2 出错管理
CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据错误的情况而增加或减少。软件可以读出它们的值来判断CAN网络的稳定性。此外,CAN_ESR寄存器提供了当前错误状态的详细信息。通过设置CAN_IER寄存器(比如ERRIE位),软件可以灵活地控制中断的产生――当检测到出错时。
3.3 离线恢复
当TEC等于255时,bxCAN就进入离线状态,同时CAN_ESR寄存器的BOFF位被置’1’。在离线状态下,bxCAN无法接收和发送报文。
根据CAN_MCR寄存器的ABOM位的设置,bxCAN可以自动或在软件的请求下,从离线状态恢复(变为错误主动状态)。在这两种情况下,bxCAN都必须等待一个CAN标准所描述的恢复过程(CAN RX引脚上检测到128次11个连续的隐性位)。
如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,软件必须先请求bxCAN进入然后再退出初始化模式,随后恢复过程才被开启。
注: 在初始化模式下,bxCAN不会监视CAN RX引脚的状态,这样就不能完成恢复过程。为了完成恢复过程,bxCAN必须工作在正常模式。
4 CAN错误状态寄存器 (CAN_ESR)
地址偏移量: 0x18
复位值: 0x0000 0000
位31:24 | REC[7:0]: 接收错误计数器 这是对CAN协议的故障界定机制接收部分的实现。按照CAN的标准,当接收出错时,根据出错的情况该计数器加1或加8;而在每次接收成功后,该计数器减1,或减少其值为120-当该计数器的值大于127时。当该计数器的值超过127时,CAN进入错误被动状态。 |
位23:16 | TEC[7:0]: 发送错误计数器 与上面相似,这是对CAN协议的故障界定机制发送部分的实现。 |
位15:7 | 保留位,硬件强制为0。 |
位6:4 | LEC[2:0]: 上次错误代码 在检测到CAN总线上发生错误时,硬件根据出错情况设置其为1~6的值。当报文被正确发送或接收后,硬件清除其值为’0’。 硬件没有使用错误代码7,软件可以设置该值,从而可以检测代码的更新。 000: 没有错误; 001: 位填充错; 010: 格式(Form)错; 011: 确认(ACK)错; 100: 隐性位错; 101: 显性位错; 110: CRC错; 111: 由软件设置。 |
位3 | 保留位,硬件强制为0。 |
位2 | BOFF: 离线(Bus Off)标志 当进入离线状态时,硬件对该位置1。当发送错误计数器TEC溢出,即大于255时,CAN进入离线状态。 |
位1 | EPVF: 错误被动(Error Passive)标志 当出错次数达到错误被动的阈值时,硬件对该位置1。 (接收错误计数器或发送错误计数器的值>127)。 |
位0 | EWGF: 错误警告标志 当出错次数达到警告的阈值时,硬件对该位置1。 (接收错误计数器或发送错误计数器的值≥96)。 |
评论