[STM32N6] STM32N6的CAN-FD功能和测试

[复制链接]
 楼主| 一路向北lm 发表于 2025-4-3 17:15 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2025-4-3 17:19 编辑

canfd初始化
  1. static void MX_FDCAN1_Init(void)
  2. {

  3.   /* USER CODE BEGIN FDCAN1_Init 0 */

  4.   /* USER CODE END FDCAN1_Init 0 */

  5.   /* USER CODE BEGIN FDCAN1_Init 1 */

  6.   /* USER CODE END FDCAN1_Init 1 */
  7.   hfdcan1.Instance = FDCAN1;
  8.   hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
  9.   hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;
  10.   hfdcan1.Init.AutoRetransmission = ENABLE;
  11.   hfdcan1.Init.TransmitPause = DISABLE;
  12.   hfdcan1.Init.ProtocolException = ENABLE;
  13.   hfdcan1.Init.NominalPrescaler = 1;
  14.   hfdcan1.Init.NominalSyncJumpWidth = 50;
  15.   hfdcan1.Init.NominalTimeSeg1 = 149;
  16.   hfdcan1.Init.NominalTimeSeg2 = 50;
  17.   hfdcan1.Init.DataPrescaler = 4;
  18.   hfdcan1.Init.DataSyncJumpWidth = 5;
  19.   hfdcan1.Init.DataTimeSeg1 = 19;
  20.   hfdcan1.Init.DataTimeSeg2 = 5;
  21.   hfdcan1.Init.MessageRAMOffset = 0;
  22.   hfdcan1.Init.StdFiltersNbr = 1;
  23.   hfdcan1.Init.ExtFiltersNbr = 2;
  24.   hfdcan1.Init.RxFifo0ElmtsNbr = 1;
  25.   hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
  26.   hfdcan1.Init.RxFifo1ElmtsNbr = 2;
  27.   hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_48;
  28.   hfdcan1.Init.RxBuffersNbr = 1;
  29.   hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_12;
  30.   hfdcan1.Init.TxEventsNbr = 4;
  31.   hfdcan1.Init.TxBuffersNbr = 2;
  32.   hfdcan1.Init.TxFifoQueueElmtsNbr = 3;
  33.   hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  34.   hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
  35.   if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   /* USER CODE BEGIN FDCAN1_Init 2 */

  40.   /* USER CODE END FDCAN1_Init 2 */

  41. }
canfd 过滤器配置
  1. /*##-1 Configure the FDCAN filters ########################################*/

  2.   /* Configure standard ID reception filter to Rx FIFO 0. Only accept ID = FilterID1 */
  3.   FDCAN_FilterTypeDef        sFilterConfig;
  4.   sFilterConfig.IdType       = FDCAN_STANDARD_ID;
  5.   sFilterConfig.FilterIndex  = 0U;
  6.   sFilterConfig.FilterType   = FDCAN_FILTER_DUAL;
  7.   sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  8.   sFilterConfig.FilterID1    = 0x444;
  9.   sFilterConfig.FilterID2    = 0x444; /* For acceptance, MessageID and FilterID1 must match exactly */
  10.   if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  11.   {
  12.     Error_Handler();
  13.   }

  14.   /* Configure extended ID reception filter to Rx FIFO 1. Only accept ID between FilterID1 and FilterID2. */
  15.   sFilterConfig.IdType       = FDCAN_EXTENDED_ID;
  16.   sFilterConfig.FilterIndex  = 0U;
  17.   sFilterConfig.FilterType   = FDCAN_FILTER_RANGE_NO_EIDM;
  18.   sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
  19.   sFilterConfig.FilterID1    = 0x1111111;
  20.   sFilterConfig.FilterID2    = 0x2222222;
  21.   if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
开启canfd 控制器
  1. /*##-2 Start FDCAN controller (continuous listening CAN bus) ##############*/

  2.   if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  3.   {
  4.     Error_Handler();
  5.   }
