以前没有接触过CAN通信,最近接触CAN通信,要调试F0芯片上的can通信,发送调试好了,接收总是只能接收固定id的数据,
这主要和过滤器有关,通过对过滤器的设置可以过滤特定的canid的数据,也可以接收任意canid的数据,具体设置方法如下:
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0; //过滤器0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; //设为列表模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//滤波器位宽为单个32位
sFilterConfig.FilterIdHigh = 0x0000; //基本ID放入到STID中
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0;//这里设置接收任意ID的CAN数据
sFilterConfig.FilterMaskIdLow = 0;//0表示接收来自发送端任意ID的数据
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //接收到的报文放入到FIFO0中
sFilterConfig.FilterActivation = ENABLE; //激活过滤器
sFilterConfig.SlaveStartFilterBank = 0;
HAL_Status=HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);
使用过滤器0,当将FilterMode 设置为列表模式的时候,屏蔽寄存器FiterMask也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符FilterId相同, 所以列表模式下是过滤特定的ID模式,
如果将FilterMode设置为CAN_FILTERMODE_IDMASK模式,FilterMaskId设置为0时,表示不过滤,可以接收任意的canid数据,
当filterMaskId不为0时,则表示过滤 对应MaskID 为1的bit必须与FilterID中的bit位相同的canid才能接收过来。
比如filterid=0x10101010, maskid=0x0000ffff, 则只有id=0x xxxx 1010的数据才能接收,xxxx可以不用与filterid的高2字节相同,可以任意。