This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:从 CAN 唤醒失败

Guru**** 2391175 points
Other Parts Discussed in Thread: RM46L852

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024172/rm46l852-wake-up-fail-from-can

器件型号:RM46L852

尊敬的香榭丽舍

我的客户通过引用 TRM 在 RM46L852中实现了深度睡眠模式、他们似乎可以成功进入深度睡眠模式、但使用 DCAN 无法唤醒。

要启用 DCAN 控制寄存器中的 WUBA 位、它们添加了以下代码、但无法通过 CAN 消息唤醒。

  CANREG1->CTL =(UINT32) 0x00000000U  

         |(UINT32) 0x00000000U  

         |(UINT32)((UINT32) 0x00000005U << 10U)

         |(UINT32)((UINT32) 0x00000001U << 25U)  // WUBA 启用

         |(UINT32) 0x00020043U;

它们用于深度睡眠的代码如下所示。 您能否检查以下代码以通过 DCAN 唤醒?

uint32_t sleep_clk;

  canREG1->CTL |=(((uint32_t) 1U <<2) /*启用状态中断*/

          |(uint32_t)(((uint32_t) 0x1U << 25U));

  canREG1->ES |=((uint32_t) 0x1 <<9);

  canREG1->CTL &=~(uint32)(0x00000041U);/*清除初始位*/

  pcrREG->PSPWRDWNSET1 &=~(UINT32)(0x00000003U);/*关闭 DCAN1*/    

   

   

  vimREG->WAKEMASKSET0 =0xFFFFFFFF;

  vimREG->WAKEMASKSET1 =0xFFFFFFFF;

  vimREG->WAKEMASKSET2 = 0xFFFFFFFF;

  vimREG->WAKEMASKSET3 = 0xFFFFFFFF;

  vimREG->WAKEMASKCLR0 = 0xFFFFFFFF;

  vimREG->WAKEMASKCLR1 = 0xFFFFFFFF;

  vimREG->WAKEMASKSET0 = 1U <<16U | 1U <<29U;

 

  _enable_IRQ ();

   

  /**设置闪存 Banck 访问控制**/

  //flashWREG->FBAC =(0x0F <<8)|(0x0F);

  flashWREG->FBAC = 0x000000000000    

  |(uint32)((uint32) 15U<<8U)//BAGP

  |(uint32)((uint32) 15U);//VREADST

 

  /**-设置闪存组电源模式*/

  flashWREG->FBFALBACK = 0x000000000000

             |(UINT32)((UINT32) SYS_SLEEP << 14U)//组7 */

             |(UINT32)((UINT32) SYS_SLEEP << 2U) /*组1 */

             |(UINT32)((UINT32) SYS_SLEEP << 0U);//组0 */

 

  //闪存泵-所有泵电路被禁用

  flashWREG->FPAC1 = flashWREG->FPAC1 &~(0x1U);

  flashWREG->FPAC2 = 0x0;

 

 

  /**-为正常运行、断电模式和唤醒后设置 GCLK、HCLK 和 VCLK 时钟源*/

  systemREG1->GHVSRC =(UINT32)((UINT32) SYS_LPO_HIGH << 24U)

            |(UINT32)(((UINT32) SYS_LPO_HIGH << 16U)

            |(UINT32)((UINT32) SYS_PLL1 << 0U);

 

 

  /**-为 AVCLK1和 AVCLK2设置异步外设时钟源*/

  systemREG1->VCLKASRC =(uint32)((uint32) SYS_LPO_HIGH << 8U)

             |(UINT32)(((UINT32) SYS_LPO_HIGH << 0U);

                                                          

  SLEEP_CLK = (uint32)((uint32) 1U << 0U)

  |(uint32)((uint32) 0U << 1U)

  |(uint32)((uint32) 1U << 3U)

  |(uint32)((uint32) 1U << 4U)

  |(UINT32)((UINT32) 0U << 5U)

  |(uint32)((uint32) 1U <<6U)    

  |(uint32)((uint32) 1U <<7U);

         

         systemREG1->CSDIS = SLEEP_CLK;    

   

  while ((systemREG1->CSDIS & sleep_clk)!= sleep_clk)

  {

  /*等待*/

  }

 

  systemREG1->CDDIS = 0x1 //RTICLK 被使能用于唤醒

          |(uint32)((uint32) 1U <<0U)/* GCLKOFF */

          |(UINT32)((UINT32) 0U << 1U)/* HCLK 关闭*/

          |(uint32)((uint32) 0U << 2U)/* VCLKP 关闭*/

          |(uint32)((uint32) 1U << 3U)/* VCLK2 off */

          |(uint32)((uint32) 0U << 4U)/* AVCLK 1关闭*/

          |(uint32)((uint32) 1U << 5U)// AVCLK 2 off */

          |(uint32)((uint32) 1U << 8U)/* VCLK3关闭*/

          |(uint32)((uint32) 1U <<9U)/* VCLK4关闭*/

          |(uint32)((uint32) 1U << 10U)/* AVCLK 3关闭*/

          |(uint32)((uint32) 1U << 11U);// AVCLK 4 off */

   

  asm (" NOP");

  asm (" NOP");

  asm (" NOP");

  asm (" WFI");

  asm (" NOP");

  asm (" NOP");

  asm (" NOP");

 

谢谢、此致、

SI