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.

[参考译文] CC2530:TIMAC CC530睡眠定时器

Guru**** 2380730 points
Other Parts Discussed in Thread: TIMAC, CC2530
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1194187/cc2530-timac-cc530-sleep-timer

器件型号:CC2530
主题中讨论的其他器件:TIMAC

大家好、

我使用协议栈作为 TIMAC、采用信标模式并同步所有器件。 我需要的情况是、在信标帧传输器件信息后、具有匹配器件信息  的终端设备将向协调器发送数据、其他终端设备将处于睡眠状态。 一开始,我使用了协议栈的 halSleep ()函数,并启用了省电功能,但我发现终端设备没有进入睡眠模式。 后来、我采用了睡眠定时器的方法、但无法触发中断功能。 我发现睡眠定时器的中断功能 已经被协议栈写入、协议栈的中断功能也清除了中断标志和睡眠模式。 因此、我可以使用协议栈的中断函数。 通过实验 、我发现这种方法只能使协调器进入指定的睡眠状态一次。 在随后的信标帧到达后无法触发睡眠。

此致、

凯瑟琳

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

    您好 Katherine、

    我假设正在评估 TIMAC 1.5.2中的 MSA_CC2530示例。  请注意、如果 MSA_MAC_BEAST_ORDER 不等于15、则默认情况下会对器件使用 MSA_PWR_Mgmt_enabled、并在协调器上启用。  MSA_PWR_Mgmt_enabled 本身必须设置为 true。  这两个定义都在 msa.h 文件中建立、之后无需进一步的电源修改。  您能否进一步说明对默认项目所做的更改、以及如何确认器件是否进入低功耗状态?

    此致、
    Ryan

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

    您好、Ryan、

    BO 设置为10、S0设置为9、信标帧间隔约为15秒。 每个终端器件都有编号。 协调器发送的信标帧包含器件编号。 当我检测到信标帧携带的器件型号 与其自己的器 件型号不同时、睡眠事件被触发、器件立即进入睡眠状态。 我使用了 CC2530的睡眠计时器。

    /*睡眠事件*/

    //I 设置系统的睡眠模式。

    //它进入睡眠模式并被中断唤醒。

    //Active/idle 模式。 系统将被中断唤醒。

     上面的设置 是关于睡眠定时器的、下面的设置是由协议栈写入的中断函数、我对此没有做任何修改。

    当器件进入 PM2模式时、只有睡眠定时器工作、串行端口无法正常工作。 我只设置睡眠事件。 在触发事件之前、串行端口可以接收和应答。 在触发睡眠事件后、串行端口无法 接收、因此我认为器件进入 PM2模式。 同时 、通过调试、我发现睡眠定时器的中断被触发。

    此致、

    凯瑟琳

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

    查询似乎已迁移到串行端口问题。  由于为该外设计时的高频振荡器被禁用、串行端口将不会在 PM2中运行。  设备需要退出睡眠模式后才能维修串行端口。

    此致、
    Ryan

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

    您好、Ryan、

              case 0xA2:
                if(Beacon_Receive[4] != MSA_DEVICE_NUMBER)
                {
                  HalUARTWrite(HAL_UART_PORT_0 , "The Enddevice Sleep" , sizeof("The Enddevice Sleep"));
                  osal_set_event(MSA_TaskId, DEVICE_SLEEP_EVENT);
                }
    可以看出、如果信标帧携带的信息与器件本身不同、器件将开始睡眠。 但根据结果、器件只能在发送第一个信标帧后进入睡眠状态、然后定期唤醒。 当协调 器再次发送 信标帧时、器件将不会进入睡眠状态。

    此致、

    凯瑟琳

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

    您好 Katherine、

    我不理解所提供代码的上下文。  请明确说明此代码的具体实施位置。  此问题是否与协调器(FFD)或器件(RFD)有关?  是否可以使用默认的 MSA_2530示例和 设置为 true 的 MSA_PWR_Mgmt_enabled 来确认协调器或设备是否能够定期进入睡眠模式?  请使用功耗测量屏幕截图进行验证。  此外、进一步调试器件以确定在器件未睡眠时正在处理的代码。

    此致、
    Ryan

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

    您好、Ryan、

    器 件(RFD)接收到信标帧(即系统事件中的 MAC_MLME_BEAKER_NOTIFY_IND)后、评估了信标帧的负载、然后睡眠。

      /* sleep event */
      if(events & DEVICE_SLEEP_EVENT)
      {
        setSleepPeriod(10);//set sleep time
        setPowerMode(2);//device sleep
      }
      /* the function of setting sleep time */
      static void setSleepPeriod(uint8 nS)
    {
        uint32 sleepTimer = 0;
        sleepTimer  = (uint32)ST0;
        sleepTimer |= (uint32)ST1 << 8;
        sleepTimer |= (uint32)ST2 << 16;
    
        sleepTimer += (uint32)nS * 32768;
    
        ST2 = (uint8)(sleepTimer >> 16);
        ST1 = (uint8)(sleepTimer >> 8);
        ST0 = (uint8)(sleepTimer);
    }
    
      /* set the sleep mode */
      static void setPowerMode(uint8 mode)
    {
         if(mode > 0 && mode < 4)
         {
            SLEEPCMD |= mode;    //Set the system's sleep mode
            PCON = 0x01;         //Entered the sleep mode and would be awaken by the interrupt
         }
         else
         {
             PCON = 0x00;        //Active/idle mode. Awook the system with the interrupt
         }
    }

    我在 协议栈中使用了与睡眠定时器相关的中断函数。

    HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR)
    {
    
      HAL_ENTER_ISR();
      HAL_SLEEP_TIMER_CLEAR_INT();
    
    #ifdef HAL_SLEEP_DEBUG_POWER_MODE
      halSleepInt = TRUE;
    #endif
    
      CLEAR_SLEEP_MODE();
      HAL_EXIT_ISR();
    
    
    }

    使用了 msa_2530示例、并且 msa_PWR_Mgmt_enabled 设置 为 true。 我目前没有任何设备可以测量功耗。

    当设备未处于睡眠状态时、它将在串行端口上打印、即在接收信标帧后打印。

    此致、

    凯瑟琳

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

    您好 Katherine、

    您能否确认 FFD (信标发送器)和 RFD (信标接收器)均使用 BO 等值?

    FFD 是否能够接收来自 RFD 的消息?

    谢谢、
    Toby

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

    您好!

    我可以确认 RFD 和 FFD 都使用​​BO 的值、因此将 RFD 串行端口接收到的数据发送到 FFD、FFD 可以成功接收并在串行端口上打印出来。

    此致、

    凯瑟琳

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

    您好!

    现在我已经找到了问题的原因。 在首次睡眠后、终端不会接收第二个信标帧、即在系统事件中不会进入 MAC_MLME_BEAKER_NOTIFY_IND。 因此  、位不会进入第二个睡眠状态、而是执行其他未触发事件。

    此致、

    凯瑟琳

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

    您好!

    现在、在 RFD 退出睡眠模式后、 如果它无法接收信标帧、我应该在哪里进行修改? 它是否在接收消息的终端的回调函数中?

    此致、

    凯瑟琳

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

    您好 Katherine、

    感谢您提供问题的更新。  您可以使用 计时器来检测错过的信标帧。  您应该添加要从事件处理器提供服务的事件 ID、以避免在硬件中断上下文中花费过多的周期。

    此致、
    Ryan