[STM32H7] 【STM32H745I-DISCO试用】FDCAN实验

[复制链接]
 楼主| 南来之风 发表于 2025-3-10 11:57 | 显示全部楼层 |阅读模式
<
H745I有两路FDCAN,分别位于开发板:
8737967ce61f16fcc3.png

本次实验用到的是FDCAN1
9019967ce61c4392d5.png

FDCAN1相关的头文件:
  1. #define FDCANx                      FDCAN1
  2. #define FDCANx_CLK_ENABLE()         __HAL_RCC_FDCAN_CLK_ENABLE()
  3. #define FDCANx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE()
  4. #define FDCANx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE()

  5. #define FDCANx_FORCE_RESET()   __HAL_RCC_FDCAN_FORCE_RESET()
  6. #define FDCANx_RELEASE_RESET() __HAL_RCC_FDCAN_RELEASE_RESET()

  7. /* Definition for FDCANx Pins */
  8. #define FDCANx_TX_PIN       GPIO_PIN_13
  9. #define FDCANx_TX_GPIO_PORT GPIOH
  10. #define FDCANx_TX_AF        GPIO_AF9_FDCAN1
  11. #define FDCANx_RX_PIN       GPIO_PIN_14
  12. #define FDCANx_RX_GPIO_PORT GPIOH
  13. #define FDCANx_RX_AF        GPIO_AF9_FDCAN1

  14. /* Definition for FDCANx's NVIC IRQ and IRQ Handlers */
  15. #define FDCANx_IRQn       FDCAN1_IT0_IRQn
  16. #define FDCANx_IRQHandler FDCAN1_IT0_IRQHandler



FDCAN模块初始化: FDCAN_Config();
  1. static void FDCAN_Config(void)
  2. {
  3.   FDCAN_FilterTypeDef sFilterConfig;

  4.   /* Bit time configuration:
  5.     fdcan_ker_ck               = 40 MHz
  6.     Time_quantum (tq)          = 25 ns
  7.     Synchronization_segment    = 1 tq
  8.     Propagation_segment        = 23 tq
  9.     Phase_segment_1            = 8 tq
  10.     Phase_segment_2            = 8 tq
  11.     Synchronization_Jump_width = 8 tq
  12.     Bit_length                 = 40 tq = 1 �s
  13.     Bit_rate                   = 1 MBit/s
  14.   */
  15.   hfdcan.Instance = FDCANx;
  16.   hfdcan.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  17.   hfdcan.Init.Mode = FDCAN_MODE_NORMAL;
  18.   hfdcan.Init.AutoRetransmission = ENABLE;
  19.   hfdcan.Init.TransmitPause = DISABLE;
  20.   hfdcan.Init.ProtocolException = ENABLE;
  21.   hfdcan.Init.NominalPrescaler = 0x1; /* tq = NominalPrescaler x (1/fdcan_ker_ck) */
  22.   hfdcan.Init.NominalSyncJumpWidth = 0x8;
  23.   hfdcan.Init.NominalTimeSeg1 = 0x1F; /* NominalTimeSeg1 = Propagation_segment + Phase_segment_1 */
  24.   hfdcan.Init.NominalTimeSeg2 = 0x8;
  25.   hfdcan.Init.MessageRAMOffset = 0;
  26.   hfdcan.Init.StdFiltersNbr = 1;
  27.   hfdcan.Init.ExtFiltersNbr = 0;
  28.   hfdcan.Init.RxFifo0ElmtsNbr = 1;
  29.   hfdcan.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  30.   hfdcan.Init.RxFifo1ElmtsNbr = 0;
  31.   hfdcan.Init.RxBuffersNbr = 0;
  32.   hfdcan.Init.TxEventsNbr = 0;
  33.   hfdcan.Init.TxBuffersNbr = 0;
  34.   hfdcan.Init.TxFifoQueueElmtsNbr = 1;
  35.   hfdcan.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  36.   hfdcan.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  37.   if (HAL_FDCAN_Init(&hfdcan) != HAL_OK)
  38.   {
  39.     /* Initialization Error */
  40.     Error_Handler();
  41.   }

  42.   /* Configure Rx filter */
  43.   sFilterConfig.IdType = FDCAN_STANDARD_ID;
  44.   sFilterConfig.FilterIndex = 0;
  45.   sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  46.   sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  47.   sFilterConfig.FilterID1 = 0x321;
  48.   sFilterConfig.FilterID2 = 0x7FF;
  49.   if (HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig) != HAL_OK)
  50.   {
  51.     /* Filter configuration Error */
  52.     Error_Handler();
  53.   }

  54.   /* Start the FDCAN module */
  55.   if (HAL_FDCAN_Start(&hfdcan) != HAL_OK)
  56.   {
  57.     /* Start Error */
  58.     Error_Handler();
  59.   }

  60.   if (HAL_FDCAN_ActivateNotification(&hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  61.   {
  62.     /* Notification Error */
  63.     Error_Handler();
  64.   }

  65.   /* Prepare Tx Header */
  66.   TxHeader.Identifier = 0x321;
  67.   TxHeader.IdType = FDCAN_STANDARD_ID;
  68.   TxHeader.TxFrameType = FDCAN_DATA_FRAME;
  69.   TxHeader.DataLength = FDCAN_DLC_BYTES_2;
  70.   TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  71.   TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
  72.   TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
  73.   TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
  74.   TxHeader.MessageMarker = 0;
  75. }
在主循环中,每次按下用户按键,就发送一帧CAN报文:
  1.   while (1)
  2.   {
  3.     while (BSP_PB_GetState(BUTTON_USER) == KEY_PRESSED)
  4.     {
  5.       if (ubKeyNumber == 0x4)
  6.       {
  7.         ubKeyNumber = 0x00;
  8.       }
  9.       else
  10.       {
  11.         LED_Display(++ubKeyNumber);

  12.         /* Set the data to be transmitted */
  13.         TxData[0] = ubKeyNumber;
  14.         TxData[1] = 0xAD;

  15.         /* Start the Transmission process */
  16.         if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan, &TxHeader, TxData) != HAL_OK)
  17.         {
  18.           /* Transmission request Error */
  19.           Error_Handler();
  20.         }
  21.         HAL_Delay(10);

  22.         while (BSP_PB_GetState(BUTTON_USER) != KEY_NOT_PRESSED)
  23.         {
  24.         }
  25.       }
  26.     }
  27.   }


