【发布时间】: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 寄存器中有“表单错误”代码,我想确保我没有遗漏任何东西。非常感谢。
标签: c embedded stm32 can-bus hal