stm32 CAN发送丢包

6 篇文章 0 订阅
3 篇文章 0 订阅

stm32 CAN发送丢包

多机组网的工况下stm32 CAN发送函数正常运行,数据更新,但是使用CAN抓包工具发现阶段性没数据,或者丢包等情况。

这种情况分两种;

  1. 发送太快,STM32集成的CAN控制器支持三个发送邮箱,但是一般的示例程序没有对邮箱的操作,默认使用邮箱0,发送太快导致邮箱占用过高导致丢包。

//Find an empty sending mailbox
	while (HAL_CAN_GetTxMailboxesFreeLevel(&CAN_H) == 0);	//If all three sender mailboxes are blocked, wait until one of them is free
	
	if ((CAN_H.Instance->TSR & CAN_TSR_TME0) != RESET) {
		//Check the status of sender mailbox 0. If mailbox 0 is idle, put the data to be sent into FIFO0
		TxMailbox = CAN_TX_MAILBOX0;
	} else if ((CAN_H.Instance->TSR & CAN_TSR_TME1) != RESET) {
		TxMailbox = CAN_TX_MAILBOX1;
	} else if ((CAN_H.Instance->TSR & CAN_TSR_TME2) != RESET) {
		TxMailbox = CAN_TX_MAILBOX2;
	}
	HAL_CAN_AddTxMessage(&CAN_H, &can_tx.tx_header, can_tx.data, &TxMailbox);	// Send response

用该方法来选择可用的邮箱发送。

对一些实时性要求高的情况“while (HAL_CAN_GetTxMailboxesFreeLevel(&CAN_H) == 0)”会有阻塞作用,可以选择依次按邮箱123来输入数据,大多情况也能解决丢包问题,总感觉这么操作有些不太合理,但的确没出过问题。

		static uint8_t mailbox_count = 0;

		if (mailbox_count== 0) {
			TxMailbox = CAN_TX_MAILBOX0;
		} else if (mailbox_count== 1) {
			TxMailbox = CAN_TX_MAILBOX1;
		} else if (mailbox_count== 2) {
			TxMailbox = CAN_TX_MAILBOX2;
			mailbox_count = 0;
		}
		mailbox_count++;
  1. 多主\从站组网,导致总线占用冲突,长时间会导致CAN外设丢掉老数据来发送新的数据,如果使用操作系统等发送可以在发送函数后增加一个延时一般1us就够,或者打开自动重发,根据实际情况选择其中一个方法即可。

image.png

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种高性能的32位微控制器,具有广泛的应用领域。其中,CAN(Controller Area Network)通讯是STM32最常用的通信协议之一。下面是关于STM32 CAN通讯例程的一些介绍。 STM32 CAN通讯例程是一种用于实现CAN通讯功能的开发示例。该例程提供了一套完整的CAN通讯工作流程,包括初始化CAN模块、配置CAN通讯参数、发送CAN和接收CAN等。 在使用STM32 CAN通讯例程之前,首先需要在STM32开发板上连接CAN总线,以实现外部设备和STM32的通信。然后,需要通过调用相应的函数来初始化CAN模块,并设置通讯参数,如波特率、过滤器和模式等。 一旦CAN模块初始化完毕,就可以使用相应的函数来发送和接收CAN发送CAN需要将数据打包为CAN的格式,并使用相应的标识符将其发送到总线上。接收CAN需要使用相应的函数持续监听总线上的数据,并将接收到的数据解析为可用的格式。 在进行CAN通讯时,还可以使用中断或DMA来处理接收和发送数据。中断可以实现数据的实时处理和异步通知,而DMA可以实现高速的数据传输,提高系统性能。 STM32 CAN通讯例程具有广泛的应用场景,如汽车电子系统、工业自动化控制和智能家居等。通过学习和理解STM32 CAN通讯例程,开发者可以更好地使用STM32的CAN通讯功能,实现各种实际应用的需求。 总之,STM32 CAN通讯例程提供了一套方便易用的开发示例,帮助开发者快速上手并实现CAN通讯功能。通过学习该例程,开发者可以扩展STM32的应用范围,实现更多有趣和实用的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值