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:帮助了解专有模式下 CC2340R5的待机功耗策略。

Guru**** 2392905 points
Other Parts Discussed in Thread: CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1501905/cc2340r5-help-with-standby-power-policy-on-cc2340r5-in-proprietary-mode

器件型号:CC2340R5

工具/软件:

您好、

我使用 CC2340R5作为发送器、在具有250kbps 数据速率和 MSK 调制的专有模式下的2.4GHz 频带中运行。

我希望实施待机功耗策略以在传输间隔期间节省功耗、因为该设备由纽扣电池供电。

主要思路是 MCU 在每次传输后进入待机模式、然后在计时器或外部中断中唤醒以便下次传输。

我选择了待机模式、因为我想保留 RAM 内容和射频设置、I2C 设置等基本配置、

和其他外设配置—这样我就不需要在每次器件唤醒时重新配置它们。

我尝试使用看门狗示例、但没有按预期工作-即使在睡眠模式下、电流消耗也保持在0.77 mA 附近。

您能帮助我以超低功耗实现正确的待机运行吗? 非常感谢任何示例代码或指导。

提前感谢!

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

    您好、

    我建议从 rfPacketTx 示例开始、然后验证您是否可以输入低功耗并使用无线电。  

    类似:

    1. RCL_Command_Submit (...TX...)
    2. 睡眠(2)
    3. 再次订购

    对于计时器模式、您可以设置计时器例程、例如:

    1. (+) CC2340R5:SDK 中是否缺少计时器驱动程序? -蓝牙论坛- BluetoothRegistered︎- TI E2E 支持论坛
    2. (+) CC2340R5:如何配置计时器-蓝牙论坛- BluetoothRegistered︎- TI E2E 支持论坛

    谢谢、
    Toby

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

    感谢您的快速答复。
    是的、我正在使用 rfPacketTx 示例。 我曾尝试实现待机模式、但电流消耗仍然不受影响 0.77 mA 、即使设备应处于睡眠模式。

    while(1)
        {
            
            Power_disablePolicy();
    
            if (int1_triggered) {
                int1_triggered = false;
                printf("Int1_free-fall_O\n");
                int1_temp = read_reg(LIS2DE12_REG_INT1SRC); //Read valid Free-fall interrupt.
                printf("%x\n",int1_temp);
                if((int1_temp & 0x40) == 0x40)
                {
                    printf("Int1_free-fall_IN\n");
                    int1_temp = 0x00;;
                }
                // handle motion or tap
            }
    
            if (int2_triggered) {
                int2_triggered = false;
                printf("Int2_triggered_O\n");
                int2_temp = read_reg(LIS2DE12_REG_INT2SRC); //Read valid MEMS interrupt.
                printf("%x\n",int2_temp);
                if((int2_temp & 0x40) == 0x40)
                {
                    int2_temp = 0x00;
                    printf("Int2_triggered_IN\n");
                }
                int2_temp = 0x00;            
                // handle other INT2 logic
            }
    
            
            /* Create packet with random payload */
            uint8_t *txData;
            txData = RCL_TxBuffer_init(txPacket, NUM_PAD_BYTES, HDR_LEN, MAX_LENGTH);
    
            /* Zero out data in header before the length field */
            for (int s = 0; s < LEN_INDEX; s++)
            {
                txData[s] = 0U;
            }
    
            /* Set the packet length */
            txData[LEN_INDEX] = MAX_LENGTH;
    
            /* Generate a random payload */
            for (int i = HDR_LEN; i < MAX_LENGTH; i++)
            {
                txData[i] = 2*i;//rand();
            }
    
            /* Set packet to transmit */
            RCL_TxBuffer_put(&rclPacketTxCmdGenericTx.txBuffers, txPacket);
    
            rclPacketTxCmdGenericTx.common.status = RCL_CommandStatus_Idle;
    
            /* Submit command */
            RCL_Command_submit(rclHandle, &rclPacketTxCmdGenericTx);
    
            /* Pend on command completion */
            RCL_Command_pend(&rclPacketTxCmdGenericTx);
    
            
            Power_enablePolicy();        
    
            usleep(PACKET_INTERVAL1);
        }

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

    请勿直接调用 Power*函数。 您只需呼叫休眠(秒)、例如、要休眠1秒呼叫休眠(1)

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

    我已经尝试过、但它不起作用。 您能否分享完整的代码(从循环中的初始化到实现、包括任何所需的唤醒源)、专门用于待机功耗策略? 现在、我只想测试待机功耗策略。 如果符合数据表的要求、我会将其集成到实际的应用代码中。

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

    以默认的 rfPacketTx 示例为例。

    它已经有一个"usleep"在它: rfPacketTx.c 见第152行。

    LED 切换是唯一的其他额外功耗、只需删除 rfPacketTx.c 中"CONFIG_GPIO_GLED"的任何代码、并且您应该能够在射频发送数据包之间看到持续500毫秒的低电流消耗周期。

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

    是的、rfPacketTx在删除 LED 相关代码并启用断电模式后、我已经测试了默认示例。 但是、器件未进入待机模式、这就是它仍在消耗0.77 mA 的原因。

    因此、我得出结论、我应该首先仅测试电源模式、而不运行任何其他功能或程序。

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

    如何测量电流? 0.77mA 是平均水平吗?

    通常、射频时间越长意味着平均电流消耗越高。 默认情况下、rfPacketTx 仅处于休眠状态500毫秒--能否尝试将其增加到100秒(而不是 usleep( X usec )、尝试 SLEEP( Y sec ))。