上一节我们发现无论CANH、CANL接地或者断开,调用函数CAN_TransmitMessage(CAN_Type *CANx, const CAN_MsgInfoType *info, CAN_TransmitBufferType type)发送的数据返回值永远是0,查看原函数发现这里只管数据能正常丢入缓冲区。对于发送错误并没有相关判断。库函数中int32_t CAN_GetError(CAN_Type *CANx)可以用于获知CANCTRL当前的状态。
在代码中增加这么一段话,然后再进行相关测试。
仍然让CAN每隔1S发送一次数据。
1.断开CANL
正常情况下打印 0x400 查表得知是已完成STB发送任务
断开CANL之后打印0x810600(TEC开始累加)
0x810400
KEER 显示最后的错误是应答错误
查看寄存器发现TEC寄存器开始自动累加,直到0x80
CAN err sts C10400(TEC达到0x80)
最终节点进入被动错误。
CANL重新接好之后TEC开始递减,减为0之后节点退出错误状态
2.断开CANH,也得到类似的效果
3.CANH、CANL短接
CAN err sts D00000
CAN err sts C10400
KOER显示的错误是 Bit error
TEC寄存器每次递增0x08,达到255之后重新开始计数
也是进入被动错误
4.CANH接地
KOER Bit err
CAN err sts D00000
CAN err sts C10400
TEC寄存器每次递增0x08,达到255之后重新开始计数
5.CANL接地
KOER Stuff error 填充错误
RECNT计数器累加
CAN err sts 810200(达到错误警告限制,总线错误中断标志,错误中断,)
CAN err sts D10000(错误被动中断)
CAN err sts C10000(错误被动模式激活,达到错误警告限制)
解除异常之后RECNT不会自动清零,只有每成功接收一帧RECNT减1.直到为0,节点才会退出错误模式。
上面我们整理了,在各种异常情况下CAN错误状态标记的变化,下一节在结合理论探讨一下。