STM32同时使用can1与can2,can2无法使用的问题

   日期:2021-04-06     浏览:313    评论:0    
核心提示:STM32同时使用can1与can2,can2无法使用的问题首先 我们先介绍一下原理bxCAN 主要特性的其中一点需要注意在can接收数据时:● 两个具有三级深度的接收 FIFO● 可调整的筛选器组:— CAN1 和 CAN2 之间共享 28 个筛选器组从这张图片不难看出can1为主机,can2为从机。因此can2的启动前提是已经启动了can1.can通讯can2是基于can1的使用can2之前必须初始化can1因此如果使用FIFO0的话,将筛选器分配:can2的筛选器组就从14开始

STM32同时使用can1与can2,can2无法使用的问题

首先 我们先介绍一下原理

bxCAN 主要特性的其中一点需要注意

在can接收数据时:
● 两个具有三级深度的接收 FIFO
● 可调整的筛选器组:
— CAN1 和 CAN2 之间共享 28 个筛选器组


从这张图片不难看出can1为主机,can2为从机。因此can2的启动前提是已经启动了can1.

  • can通讯can2是基于can1的
    使用can2之前必须初始化can1
  • 因此举例如果使用FIFO0的话,将筛选器分配:
    can1的筛选器组就从0开始 范围为0-14
    CAN_FilterInitStructure.CAN_FilterNumber=0;
    can2的筛选器组就从14开始 范围为14-27
    CAN_FilterInitStructure.CAN_FilterNumber=14;
    注意:can过滤器配置必须用16进制

很多小伙伴可能懒得看原理,多说无益,咋们直接上代码:

1.can1&can2正常配置
2.配置can总线滤波器:

void can_filter(CAN_HandleTypeDef* hcan)
{ 
	CAN_FilterTypeDef		CAN_FilterConfigStructure;
	if (hcan == &hcan2)
	{ 
	    CAN_FilterConfigStructure.FilterBank = 14;//***********************!!
	}
	if (hcan == &hcan1)
	{ 
		CAN_FilterConfigStructure.FilterBank = 0;
	}
	CAN_FilterConfigStructure.FilterMode = CAN_FILTERMODE_IDMASK;
	CAN_FilterConfigStructure.FilterScale = CAN_FILTERSCALE_32BIT;
	CAN_FilterConfigStructure.FilterIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterIdLow = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdLow = 0x0000;

	CAN_FilterConfigStructure.FilterFIFOAssignment = CAN_RX_FIFO0;
	CAN_FilterConfigStructure.SlaveStartFilterBank = 14;
	CAN_FilterConfigStructure.FilterActivation = ENABLE;
    HAL_CAN_ConfigFilter(hcan, &CAN_FilterConfigStructure);      
}

3.主函数里初始化

  MX_CAN1_Init();//先初始化can1!!!!!
  MX_CAN2_Init();
 can_filter(hcan1);
 can_filter(hcan2);

4.齐活

如果你觉得还有用就点一个赞叭。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服