我正在尝试在两个
STM32G431KBT6 之间建立 FDCAN
通信。
Tx 部分似乎工作得很好,但我在接收层面遇到了问题。
一般信息:我使用 CAN-FD 作为标准 CAN 2.0B(扩展 ID),波特率为 500 kbit/s。这两块板完全相同,基本配置相同。
这是我由 STM32CubeMX 生成的初始化 CAN 函数:
- /* FDCAN1 init function */
- void MX_FDCAN1_Init(void)
- {
- hfdcan1.Instance = FDCAN1;
- hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
- hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
- hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
- hfdcan1.Init.AutoRetransmission = DISABLE;
- hfdcan1.Init.TransmitPause = DISABLE;
- hfdcan1.Init.ProtocolException = DISABLE;
- hfdcan1.Init.NominalPrescaler = 2;
- hfdcan1.Init.NominalSyncJumpWidth = 1;
- hfdcan1.Init.NominalTimeSeg1 = 13;
- hfdcan1.Init.NominalTimeSeg2 = 2;
- hfdcan1.Init.DataPrescaler = 1;
- hfdcan1.Init.DataSyncJumpWidth = 1;
- hfdcan1.Init.DataTimeSeg1 = 1;
- hfdcan1.Init.DataTimeSeg2 = 1;
- hfdcan1.Init.StdFiltersNbr = 0;
- hfdcan1.Init.ExtFiltersNbr = 1;
- hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_QUEUE_OPERATION;
- if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
- {
- Error_Handler();
- }
- }
这在两个 MCU 上完全相同。
这是我在 Init 函数之后调用的“自制”配置函数:
- /**
- * @brief Configures the FDCAN.
- * @param None
- * @retval None
- */
- void FDCAN_Config(void) {
- FDCAN_FilterTypeDef sFilterConfig;
- /* Configure Rx filter */
- sFilterConfig.IdType = FDCAN_EXTENDED_ID;
- sFilterConfig.FilterIndex = 0;
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
- sFilterConfig.FilterID1 = 0x10; // Filter bits
- sFilterConfig.FilterID2 = 0; // Mask bits
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
- {
- /* Filter configuration Error */
- 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)
- {
- /* Start Error */
- Error_Handler();
- }
- /* Enable interrupts */
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
- {
- /* Notification Error */
- Error_Handler();
- }
- }
我将掩码 (sFilterConfig.FilterID2) 设置为 0 以接受所有消息。
最后这是我的回调函数:
- /**
- * @brief Rx FIFO 0 callback.
- * @param hfdcan: pointer to an FDCAN_HandleTypeDef structure that contains
- * the configuration information for the specified FDCAN.
- * @param RxFifo0ITs: indicates which Rx FIFO 0 interrupts are signalled.
- * This parameter can be any combination of @arg FDCAN_Rx_Fifo0_Interrupts.
- * @retval None
- */
- 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, fdcan_RxData) != HAL_OK)
- {
- /* Reception Error */
- Error_Handler();
- }
- /* Toggle LED */
- if (RxHeader.IdType == FDCAN_EXTENDED_ID)
- {
- HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
- }
- if (HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
- {
- /* Notification Error */
- Error_Handler();
- }
- }
- }
首先,我尝试为每个接收到的帧切换一个 LED(Tx MCU 每秒发送一个帧)。
我使用逻辑分析仪检查了 Rx MCU 上的 Rx 引脚,帧顺利到达。因此,我认为问题出在 MCU 永远不会去的回调函数级别。(我测试在它的开头放置一个断点)。
在STM32上使用CAN的新手