如何使用 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 帧?的主要内容,如果未能解决你的问题,请参考以下文章