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

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.齐活

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

  • 18
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
stm32f4可以同时使用CAN1和CAN2总线进行通信,但是在使用CAN总线通信时,可能会出现busy的情况。 CAN总线是多主机共享的通信介质,因此在多个节点同时发送消息时,可能会导致总线繁忙(busy)的情况。当CAN总线正在发送消息时,其他节点需要等待总线空闲才能发送自己的消息。这种情况下,如果同时使用CAN1和CAN2总线通信,可能会导致总线频繁地处于busy状态,进而影响通信的稳定性和效率。 为解决这个问题,可以考虑以下方法: 1. 合理规划消息发送时间:通过合理规划消息的发送时间,可以避免同时发送大量消息导致总线一直处于busy状态。可以采用时间分片的方式,确保每个节点在适当的时间段发送消息。 2. 使用优先级:通过为不同的消息设置不同的优先级,可以控制消息的发送顺序,避免同时发送大量优先级相同的消息导致总线繁忙。低优先级的消息可以等待总线空闲时再发送。 3. 当总线繁忙时进行重试:在节点发送消息时,如果检测到总线繁忙,可以选择等待一段时间后再次尝试发送。通过设定适当的重试次数和重试间隔,可以提高消息发送成功率。 总之,同时使用CAN1和CAN2总线进行通信时,需要注意总线繁忙的情况。通过合理规划消息发送时间、使用优先级和进行重试等方法,可以有效解决总线繁忙问题,提高通信的稳定性和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值