连接USB-CAN助手与开发板:
8698467ce62c3e798d.png

每次按下按键,上位机成功接收到CAN报文
4874767ce62df5e9ea.png

wangdezhi 发表于 2025-3-12 16:22 | 显示全部楼层
STM32H745I-DISCO开发板配备了FDCAN模块,这是一种用于通信和控制应用的高速、高效的网络技术。FDCAN特别适用于需要高可靠性和实时性能的场合。
timfordlare 发表于 2025-3-12 16:27 | 显示全部楼层
硬件支持FDCAN功能              
backlugin 发表于 2025-3-12 19:05 | 显示全部楼层
具备更强大的消息过滤机制,可根据 CAN ID、数据长度等多种条件对消息进行过滤
chenci2013 发表于 2025-3-12 19:46 | 显示全部楼层
FDCAN 支持灵活的数据速率,数据段传输速率最高可达 8Mbps,远高于传统 CAN 总线的 1Mbps,能满足对数据传输速度要求较高的应用场景。
houjiakai 发表于 2025-3-12 20:16 | 显示全部楼层
硬件信号完整性优先              
cemaj 发表于 2025-3-12 21:57 | 显示全部楼层
可以使用波特率计算器辅助计算,确保采样点和波特率符合要求
earlmax 发表于 2025-3-14 10:43 | 显示全部楼层
可以设置过滤器的匹配规则、屏蔽码等参数,从而实现对特定节点或消息的过滤。
10299823 发表于 2025-3-14 12:54 | 显示全部楼层
在高波特率下,必须启用TDC并正确设置参数,以避免通信异常
qiufengsd 发表于 2025-3-14 13:20 | 显示全部楼层
结合中断和DMA提升实时性,防止邮箱溢出。
wilhelmina2 发表于 2025-3-14 16:14 | 显示全部楼层
FDCAN 向下兼容传统 CAN 协议,可与传统 CAN 节点进行通信,便于在现有 CAN 网络中进行升级和扩展。
sanfuzi 发表于 2025-3-14 16:45 | 显示全部楼层
TM32CubeMX 用于图形化配置芯片的外设和引脚,生成初始化代码
ccook11 发表于 2025-3-14 17:09 | 显示全部楼层
将CAN总线的相应信号线连接到这些引脚上,注意连接的极性和稳定性,防止松动或接触不良。
lihuami 发表于 2025-3-14 23:49 | 显示全部楼层
在STM32H745I-DISCO开发板上,FDCAN接口被广泛应用于汽车、工业自动化和嵌入式系统等领域,以实现设备之间的可靠通信。
wwppd 发表于 2025-3-15 03:52 | 显示全部楼层
FDCAN是一种灵活的数据速率控制器局域网技术,它支持高速和低速的数据通信,并提供了强大的错误处理和故障检测机制。
nomomy 发表于 2025-3-15 10:55 | 显示全部楼层
在代码中对FDCAN进行初始化配置,包括设置比特率、帧格式、工作模式等参数。
olivem55arlowe 发表于 2025-3-15 12:06 | 显示全部楼层
STM32H745I-DISCO开发板上的FDCAN接口为用户提供了高性能和灵活的数据通信解决方案。
jtracy3 发表于 2025-3-15 17:07 | 显示全部楼层
​STM32H745I-DISCO 的 FDCAN 支持高带宽通信(最高 ​8Mbps),适用于汽车电子、工业自动化等场景。
jonas222 发表于 2025-3-15 17:40 | 显示全部楼层
通常STM32H745I-DISCO板载有多种电源接口,如USB接口、以太网接口等都可提供电源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部