我尝试通过 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 */
- }