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:在不等待上升沿的情况下读取和设置睡眠计时器

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1384597/cc2530-reading-and-setting-the-sleep-timer-without-waiting-for-rising-edges

器件型号:CC2530
主题中讨论的其他器件:CC2533Z-STACKRemoTI

工具与软件:

CC2530和 CC2533用户指南包含以下文本。

当操作在除 PM3之外的所有功耗模式时、睡眠定时器运行。 睡眠定时器的值

不会保留在 PM3中。 从 PM1或 PM2返回时(此时系统时钟关闭)

直到32kHz 时钟的正边沿出现之前、ST2:ST1:ST0中的睡眠定时器值不是最新的

在系统时钟重新启动后检测到。 为确保读取更新的值、请等待正转换

在32kHz 时钟上运行。 CLK32K 位、在读取睡眠计时器值之前。

这表示我应该编写代码以确保  SLEEPSTA 正常运行。 CLK32K!=0之后再读取 ST0 (或等待下一个上升沿、这将等待 SLEEPSTA。 设置为1、然后设置为0、再设置为1、以获得下一个上升沿)。

Z-Stack 3.02中面向 CC2530EB 的代码中没有该等待。  是否需要等待?

void halSleepSetTimer(uint32 timeout)
{
uint32 ticks;

/* read the sleep timer; ST0 must be read first */
((uint8 *) &ticks)[UINT32_NDX0] = ST0;
((uint8 *) &ticks)[UINT32_NDX1] = ST1;
((uint8 *) &ticks)[UINT32_NDX2] = ST2;
((uint8 *) &ticks)[UINT32_NDX3] = 0;

/* Compute sleep timer compare value. The ratio of 32 kHz ticks to 320 usec ticks
* is 32768/3125 = 10.48576. This is nearly 671/64 = 10.484375.
*/
ticks += (timeout * 671) / 64;

/* subtract the processing time spent in function halSleep() */
ticks -= HAL_SLEEP_ADJ_TICKS;

/* set sleep timer compare; ST0 must be written last */
ST2 = ((uint8 *) &ticks)[UINT32_NDX2];
ST1 = ((uint8 *) &ticks)[UINT32_NDX1];
ST0 = ((uint8 *) &ticks)[UINT32_NDX0];
}

与此类似、用户指南中 的状态为等待至 STLOAD。 在 wring 到 ST2之前、LDRDY 为1。  上面的代码没有这么做。  但是、用于 RemoTI 1.4.0中 CC2533EB 的宏在设置睡眠计时器寄存器后等待。

#define HAL_SLEEP_ST_SET(STCNT) st ( \
/* Set the sleep timer compare; ST0 must be written last. */\
ST2 = ((uint8 *) &(STCNT))[2]; \
ST1 = ((uint8 *) &(STCNT))[1]; \
ST0 = ((uint8 *) &(STCNT))[0]; \
while (!(STLOAD & LDRDY)); /* Wait for the sleep timer to load. */\
)

哪个版本(用户指南、Z-Stack 或 RemoTI)正确或者它很重要?

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

    您好!

    [报价 userid="613487" url="~/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1384597/cc2530-reading-and-setting-the-sleep-timer-without-waiting-for-rising-edges "]

    这表示我应该编写代码以确保  SLEEPSTA 正常运行。 CLK32K!=0之后再读取 ST0 (或等待下一个上升沿、这将等待 SLEEPSTA。 设置为1、然后设置为0、再设置为1、以获得下一个上升沿)。

    Z-Stack 3.02中面向 CC2530EB 的代码中没有该等待。  是否需要等待?

    void halSleepSetTimer(uint32 timeout)

    [报价]

    在调用 halSleepSetTimer 时间时、ST 值可能是有效的、因此添加额外检查将是冗余的。

    哪个版本(用户指南、Z-Stack 或 RemoTI)是正确的或者它是否重要?

    我会按照用户指南操作。 可能在 Z-Stack 级别发生了其他假设、这些假设可能已经处理了用户指南中指定的等待。

    在您之前的帖子(e2e.ti.com/.../cc2530-is-timer-2-needed-if-using-only-the-802-15-4-phy-in-the-cc2530)中 、您似乎不需要使用 Z-Stack MAC、如果是这样、那么 Z-Stack 中的任何代码都应仅用于参考。 如果 Z-Stack 和用户指南之间出现任何差异、应以用户指南为准。

    谢谢!
    Toby