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:Samplelight设备的电流有峰值

Guru**** 2538950 points
Other Parts Discussed in Thread: CC2530, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/571505/cc2530-samplelight-device-has-spikes-in-current

部件号:CC2530
主题中讨论的其他部件: Z-stack

您好,

我有一个CC2530,其中上载了SampleLight程序,当它连接到集线器时,当前出现了不应该出现的峰值。 当CC2530每1秒从PM2唤醒一次时,就会出现较大的峰值。 SampleLight中的哪个代码可能会导致这些微小峰值?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它会发出设备正在进行轮询的声音。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    轮询是什么意思?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Zed将定期唤醒以从其父级轮询数据,它由f8wconfig.cfg中定义的polline_rate控制。 Z-Stack中的默认pol_rate为1000,这可能是示波器出现峰值的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最大的高峰是轮询。 我发现微小的峰值是由红色代码引起的,如下所示。 该代码用于检查CC2530是否连接到集线器。 如果不是,则应再次扫描集线器。 显然,应该执行此任务的红色代码导致了问题。 有没有其他方法可以让CC2530在我按HAL_KEY_SW_6时检查是否已连接到集线器?

    IF (KEY & HAL_KEY_SW_6)

     {

      ZDApp_ChangeState(Dev_Nwk_disc);

      //重新开始扫描以重新加入

      ZDApp_StartJoiningCycle();

      OSAL_START_TIMEREx( ZDAppTaskID, ZDO_REUST_backoff, zgDefaultRejoinScan );

     

      OSAL_START_TIMEREx (zclSampleLight_TaskID,turnoff_motor_EVT,5000);

      KeyPressCnt=0;

      OSAL_START_TIMEEREx (zclSampleLight_TaskID,KEYHOLD_EVT,100);

      //立即切换本地灯

      zclSampleLight_OnOff = zclSampleLight_OnOff? LIGHT _OFF:LIGHT _ON;

      对于(int i=0;i<15;i++){

       Onboard_Wait (1万);

      }  

     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在调用红色代码之前,应检查devState。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它在dev_end_device中,直到我按下代码更改为ZDEP_ChangeState(dev_Nwk_ddisC)的按钮。devState将保留在dev_Nwk_disc中,而不返回到dev_end_device。 该代码应检查它是否连接到集线器。 如果未连接到集线器,则应开始搜索集线器。 如果它已连接,则它应改回dev_end_device。 当看到它连接到集线器时,如何使它返回到dev_end_device?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您的设备处于dev_end_device状态,为什么要重新启动扫描?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此代码的目的是,如果CC2530没有连接到集线器,并且它处于dev_nwk_backoff状态,我可以唤醒它,然后按HAL_KEY_SW_6再次开始扫描集线器。 但是,我将此代码放在HandleKeys中,只要我按下按钮,即使是devState=dev_end_device,此代码也会运行。 我尝试添加以下代码,但它不起作用。 因此,我看到CC2530在dev_end_device中并且我按下按钮时,它将更改为dev_nwk_ddisc,而不会返回到dev_end_device。 您说过,如果上述代码已连接到集线器,则无法开始扫描。 那么如何解决这个问题呢?

    if (devState!=dev_end_device){}



    IF (!dev_end_device){}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是,即使您将重新启动扫描代码放在"if(devState!=dev_end_device){}"中,它在连接到集线器时仍会启动扫描吗? 如果是这样,我建议您在"if(devState!=dev_end_device)"上设置一个断点,并在发生时检查devState是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我现在尝试使用的一种方法是下面的代码,如果CC2530找不到集线器,并且它现在处于回退模式,并且DREJOIN_SCAN (20秒)用完,我按SW6,它就会开始扫描。 但问题在于代码为红色。 这应该是说明 DREJOIN_SCAN计时器是否用完的代码。 但是不管用。 我能说什么代码,这样,如果DREJOIN_BACUOFF计时器已启动,那么它将执行此操作?

    IF (HAL_KEY_SW_6 && devState=dev_Nwk_backoff && zgDefaultRejoScan){
    ZDApp_ChangeState(Dev_Nwk_disc);
    //重新开始扫描以重新加入
    ZDApp_StartJoiningCycle();
    OSAL_START_TIMEREx( ZDAppTaskID, ZDO_REUST_backoff, zgDefaultRejoinScan );
    }

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

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

    我在下面的代码上设置了断点,发现devState位于dev_nwk_backoff中。 为什么它不在dev_end_device中? 如何解决这一问题?

    if(devState=dev_Nwk_backoff && zgDefaultRejoinScan){

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为您调用"osal_start_timerEx( ZDAppTaskID, ZDO_REUST_backoff, zgDefaultRejoinScan ),"所以它将更改为回退状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的。 如果“x”== zgDefaultRejoinScan,是否有办法表示已过10秒?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    换言之,如何设置10秒的计时器,这样我就可以说:

    IF (TIMER == zgDefaultRejoinScan){ //如果计时器=10秒
    做些事情
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用以下代码



    IF (zgDefaultRejoinScan == 1万){//IF TIMER == 10秒
    做些事情
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 奏效了。 不过,您之前说过,[因为您调用了“osal_start_timerEx (ZDAppTaskID,ZDO_Reunding_backoff,zgDefaultRejoinScan);”,所以它将更改为回退状态。],当我按下按钮时,它只应转到DEP_Nwk_backoff,但即使我没有按下按钮,它似乎也会执行此操作。 因此,当CC2530连接到集线器时,devState=dev_Nwk_backoff。 为什么会出现这种情况,以及当devState=dev_end_device连接到集线器时如何使其成为设备状态?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果设备连接到集线器,则不应是devState=dev_Nwk_backoff。 我怀疑您的应用程序意外更改devState。 您应该先检查它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我一直在检查,我不确定为什么会出现此问题。 下面是我的代码。 您认为是什么原因导致了此问题?

    e2e.ti.com/.../4848.zcl_5F00_samplelight.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为zclSampleLight_event_loop中的以下代码导致了该问题。

    如果(n==1){
    ZDApp_ChangeState(Dev_Nwk_disc);
    //重新开始扫描以重新加入
    ZDApp_StartJoiningCycle();
    OSAL_START_TIMEREx( ZDAppTaskID, ZDO_REUST_backoff, zgDefaultRejoinScan );
    N=0;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已检查,但这不会导致问题。 该代码在事件循环中仅运行一次,以开始扫描集线器。 扫描将在等位计时器停止后停止。 还有什么问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否对代码进行注释以进行测试和验证?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我做到了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试搜索整个项目以查看devState可更改为dev_Nwk_backoff的位置。