CH32F103C8号称是兼容STM32F103C8的,但在调试CAN总线时,遇到了一些问题。
基础代码通过STM32CubeMX生成,但是在执行 void MX_CAN_Init(void) 时始终不能通过。
查看沁恒官方的CAN总线测试程序,发现如下操作:
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
{
uint8_t InitStatus = CAN_InitStatus_Failed;
uint32_t wait_ack = 0x00000000;
CANx->CTLR &= (~(uint32_t)CAN_CTLR_SLEEP);
CANx->CTLR |= CAN_CTLR_INRQ ;
while (((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT))
{
wait_ack++;
}
...
即在写入INRQ之前,先清除了CAN总线的Sleep状态。
而HAL库中的相应代码是这样的:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
{
...
/* Request initialisation */
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
/* Get tick */
tickstart = HAL_GetTick();
/* Wait initialisation acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
/* Change CAN state */
hcan->State = HAL_CAN_STATE_ERROR;
return HAL_ERROR;
}
}
/* Exit from sleep mode */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
...
它是先请求初始化再退出睡眠模式。
查看STM32F103C8的手册:
这里大概是HAL库的bug。
在cube生成的代码
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
末尾合适位置,加上:
CLEAR_BIT(canHandle->Instance->MCR, CAN_MCR_SLEEP);
解决问题
版权声明:本文为CSDN博主「念隐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinley/article/details/122705800
CH32F103C8号称是兼容STM32F103C8的,但在调试CAN总线时,遇到了一些问题。
基础代码通过STM32CubeMX生成,但是在执行 void MX_CAN_Init(void) 时始终不能通过。
查看沁恒官方的CAN总线测试程序,发现如下操作:
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
{
uint8_t InitStatus = CAN_InitStatus_Failed;
uint32_t wait_ack = 0x00000000;
CANx->CTLR &= (~(uint32_t)CAN_CTLR_SLEEP);
CANx->CTLR |= CAN_CTLR_INRQ ;
while (((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT))
{
wait_ack++;
}
...
即在写入INRQ之前,先清除了CAN总线的Sleep状态。
而HAL库中的相应代码是这样的:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
{
...
/* Request initialisation */
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
/* Get tick */
tickstart = HAL_GetTick();
/* Wait initialisation acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
/* Change CAN state */
hcan->State = HAL_CAN_STATE_ERROR;
return HAL_ERROR;
}
}
/* Exit from sleep mode */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
...
它是先请求初始化再退出睡眠模式。
查看STM32F103C8的手册:
这里大概是HAL库的bug。
在cube生成的代码
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
末尾合适位置,加上:
CLEAR_BIT(canHandle->Instance->MCR, CAN_MCR_SLEEP);
解决问题
版权声明:本文为CSDN博主「念隐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chinley/article/details/122705800
暂无评论