STM32 H7 CAN丢包问题浅谈

本文讲述了在调试STM32H7的CAN通信时遇到的问题,涉及到Cubemx配置中fifo邮箱分配、数据发送的完整性和FDCAN模块的使用。作者强调了FIFO队列空闲级别的正确设置对防止丢包的关键作用,以及移植过程中需要注意的差异。
摘要由CSDN通过智能技术生成

最近在调试H7 的CAN问题时发现有不少的问题。
例如在使用Cubemx配置时一定要给每个fifo分配邮箱。否则会导致CAN无法发送
在这里插入图片描述
丢包问题
在使用CAN连续发送时发现只发送了第一次的数据后面的数据根本没有发送出来。下面进行代码分析

/* CAN 发送一帧数据 */
void FDCAN_Send_Message(uint32_t id,uint8_t *buf,uint8_t len)
{
  FDCAN_TxHeaderTypeDef TxHeader;	
  /* 配置Tx缓冲区消息 */
  TxHeader.Identifier = id;                 /* 报文ID */
  TxHeader.IdType = FDCAN_EXTENDED_ID;      /* 扩展ID模式  */
  TxHeader.TxFrameType = FDCAN_DATA_FRAME;  /* 数据帧 */
	
  #if defined (CLASSIC_CAN)
   if(len >= 8)
	   len = 8;
  uint32_t CAN_FRAME_DL = len<<16; 
  #else
   uint32_t CAN_FRAME_DL = FDCAN_DLC_BYTES_64; /* FDCAN 默认使用64*/
   #endif
   
  TxHeader.DataLength = CAN_FRAME_DL;   /* 数据帧长度 */
  TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /*发送节点错误 */
  TxHeader.BitRateSwitch = FDCAN_BRS_OFF;    /* 无波特率切换 */
  TxHeader.FDFormat = CAN_MODE;          /* CAN模式*/
  TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
  TxHeader.MessageMarker = 0x01;
 /* 发送缓冲区消息 */
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, buf);
    while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=2);/*等待发送完成*/
}

其中

`while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=2);/*等待发送完成*/` 

没有这个函数则会导致丢包 !!!
而在F407中则是

   while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=3) 

之前在F407中移植到H743中的时候导致一直卡在这里 发现level不同!!!

注意在使用CAN前一定要启动CAN

/* 启动FDCAN模块 */
  HAL_FDCAN_Start(&hfdcan1);
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cat_milk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值