c - 如何使用 STM32 HAL_CAN 库生成格式正确的 TX CAN 帧?

标签 c embedded stm32 can-bus hal

我已经开始使用 STM32 微 Controller 和 HAL 库开发 CAN 应用程序。所以我有一些问题要做,以便测试将在无限循环中传输两个字符的应用程序。

我正在使用带有 STM32L4F6 微 Controller 的探索套件。我已经通过 HAL_CAN 库配置了 CAN Controller 参数。在那里,我注意到使用这个库,用户只能访问从 ID 帧字段到数据字段末尾(用于传输)。我猜 CRC、ACK 和 EOF 字段是在 HAL 最底层配置的,与用户代码无关。我错了吗?

  • 如果不是,那么当我调试我的代码时,如果 ESR 寄存器包含指示“格式错误”(根据数据表)的 010 错误字段,这意味着什么?

  • 如果我错了,我在哪里可以填写这些字段,或者我如何通过 HAL_CAN 驱动程序(当然,从我的用户代码)访问它们?

这是我的配置框架参数:

CAN_HandleTypeDef HCAN_Struct; // Type defined in HAL third-party library

void Can_ConfigureFrame(void)
{
    //TX
    HCAN_Struct.pTxMsg->StdId = 0x321;
    HCAN_Struct.pTxMsg->ExtId = 0x01; // 29 bits
    HCAN_Struct.pTxMsg->IDE   = CAN_ID_STD;
    HCAN_Struct.pTxMsg->RTR   = CAN_RTR_DATA;
    HCAN_Struct.pTxMsg->DLC   = DATABTXLONG;//1-9
    HCAN_Struct.Instance->MCR &= (~(uint32_t)CAN_MCR_DBF); // Descongelar el bus CAN en modo debug bit --> dbf=0
}

这里是 init 函数,其中配置了更多参数和那些:

void App_Task_CAN_init(void)
{
    static CanTxMsgTypeDef        TxMessage;
    static CanRxMsgTypeDef        RxMessage;

    /* Configuracion timing para obtener 500kb/s */
    HCAN_Struct.Instance = CAN1;

    HCAN_Struct.pTxMsg = &TxMessage;
    HCAN_Struct.pRxMsg = &RxMessage;
    HCAN_Struct.Init.Prescaler = 1;
    HCAN_Struct.Init.Mode = CAN_MODE_NORMAL;
    HCAN_Struct.Init.SJW = CAN_SJW_1TQ;
    HCAN_Struct.Init.BS1 = CAN_BS1_6TQ; // Segment point at 87.5%
    HCAN_Struct.Init.BS2 = CAN_BS2_1TQ;
    HCAN_Struct.Init.TTCM = DISABLE;
    HCAN_Struct.Init.ABOM = DISABLE;
    HCAN_Struct.Init.AWUM = DISABLE;
    HCAN_Struct.Init.NART = DISABLE;
    HCAN_Struct.Init.RFLM = DISABLE; // FIFO locked mode disabled
    HCAN_Struct.Init.TXFP = DISABLE; // Prioridad de tx por id (más bajo más     prioridad)

    if (HAL_CAN_Init(&HCAN_Struct) != HAL_OK)
    {
        TaskCan_Error_Handler();
    }
    Can_ConfigureFrame();
}

最佳答案

CRC、ACK 和 EOF 确实不能由软件配置,因为它们在 CAN standard 中指定。并由硬件实现。

42.7.6 错误管理 STM32F43xxx Reference Manual p.1368 :

The error management as described in the CAN protocol is handled entirely by hardware using a Transmit Error Counter. (TEC value, in CAN_ESR register) and a Receive Error Counter (REC value, in the CAN_ESR register), which get incremented or decremented according to the error condition. For detailed information about TEC and REC management, refer to the CAN standard.

无法判断为什么会出现Form Error。也许您应该仔细检查您的 GPIO 配置。

关于c - 如何使用 STM32 HAL_CAN 库生成格式正确的 TX CAN 帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528963/

相关文章:

c - Nucleo STM32F7 上的 UDP 回显

c - STM32,主从设备互不响应

android - 从 Android 升级 STM32 设备固件 (DFU/DfuSe)

C printf %a 和 %La

c - c中用0初始化数组

c - 具有事件循环 API 的 RPC 框架

c++ - 在 C、C++ 中将 bool 变量与 1 和 0 进行比较是否安全?

projects - 经验丰富的程序员的嵌入式系统项目

c - 为什么 Eclipse 索引一个不存在的预处理器宏的错误值?

floating-point - 将 ARM gcc 生成的库从软浮点 bi 转换为硬浮点 abi