发送CANFD数据
  1. /*##-3 Transmit messages ##################################################*/

  2.   FDCAN_TxHeaderTypeDef        txHeader;

  3.   /* Add message to Tx FIFO */
  4.   txHeader.Identifier          = 0x444;
  5.   txHeader.IdType              = FDCAN_STANDARD_ID;
  6.   txHeader.TxFrameType         = FDCAN_DATA_FRAME;
  7.   txHeader.DataLength          = FDCAN_DLC_BYTES_12;
  8.   txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  9.   txHeader.BitRateSwitch       = FDCAN_BRS_ON;
  10.   txHeader.FDFormat            = FDCAN_FD_CAN;
  11.   txHeader.TxEventFifoControl  = FDCAN_STORE_TX_EVENTS;
  12.   txHeader.MessageMarker       = 0x52U;
  13.   if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData0) != HAL_OK)
  14.   {
  15.     Error_Handler();
  16.   }

  17.   /* Add second message to Tx FIFO */
  18.   txHeader.Identifier          = 0x1111112;
  19.   txHeader.IdType              = FDCAN_EXTENDED_ID;
  20.   txHeader.TxFrameType         = FDCAN_DATA_FRAME;
  21.   txHeader.DataLength          = FDCAN_DLC_BYTES_12;
  22.   txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
  23.   txHeader.BitRateSwitch       = FDCAN_BRS_ON;
  24.   txHeader.FDFormat            = FDCAN_FD_CAN;
  25.   txHeader.TxEventFifoControl  = FDCAN_STORE_TX_EVENTS;
  26.   txHeader.MessageMarker       = 0xCCU;
  27.   if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData1) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }

  31.   /* Add third message to Tx FIFO */
  32.   txHeader.Identifier          = 0x1111113;
  33.   txHeader.IdType              = FDCAN_EXTENDED_ID;
  34.   txHeader.TxFrameType         = FDCAN_DATA_FRAME;
  35.   txHeader.DataLength          = FDCAN_DLC_BYTES_12;
  36.   txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
  37.   txHeader.BitRateSwitch       = FDCAN_BRS_OFF;
  38.   txHeader.FDFormat            = FDCAN_FD_CAN;
  39.   txHeader.TxEventFifoControl  = FDCAN_STORE_TX_EVENTS;
  40.   txHeader.MessageMarker       = 0xDDU;
  41.   if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData2) != HAL_OK)
  42.   {
  43.     Error_Handler();
  44.   }

  45.   /* Get tick */
  46.   uint32_t tickstart = HAL_GetTick();

  47.   /* Wait transmission complete */
  48. while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != hfdcan1.Init.TxFifoQueueElmtsNbr)
  49.   {
  50.     /* Timeout handling */
  51.     if ((HAL_GetTick() - tickstart) > TX_TIMEOUT)
  52.     {
  53.       Error_Handler();
  54.     }
  55.   }
接收canfd数据
  1. /* Check one message is received in Rx FIFO 0 */
  2.   if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 1U)
  3.   {
  4.     Error_Handler();
  5.   }

  6.   /* Retrieve message from Rx FIFO 0 */
  7.   if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
  8.   {
  9.     Error_Handler();
  10.   }

  11.   /* Compare received RX message to expected data */
  12.   if ((rxHeader.Identifier != 0x444) ||
  13.       (rxHeader.IdType     != FDCAN_STANDARD_ID) ||
  14.       (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
  15.       (BufferCmp8b(txData0, rxData, COUNTOF(rxData)) != 0U))
  16.   {
  17.     Error_Handler();
  18.   }

  19.   /* Check two messages are received in Rx FIFO 1 */
  20.   if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) != 2U)
  21.   {
  22.     Error_Handler();
  23.   }

  24.   /* Retrieve message from Rx FIFO 1 */
  25.   if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)
  26.   {
  27.     Error_Handler();
  28.   }

  29.   /* Compare received RX message to expected data */
  30.   if ((rxHeader.Identifier != 0x1111112) ||
  31.       (rxHeader.IdType     != FDCAN_EXTENDED_ID) ||
  32.       (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
  33.       (BufferCmp8b(txData1, rxData, COUNTOF(rxData)) != 0U))
  34.   {
  35.     Error_Handler();
  36.   }

  37.   /* Retrieve next message from Rx FIFO 1 */
  38.   if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)
  39.   {
  40.     Error_Handler();
  41.   }

  42.   /* Compare received RX message to expected data */
  43.   if ((rxHeader.Identifier != 0x1111113) ||
  44.       (rxHeader.IdType     != FDCAN_EXTENDED_ID) ||
  45.       (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
  46.       (BufferCmp8b(txData2, rxData, COUNTOF(rxData)) != 0U))
  47.   {
  48.     Error_Handler();
  49.   }
can分析仪数据帧如下:
2465967ee52b9e4245.png
suncat0504 发表于 2025-5-13 14:05 | 显示全部楼层
初始化部分涉及的属性可真多,有中文说明就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

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