本帖最后由 一路向北lm 于 2025-4-3 17:19 编辑
canfd初始化
- static void MX_FDCAN1_Init(void)
- {
- /* USER CODE BEGIN FDCAN1_Init 0 */
- /* USER CODE END FDCAN1_Init 0 */
- /* USER CODE BEGIN FDCAN1_Init 1 */
- /* USER CODE END FDCAN1_Init 1 */
- hfdcan1.Instance = FDCAN1;
- hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
- hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;
- hfdcan1.Init.AutoRetransmission = ENABLE;
- hfdcan1.Init.TransmitPause = DISABLE;
- hfdcan1.Init.ProtocolException = ENABLE;
- hfdcan1.Init.NominalPrescaler = 1;
- hfdcan1.Init.NominalSyncJumpWidth = 50;
- hfdcan1.Init.NominalTimeSeg1 = 149;
- hfdcan1.Init.NominalTimeSeg2 = 50;
- hfdcan1.Init.DataPrescaler = 4;
- hfdcan1.Init.DataSyncJumpWidth = 5;
- hfdcan1.Init.DataTimeSeg1 = 19;
- hfdcan1.Init.DataTimeSeg2 = 5;
- hfdcan1.Init.MessageRAMOffset = 0;
- hfdcan1.Init.StdFiltersNbr = 1;
- hfdcan1.Init.ExtFiltersNbr = 2;
- hfdcan1.Init.RxFifo0ElmtsNbr = 1;
- hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
- hfdcan1.Init.RxFifo1ElmtsNbr = 2;
- hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_48;
- hfdcan1.Init.RxBuffersNbr = 1;
- hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_12;
- hfdcan1.Init.TxEventsNbr = 4;
- hfdcan1.Init.TxBuffersNbr = 2;
- hfdcan1.Init.TxFifoQueueElmtsNbr = 3;
- hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
- hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
- if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN FDCAN1_Init 2 */
- /* USER CODE END FDCAN1_Init 2 */
- }
canfd 过滤器配置
- /*##-1 Configure the FDCAN filters ########################################*/
- /* Configure standard ID reception filter to Rx FIFO 0. Only accept ID = FilterID1 */
- FDCAN_FilterTypeDef sFilterConfig;
- sFilterConfig.IdType = FDCAN_STANDARD_ID;
- sFilterConfig.FilterIndex = 0U;
- sFilterConfig.FilterType = FDCAN_FILTER_DUAL;
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
- sFilterConfig.FilterID1 = 0x444;
- sFilterConfig.FilterID2 = 0x444; /* For acceptance, MessageID and FilterID1 must match exactly */
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
- {
- Error_Handler();
- }
- /* Configure extended ID reception filter to Rx FIFO 1. Only accept ID between FilterID1 and FilterID2. */
- sFilterConfig.IdType = FDCAN_EXTENDED_ID;
- sFilterConfig.FilterIndex = 0U;
- sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
- sFilterConfig.FilterID1 = 0x1111111;
- sFilterConfig.FilterID2 = 0x2222222;
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
- {
- Error_Handler();
- }
开启canfd 控制器
- /*##-2 Start FDCAN controller (continuous listening CAN bus) ##############*/
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
- {
- Error_Handler();
- }
发送CANFD数据
- /*##-3 Transmit messages ##################################################*/
- FDCAN_TxHeaderTypeDef txHeader;
- /* Add message to Tx FIFO */
- txHeader.Identifier = 0x444;
- txHeader.IdType = FDCAN_STANDARD_ID;
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
- txHeader.DataLength = FDCAN_DLC_BYTES_12;
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
- txHeader.FDFormat = FDCAN_FD_CAN;
- txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
- txHeader.MessageMarker = 0x52U;
- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData0) != HAL_OK)
- {
- Error_Handler();
- }
- /* Add second message to Tx FIFO */
- txHeader.Identifier = 0x1111112;
- txHeader.IdType = FDCAN_EXTENDED_ID;
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
- txHeader.DataLength = FDCAN_DLC_BYTES_12;
- txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
- txHeader.FDFormat = FDCAN_FD_CAN;
- txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
- txHeader.MessageMarker = 0xCCU;
- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData1) != HAL_OK)
- {
- Error_Handler();
- }
- /* Add third message to Tx FIFO */
- txHeader.Identifier = 0x1111113;
- txHeader.IdType = FDCAN_EXTENDED_ID;
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
- txHeader.DataLength = FDCAN_DLC_BYTES_12;
- txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
- txHeader.BitRateSwitch = FDCAN_BRS_OFF;
- txHeader.FDFormat = FDCAN_FD_CAN;
- txHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
- txHeader.MessageMarker = 0xDDU;
- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, txData2) != HAL_OK)
- {
- Error_Handler();
- }
- /* Get tick */
- uint32_t tickstart = HAL_GetTick();
- /* Wait transmission complete */
- while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != hfdcan1.Init.TxFifoQueueElmtsNbr)
- {
- /* Timeout handling */
- if ((HAL_GetTick() - tickstart) > TX_TIMEOUT)
- {
- Error_Handler();
- }
- }
接收canfd数据
- /* Check one message is received in Rx FIFO 0 */
- if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 1U)
- {
- Error_Handler();
- }
- /* Retrieve message from Rx FIFO 0 */
- if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
- {
- Error_Handler();
- }
- /* Compare received RX message to expected data */
- if ((rxHeader.Identifier != 0x444) ||
- (rxHeader.IdType != FDCAN_STANDARD_ID) ||
- (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
- (BufferCmp8b(txData0, rxData, COUNTOF(rxData)) != 0U))
- {
- Error_Handler();
- }
- /* Check two messages are received in Rx FIFO 1 */
- if (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) != 2U)
- {
- Error_Handler();
- }
- /* Retrieve message from Rx FIFO 1 */
- if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)
- {
- Error_Handler();
- }
- /* Compare received RX message to expected data */
- if ((rxHeader.Identifier != 0x1111112) ||
- (rxHeader.IdType != FDCAN_EXTENDED_ID) ||
- (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
- (BufferCmp8b(txData1, rxData, COUNTOF(rxData)) != 0U))
- {
- Error_Handler();
- }
- /* Retrieve next message from Rx FIFO 1 */
- if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &rxHeader, rxData) != HAL_OK)
- {
- Error_Handler();
- }
- /* Compare received RX message to expected data */
- if ((rxHeader.Identifier != 0x1111113) ||
- (rxHeader.IdType != FDCAN_EXTENDED_ID) ||
- (rxHeader.DataLength != FDCAN_DLC_BYTES_12) ||
- (BufferCmp8b(txData2, rxData, COUNTOF(rxData)) != 0U))
- {
- Error_Handler();
- }
can分析仪数据帧如下:
|