STM32的hal库CAN开发指南2,CAN数据接收

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发送数据,使用CAN上位机发送数据,注意发送ID,需要是我们前面配置的ID,否则会被过滤器筛选,无法接收。
串口助手
可以看到串口接收到了我们发送的数据。

到此就完成了CAN总线的数据收发。

使用注意

在调试CAN总线的过程中,也踩了许多坑。

1.波特率的配置,CAN总线的波特率设置还是有点讲究的,在使用的时候,注意波特率的配置。
2.要先配置过滤器,才能接收到数据。

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值