CAN的一帧数据是比较长的,250k波特率下,一个8字节的数据帧时间大约460us,在硬件接收完成数据放到FIFO内部,或者触发接收中断之前,软件要判断CAN硬件是否在接收数据是比较难的,只能借助硬件提供某个寄存器位查询。
GD32E103的状态寄存器CAN_STAT第9位RS感觉应该是提供这个功能的,文档英文描述为:
9 RS Receiving state
0: CAN is not working in the receiving state
1: CAN is working in the receiving state
这个英文描述比较清晰,RS=1表示CAN当前是接收状态,正在接收数据。RS=0说明么有接收数据,要么是发送数据要么是空闲的。
中文手册为:
9 RS 接收状态
0:CAN当前不是接收器
1:CAN当前是接收器
中文描述有点让人困惑,RS=1时是接收器,但是接收器除了在接收状态,还可能是空闲的。
实际测试发现,CAN初始化以后,CAN总线上无数据通讯,CAN_STAT寄存器为0x00000E00,也就是RS=1,和预想中完全不一样,无法用这一位来判断CAN是否正在接收数据。
STM32F103的CAN外设寄存器分布和GD32C103/E103除了FD以外几乎完全一样,实测STM32F103的CAN初始化以后,CAN总线上无数据通讯,CAN_STAT寄存器为0x00000C00,也就是RS=0,接收数据的话,CAN_STAT寄存器的RS位数值会变,可以用这一位来判断CAN外设是否在接收数据。
|