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.

[参考译文] CC2340R5:在集成 I2C、UART 等外设时、POWER_SLEEP 无法正常工作

Guru**** 2659325 points

Other Parts Discussed in Thread: SYSCONFIG, CC2340R5, ENERGYTRACE

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1592114/cc2340r5-power_sleep-not-working-while-integrating-peripherals-like-i2c-uart

器件型号: CC2340R5
主题中讨论的其他部件: SysconfigENERGYTRACE

TI 团队好!

摘要:
同时将 Power_sleep 与 I2C、UART、  
它在执行 powersleep 后看起来程序已挂起。
请通过示例建议使用 Power_Sleep 或 PowerLPF3_SLEEP 进入待机模式并进行唤醒。

详细信息:
Power_sleep、I2C 和 UART 的封闭代码(源自 empty.c)。 empty_powersleep.txt

初始化后、在 while 循环(第 118 至 180 行)之间、
LED 在线路 120 上亮起 -正在发生 、然后在 122 至 151 之间执行 I2C 写入读取测试。
然后、线路 152 处的 LED 熄灭- happeinig — 大约 10 秒
然后通过线路 154 和 155 ,  
尝试停用 I2C 并通过 NULL 显示指针、因为没有取消初始化且 I2C_CLOSE 意味着错误。
然后通过 157 至 162 线路启动断电模式。
假定在第 164 行、将发生唤醒。
再次通过从 165 到 177 的线路初始化 I2C 和显示器。
出乎意料的行为 指示灯在行 120 处再次亮起 、作为待机后重新进入的。
它正在发生
第二次来了 LED 熄灭(线路 152 处)未发生 写入读取测试后。
它看起来悬空了。  
我们也尝试了电源。 结果相同。
我们确保在 SysConfig 中启用待机策略、因为它是“空“示例工程。  

请澄清这一点
1.除了下面的行,我们是否需要添加任何其他步骤。
uint32_t compareValue = HWREG (RTC_BASE + RTC_O_TIME8U)+(125000*10);//(327680*2);
HWREG (RTC_BASE + RTC_O_CH0CC8U)= compareValue;
//进入待机模式
POWER_SLEEP (PowerLPF3_STANDBY);

2.我们可以像 PowerLPF3_sleep (100000 ) 一样使用 PowerLPF3_sleep 吗?

uint32_t compareValue = HWREG (RTC_BASE + RTC_O_TIME8U)+(125000*10);//(327680*2);
HWREG (RTC_BASE + RTC_O_CH0CC8U)= compareValue;
//进入待机模式
POWER_SLEEP (PowerLPF3_STANDBY);
如果不正确、请指导我们如何使用 PowerLPF3_SLEEP。

如果我们以 Power_sleep 和 PowerLPF3_sleep 与 I2C 为例、它将非常有用。

谢谢
Selvam

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

    您好!

    我了解了您的代码、我看到的主要问题之一是您是如何禁用 UART 和 I2C 的。 禁用这些外设的正确方法是调用 I2C_CLOSE 和 Display_Close 函数。

    关闭外围设备实例有两个原因:首先,这将释放驱动程序使用的内存和缓冲区。  第二也是最重要的是、关闭外设实例会释放对电源驱动器的限制。 在 CC2340R5(和许多其他器件)上、UART 和 I2C 外设在待机等低功耗模式下不可用。 因此、当您打开 I2C 实例时、I2C 驱动程序会通知电源驱动程序、在所有 I2C 实例都关闭之前、它无法进入待机状态。 UART 和其他一些外设也是如此。

    您可以在 CC2340R5 数据表的第 8.11 章“电源管理“中查看每个电源状态下允许的外设列表

    我认为、您的器件挂起的原因是您尝试在第 129 行进行 I2C 传输、其 i2cHandle 变量无效。 其无效的原因是您未通过 I2C_CLOSE 关闭 I2C 实例、而第 169 行上的 I2C_OPEN 函数可能已失败 。  我建议您在尝试断电之前调用 I2C_CLOSE 和 DISPLAY_CLOSE、以便您可以进入待机状态。

    至于你的其他问题,为了睡觉,你应该用 睡眠或 uSleep 功能取代从 157 到 163的所有线路,这个功能将注意在正确的时间唤醒,并将为你做所有的计时器和功率计算。 如果您的 I2C 和 UART 实例已关闭、则睡眠功能将使您进入待机状态。 您可以使用 EnergyTrace 并将现有的电流消耗与预期的电流消耗进行比较来检查是否成功进入待机模式。

    此致、
    Lea

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

    好的一天 Lea、

    感谢您的指导意见。
    我们在循环期间尝试了 UART 外设+睡眠模式、如下所示。
    注意: 在我们的 PCBA 中、我们没有使用任何晶体、而我们有一个 AFE IC、它消耗的电流为 66uA
    while (1)

    /*打开用户 LED 指示灯以指示初始化成功*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    UART2_WRITE (UART、“用于测试\n“、10&bytesWrittenFun);
    UART2_CLOSE (UART);
    睡眠 (5);

    /*打开用户 LED 指示灯以指示初始化成功*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);
    睡眠 (5);
    UART = UART2_OPEN (CONFIG_UART2_0、&uartParams);
    IF (UART = NULL)

    /* UART2_OPEN () 失败*/
    while (1){}
    }

    在 LED 关闭(待机模式)期间、
    根据 CC2340R 数据表 (7.9 功耗 — 功耗模式)、我们预计电流约为 67uA (66+1)
    以及我们获得的优势 590uA。

    请澄清

    我们是否错过了任何配置?
    由于唤醒源是 RTC、我们是否需要任何晶体来进入待机模式?

    谢谢
    Selvam

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

    您好!

    要进入待机模式、必须使用低频时钟。 默认情况下、该 LF 时钟源自 CC2340R5 LaunchPad 上的外部晶体。 您可以选择在“TI 器件 — 器件配置“的 SysConfig 中使用 CC2340R5 的内部 RCOSC LF 时钟

    此致、
    Lea

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

    尊敬的 Lea:

    我们将 LF 时钟源更改为 LFRCOSC 、但看起来没有影响、电流消耗相同、为 590uA。

    由于唤醒源是 RTC、我们是否确实需要任何晶体来进入待机模式?

    此外、
    1.使用 PowerLPF3_SLEEP() 而不是 SLEEP() 时、它看起来系统已挂起。
    在 simplelink_lowpower_f3_SDK_9_12_00_19 中未找到 AON 和 RTC 驱动程序。

    如果我们得到、它将非常有帮助
    1. PowerLPF3_sleep () 用法示例(与 I2C 更有用)
    2. simplelink... SDK 的名称、其中包含 CC2340R5 的 AON + RTC 驱动程序

    谢谢

    Selvam

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

    您好!

    您不应使用 PowerLPF3_SLEEP、因为这是一个只应由电源驱动器使用的函数。 您应始终使用 sleep() 或 usleep()。

    关于进入待机模式、我忘记提到 GPIO 输出也会阻止 CC2340R5 进入睡眠状态。 这是 i2ctmp 代码的稍作修改的版本、它会发送 20 条 I2C 命令、然后进入睡眠状态 5 秒。 该采样能够在睡眠时进入待机模式、并在睡眠时响应非常低的电流。

    e2e.ti.com/.../i2ctmp.c

    此致、
    Lea