无法在环回模式下退出STM32F429IGT上bxCAN的睡眠模式
简而言之,当睡眠位手动复位时,SLAK位不会复位。详情如下: 我正在尝试在创建网络之前,在环回模式下实现成功的传输。在阅读了大量文档之后,我曾经让它在某一点上工作过,但现在我有了一个新问题。(可悲的是,我不记得我改变了什么,也许是在玩计时游戏) 在将外围设备设置为环回并提供相干位定时值后(因此我可能已经使用了它们,但它们恢复正常),我使用Cube生成代码。这意味着流应该首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后启动正常模式。根据参考手册: 如果软件在bxCAN运行时通过设置INRQ位请求进入初始化模式 睡眠模式,它还必须清除睡眠位。[…]清除睡眠位后,一旦bxCAN同步,睡眠模式即退出 使用CAN总线[…]。睡眠模式已退出 一旦硬件清除了SLAK位 及 要同步,bxCAN会等待CAN总线空闲,这意味着11 CANRX上已监测到连续隐性位 根据维基 0数据位编码显性状态,1数据位编码隐性状态 所以 检查多维数据集生成的代码这正是正在发生的事情。我在这里粘贴了stm32f4xx_hal_can.c的基本部分:无法在环回模式下退出STM32F429IGT上bxCAN的睡眠模式,stm32,can-bus,hal,stm32cubeide,Stm32,Can Bus,Hal,Stm32cubeide,简而言之,当睡眠位手动复位时,SLAK位不会复位。详情如下: 我正在尝试在创建网络之前,在环回模式下实现成功的传输。在阅读了大量文档之后,我曾经让它在某一点上工作过,但现在我有了一个新问题。(可悲的是,我不记得我改变了什么,也许是在玩计时游戏) 在将外围设备设置为环回并提供相干位定时值后(因此我可能已经使用了它们,但它们恢复正常),我使用Cube生成代码。这意味着流应该首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后启动正常模式。根据参考手册: 如果软件在bxCAN运行时通过设置
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
{
[...]
/* Exit from sleep mode */
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
/* Get tick */
tickstart = HAL_GetTick();
/* Check Sleep mode leave acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
[...]
/*Error*/
}
}
/* 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)
{
[...]
/*Error*/
}
CAN_MSR的休眠位被重置,并等待硬件重置CAN_MSR的SLAK位。CAN_TIMEOUT_值设置为10,基本上为11个隐性位提供了适应时间
这就是我被困的地方。松弛不会重置。。。我试图删除if((HAL\u GetTick()-tickstart)>CAN\u TIMEOUT\u VALUE)
,以便MCU无限期地等待SLAK重置。没有帮助
查看CAN_MSR RX寄存器,给出RX上的当前值,同时等待SLACK更改,我注意到它始终为0。因此,我尝试将GPIOs设置为RX和TX的上拉和下拉,但我认为这没有效果,因为在环回模式下,bxCAN的RX与GPIOs隔离:)这也意味着,问题不应该出现在硬件方面(比如布线和其他东西,外部的东西,而不是内部硬件)。这让我相信在全局HAL_Init()或MX_GPIO_Init()或其他东西的过程中出现了问题,但由于它是由多维数据集生成的,我没有更改任何内容,因此我不认为它会对SLAK不消失产生影响
我的想法可能是做一个软件重置,在一些事情上,但我不知道这条路会把我带到哪里,因为关闭电源和在芯片上都不能解决问题