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

Posted

技术标签:

【中文标题】如何使用 STM32 HAL_CAN 库生成格式正确的 TX CAN 帧?【英文标题】:How can I generate a TX CAN frame with a correct form using STM32 HAL_CAN libraries? 【发布时间】:2017-07-20 14:48:39 【问题描述】:

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

我正在使用带有 STM32L4F6 微控制器的探索套件。我已经通过 HAL_CAN 库配置了 CAN 控制器参数。在那里,我注意到使用这个库,用户只能从 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 和 EOF 字段不是软件可配置的。它们由 CAN 控制器硬件完成。 @KooroshHajiani 我是这么认为的,但是由于我在 ESR 寄存器中有“表单错误”代码,我想确保我没有遗漏任何东西。非常感谢。 【参考方案1】:

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

在 STM32F43xxx Reference Manual p.1368中的42.7.6错误管理下:

CAN 中描述的错误管理 协议完全由硬件处理 使用发送错误计数器。 (TEC 值,在 CAN_ESR 寄存器中)和接收错误计数器(REC 值,在 CAN_ESR 寄存器中),根据错误情况递增或递减。有关 TEC 和 REC 管理的详细信息,请参阅 CAN 标准。

我无法判断为什么会出现表单错误。也许你应该仔细检查你的 GPIO 配置。

【讨论】:

或者更准确地说,CRC 完全依赖于消息的其余部分,因此无法更改。另外两个是协议的“固定”/“恒定”部分,因此也不能更改。

以上是关于如何使用 STM32 HAL_CAN 库生成格式正确的 TX CAN 帧?的主要内容,如果未能解决你的问题,请参考以下文章

请问stm32中foc库怎么切换正反转方向

JSON数据格式C语言解析库(cJSON)的使用&在STM32上移植和使用

如何使用 STM32 MCU 生成 REAL 随机数?

stm32开发生成库的方法

STM32 HAL库和LL库的区别

使用STM32CubeMX生成RTC工程[闹钟中断2]