其他分享
首页 > 其他分享> > 【FDCAN】STM32G0B1+FDCAN+HAL库调试记录

【FDCAN】STM32G0B1+FDCAN+HAL库调试记录

作者:互联网

文章目录


前言

本文是本人以STM32G0B1为平台,记录下调试总结,仅供参考,若有不对的地方,还劳烦指正。


一、实验环境?

1)MCU:STM32FG0B1VCT6 2)CAN工具:广成CAN总线分析仪双通道can转usb模块USBCAN调试解析工具can卡

在这里插入图片描述

3)CAN收发器:TCAN1042DRQ1
4)STM32CubeMX版本:V6.3.0
在这里插入图片描述

5)固件版本:STM32Cube FW_G0 V1.5.0
6)仿真器:ST-LINK V2
7)MDK: V5.30.0.0
在这里插入图片描述

二、CAN和FDCAN区别

1.介绍

CAN:1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议.

CAN_FD:随着人们对数据传输带宽要求的增加,传统的CAN总线由于带宽的限制难以满足这种增加的需求。此外为了缩小CAN网络(max. 1MBit/s)与FlexRay(max.10MBit/s)网络的带宽差距,2011年BOSCH公司推出了CAN FD 。

2.FDCAN有哪些优点(个人角度):

1)速度更快,最快可以达到10M,普遍采用5M。
2)一包数据长度最大支持64个字节,而普通CAN一包最大8个字节,通信效率大大提高。
3)CAN_FD全称是Flexible Data-Rate,意思就是帧报文中数据段波特率可变的特性,即仲裁段和数据控制段使用标准的通信波特率,而传输数据段时就会切换到更高的通信波特率。


三、CAN发送

1.STM32CubeMX配置截图:

在这里插入图片描述
1)Clock Divider:表示CAN时钟分频,STM32G0B1时钟最大支持64M,这里选择不分频。
2)Frame Format:这里选择经典模式,即把它当作普通CAN模式。
3)Mode:这里选择正常工作模式,此外还有回环模式。
4)Nominal Prescaler:表示仲裁段和数据控制段分频系数
5)Nominal Sync Jump Width:重新同步跳跃宽度。
6)Nominal Time Seg1和Nominal Time Seg2:和设置波特率有关,BAUD=Freq/Clock Divider/Prescaler/(Seg1+Seg2+1)=64M/1/8/(10+5+1)=500K
7)下面Data和上面类似。
8)Std Filters Nbr:标准帧滤波器数量。是配置CAN接受时候使用的滤波器数量,用了多少个就写多少个。
9)Ext Filters Nbr:扩展帧滤波器数量。

2.用户需要自己添加的内容:

1)在初始化的时候添加如下:

 if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
  {
   Error_Handler();
  }

2)在主循环中添加如下:

    TxHeader.Identifier = 0x0fffffff;
    TxHeader.IdType = FDCAN_EXTENDED_ID;
    TxHeader.TxFrameType = FDCAN_DATA_FRAME;
    TxHeader.DataLength = FDCAN_DLC_BYTES_8;
    TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
    TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
    TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
    TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
    TxHeader.MessageMarker = 0;

    ++TxData[7];

    if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData) != HAL_OK)
    {
      Error_Handler();
    }
    HAL_Delay(1000);

3)增加两个全局变量,方便调试观查

FDCAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[8] = {0};

3.调试结果:

在这里插入图片描述
工程下载连接:FDCAN_Send,点我下载!!!!!!


四、CAN接受

1.滤波器类型采用掩码方式:

1)添加如下函数实现:
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
void FDCAN1_Config(void)
{
  FDCAN_FilterTypeDef sFilterConfig;
  /* Configure Rx filter */
  sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  sFilterConfig.FilterIndex = 1;
  sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  sFilterConfig.FilterID1 = 0x00000023;
  sFilterConfig.FilterID2 = 0x1FFFFFFF;

  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  sFilterConfig.FilterIndex = 0;
  sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  sFilterConfig.FilterID1 = 0x00000026;
  sFilterConfig.FilterID2 = 0x1FFFFFFF;

  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /* Configure global filter:
     Filter all remote frames with STD and EXT ID
     Reject non matching frames with STD ID and EXT ID */
  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  {
    Error_Handler();
  }

  /* Start the FDCAN module */
  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
  {
    /* Retrieve Rx messages from RX FIFO0 */
    if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
    {
      Error_Handler();
    }
  }
}
2)调试结果:

扩展ID发送0x23的时候,CAN总线上的数据是会通过滤波器编号为1的滤波器送达单片机内部的CAN控制器上。
在这里插入图片描述
扩展ID发送0x26的时候,CAN总线上的数据是会通过滤波器编号为2的滤波器送达单片机内部的CAN控制器上。
发送扩展ID为其他的时候,CAN总线上的数据都会被滤波器过滤掉,并不会送到CAN控制器上。
工程下载连接:FDCAN_Receive_MASK,点我下载!!!!


总结

1.当滤波器选择为掩码方式的时候即FilterType = FDCAN_FILTER_MASK,FilterID2的位置为0x1FFFFFFF,代表的就是FilterID1全部校验。

2.当有多个ID需要过滤需要在CubeMX中更改滤波器使用数量,不然是无效的,且滤波器使用顺序应当按照编号。举个例子,假设你分配了使用两个滤波器,在实际中却使用了0和2,虽然1没有使用,但是实际效果应当是你配的那个2的是无效的,0的是有效的。

标签:滤波器,HAL,STM32G0B1,TxHeader,FDCAN,sFilterConfig,ID
来源: https://blog.csdn.net/qq_37449342/article/details/119170811