gpt4 book ai didi

c - STM32F 使用 HAL_CAN 库

转载 作者:行者123 更新时间:2023-12-03 20:56:15 25 4
gpt4 key购买 nike

我正在尝试使用两个 STM32F 板之间的 HAL_CAN 库通过 CAN 进行通信。具体来说,问题似乎在于接收消息。按照文档:

 ==============================================================================
##### How to use this driver #####
[..]
(#) Initialize the CAN low level resources by implementing the
HAL_CAN_MspInit():
(++) Enable the CAN interface clock using __HAL_RCC_CANx_CLK_ENABLE()
(++) Configure CAN pins
(+++) Enable the clock for the CAN GPIOs
(+++) Configure CAN pins as alternate function open-drain
(++) In case of using interrupts (e.g. HAL_CAN_ActivateNotification())
(+++) Configure the CAN interrupt priority using
HAL_NVIC_SetPriority()
(+++) Enable the CAN IRQ handler using HAL_NVIC_EnableIRQ()
(+++) In CAN IRQ handler, call HAL_CAN_IRQHandler()

(#) Initialize the CAN peripheral using HAL_CAN_Init() function. This
function resorts to HAL_CAN_MspInit() for low-level initialization.

(#) Configure the reception filters using the following configuration
functions:
(++) HAL_CAN_ConfigFilter()

(#) Start the CAN module using HAL_CAN_Start() function. At this level
the node is active on the bus: it receive messages, and can send
messages.

(#) To manage messages transmission, the following Tx control functions
can be used:
(++) HAL_CAN_AddTxMessage() to request transmission of a new
message.
(++) HAL_CAN_AbortTxRequest() to abort transmission of a pending
message.
(++) HAL_CAN_GetTxMailboxesFreeLevel() to get the number of free Tx
mailboxes.
(++) HAL_CAN_IsTxMessagePending() to check if a message is pending
in a Tx mailbox.
(++) HAL_CAN_GetTxTimestamp() to get the timestamp of Tx message
sent, if time triggered communication mode is enabled.

(#) When a message is received into the CAN Rx FIFOs, it can be retrieved
using the HAL_CAN_GetRxMessage() function. The function
HAL_CAN_GetRxFifoFillLevel() allows to know how many Rx message are
stored in the Rx Fifo.

(#) Calling the HAL_CAN_Stop() function stops the CAN module.

(#) The deinitialization is achieved with HAL_CAN_DeInit() function.


*** Polling mode operation ***
==============================
[..]
(#) Reception:
(++) Monitor reception of message using HAL_CAN_GetRxFifoFillLevel()
until at least one message is received.
(++) Then get the message using HAL_CAN_GetRxMessage().

(#) Transmission:
(++) Monitor the Tx mailboxes availability until at least one Tx
mailbox is free, using HAL_CAN_GetTxMailboxesFreeLevel().
(++) Then request transmission of a message using
HAL_CAN_AddTxMessage().


*** Interrupt mode operation ***
================================
[..]
(#) Notifications are activated using HAL_CAN_ActivateNotification()
function. Then, the process can be controlled through the
available user callbacks: HAL_CAN_xxxCallback(), using same APIs
HAL_CAN_GetRxMessage() and HAL_CAN_AddTxMessage().

(#) Notifications can be deactivated using
HAL_CAN_DeactivateNotification() function.

(#) Special care should be taken for CAN_IT_RX_FIFO0_MSG_PENDING and
CAN_IT_RX_FIFO1_MSG_PENDING notifications. These notifications trig
the callbacks HAL_CAN_RxFIFO0MsgPendingCallback() and
HAL_CAN_RxFIFO1MsgPendingCallback(). User has two possible options
here.
(++) Directly get the Rx message in the callback, using
HAL_CAN_GetRxMessage().
(++) Or deactivate the notification in the callback without
getting the Rx message. The Rx message can then be got later
using HAL_CAN_GetRxMessage(). Once the Rx message have been
read, the notification can be activated again.
  • 我打电话 HAL_CAN_Init ,依次调用 HAL_CAN_MspInit设置时钟,启用 GPIO 并将 CAN 引脚配置为备用功能开漏。当我使用中断时,它还将接收中断设置为:
  •     HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
  • 使用 HAL_CAN_ConfigFilter() 设置接收过滤器如下,并且没有返回错误:
  •   sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    sFilterConfig.FilterIdHigh = 0;
    sFilterConfig.FilterIdLow = 0;
    sFilterConfig.FilterMaskIdHigh = 0;
    sFilterConfig.FilterMaskIdLow = 0;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.SlaveStartFilterBank = 14;
    HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)
  • 调用 HAL_CAN_Start 并且没有返回错误:
  • HAL_CAN_Start(&hcan1)
  • 使用按下蓝色按钮触发的中断发送消息:
  • void EXTI0_IRQHandler(void)
    {
    /* USER CODE BEGIN EXTI0_IRQn 0 */
    for(int n=0;n<1000000;n++);
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
    a++;
    if(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)){
    if(HAL_CAN_AddTxMessage(&hcan1, &pHeader, &a, &TxMailbox)==HAL_OK){
    if(HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6) == GPIO_PIN_SET){
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET);
    } else{
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_SET);
    }
    }
    }
    }
  • 我已验证该消息处于待处理状态,因为以下返回正值:
  • HAL_CAN_IsTxMessagePending(&hcan1, TxMailbox)
  • 但是,当可以接收消息时应触发的以下中断永远不会触发:
  • void CAN1_RX0_IRQHandler(void)
    {
    HAL_CAN_IRQHandler(&hcan1);
    /* USER CODE BEGIN CAN1_RX0_IRQn 1 */
    HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &pRxHeader, &r);
    HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_RESET);

    /* USER CODE END CAN1_RX0_IRQn 1 */
    }

    其他注意事项:
  • 已验证正在使用的收发器均接收 3.3V

  • 任何帮助将不胜感激,
    罗斯

    最佳答案

    您忘记启用“内部”CAN 中断:

        HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);

    关于c - STM32F 使用 HAL_CAN 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60916715/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com