1.介绍
前一篇博客介绍了使用hal库进行CAN的发送数据,接下来介绍使用CAN进行数据接收。
建议先看前一篇文章,再看这一篇文章。
CAN数据发送,文章地址。
硬件配置,以及stm32的配置,和前一篇文章相同。
2.发送数据
使用CAN进行接收数据,需要先进行过滤器的配置才能接收到数据。参考stm32的数据手册。
2.1,接收过滤器配置
void CAN_Filter_Config()
{
CAN_FilterTypeDef sFilterConfig;
//声明 CAN过滤器结构体
//列表模式的四个id
uint32_t std_id1=0x123;
uint32_t std_id2=0x223;
uint32_t std_id3=0x323;
uint32_t std_id4=0x423;
//使用列表模式
sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
//16位,因为使用的是标准帧
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh = std_id1<<5;
sFilterConfig.FilterIdLow = std_id2<<5;
sFilterConfig.FilterMaskIdHigh = std_id3<<5;
sFilterConfig.FilterMaskIdLow = std_id4<<5;
//将四个id写入寄存器
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.FilterBank = 0;
if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig)!=HAL_OK)
{
printf("filter_config_failed\r\n");
}
}
接收过滤器的配置如上图,注意我使用的是列表模式,关于列表模式与掩码模式的区别,在这里简单的赘述一下:列表模式就是只接收这几个id的数据,比如按照我上图的配置方法,只接收ID为0x123,0x223,0x323,0x423的数据,其他ID发送的数据不接受,掩码模式会比较ID的每一个bit位,只要对应的bit位符合要求,就接收数据。
2.2 中断回调函数编写
我们已经打开了CAN的接收中断,只需要在中断回调函数里面接收数据就可以了。
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
uint8_t aRxData[8], i;
CAN_RxHeaderTypeDef hCAN1_RxHeader;
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hCAN1_RxHeader, aRxData) == HAL_OK)
{
printf("\nGet Rx Message Success!!\r\nData:");
for(i=0; i<8; i++)
printf("%d", aRxData[i]);
}
}
写到这里是不是就能正常接收数据了呢?答案是不能,我们在主函数前面,还需要加一句
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING)
//打开CAN的接收中断
到此,就能完成CAN的数据接收了。
CAN发送数据,使用CAN上位机发送数据,注意发送ID,需要是我们前面配置的ID,否则会被过滤器筛选,无法接收。
可以看到串口接收到了我们发送的数据。
到此就完成了CAN总线的数据收发。
使用注意
在调试CAN总线的过程中,也踩了许多坑。
1.波特率的配置,CAN总线的波特率设置还是有点讲究的,在使用的时候,注意波特率的配置。
2.要先配置过滤器,才能接收到数据。