ST意法半导体
直播中

张明

7年用户 997经验值
私信 关注
[问答]

如何解决在STM32G431RB NUCLEO板上无法通过FDCAN1进行通信的问题呢?


我尝试通过 CAN 将数据从 nucleo 板发送到 USB-to-CAN 设备 (peakCAN)。
我将 PA12 和 PA11 配置为 FDCAN1_TX 和 FDCAN1_RX。我用 salea 逻辑设备测量了 CN10 连接器上的 pin 12 和 pin 14,但没有得到有效帧。引脚 12 保持高电平 (3.3V),引脚 14 保持低电平 (0V)。
我还尝试将 CAN 外围设备的 PLL 频率更改为 40MHz,如其他一些帖子中所述(参见下面的代码片段)——但它与我使用 36MHz 的实现具有相同的效果……
谁能帮我解决这个问题?非常感谢...
  • 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.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 = 4;
  •   hfdcan1.Init.NominalSyncJumpWidth = 8;
  •   hfdcan1.Init.NominalTimeSeg1 = 31;
  •   hfdcan1.Init.NominalTimeSeg2 = 8;
  •   hfdcan1.Init.DataPrescaler = 1;
  •   hfdcan1.Init.DataSyncJumpWidth = 1;
  •   hfdcan1.Init.DataTimeSeg1 = 1;
  •   hfdcan1.Init.DataTimeSeg2 = 1;
  •   hfdcan1.Init.StdFiltersNbr = 0;
  •   hfdcan1.Init.ExtFiltersNbr = 0;
  •   hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  •   if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN FDCAN1_Init 2 */
  •   /* USER CODE END FDCAN1_Init 2 */
  • }
  • void FDCAN_config(void)
  • {
  •         FDCAN_FilterTypeDef sFilterConfig;
  •         sFilterConfig.IdType = FDCAN_STANDARD_ID;
  •         sFilterConfig.FilterIndex = 0;
  •         sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  •         sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  •         sFilterConfig.FilterID1 = 0x000;
  •         sFilterConfig.FilterID2 = 0x7FF;
  •         if(HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  •         {
  •                 Error_Handler();
  •         }
  •         if(HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  •         {
  •                 Error_Handler();
  •         }
  •         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();
  •         }
  •         TxHeader.Identifier = 0x123;
  •         TxHeader.IdType = FDCAN_STANDARD_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;
  • }
  • int main(void)
  • {
  •   /* USER CODE BEGIN 1 */
  •   /* USER CODE END 1 */
  •   /* MCU Configuration--------------------------------------------------------*/
  •   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  •   HAL_Init();
  •   /* USER CODE BEGIN Init */
  •   /* USER CODE END Init */
  •   /* Configure the system clock */
  •   SystemClock_Config();
  •   /* USER CODE BEGIN SysInit */
  •   /* USER CODE END SysInit */
  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_LPUART1_UART_Init();
  •   MX_FDCAN1_Init();
  •   /* USER CODE BEGIN 2 */
  •    FDCAN_config();
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •           myCanState = HAL_FDCAN_GetState(&hfdcan1);
  •           HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  •           HAL_Delay(500);
  •           myState = HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, &myTxData[0]);
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •   }
  •   /* USER CODE END 3 */
  • }

回帖(1)

张婷婷

2023-1-5 09:39:18
请查看我的 Nucleo-64 STM32G474RE 代码。
CAN 的波特率我设置为 1000 kbit/s。
FDCAN 的时钟设置为 80 MHz。
请检查实例“hfdcan1”的设置和系统时钟配置。
我用 UCANDevices 检查这个例子。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分