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.

[参考译文] CC2650MODA:UART 阻塞睡眠模式并增加电流消耗

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1462883/cc2650moda-uart-blocking-sleepmode-and-increasing-current-consumption

器件型号:CC2650MODA
Thread 中讨论的其他器件: CC2650SYSBIOS

工具与软件:

您好!

我使用的 CC2650MODA 采用2.2.8.12版蓝牙堆栈和 Simplelink SDK 6.30.01.03版。 我的应用基于 SimplePeripheral 示例。

CC2650MODA 通过 UART 连接到另一个器件、该器件每秒发送一次消息。 它可以异步接收由连接的 BLE 中央设备(PC)发送的消息并发送答案。 CC2650MODA 配置有两个特性(一个用于读取、一个用于写入) 、每个特性的长度为80个字符。

CC2650MODA 将接收到的 UART 消息复制到发送特性中、以便 BLE 中央设备(PC)通过蓝牙读取。 在收到已连接 PC 的消息后、CC2650MODA 会使用 UART 将此消息写入已连接的器件。 它将通过使用用于1秒常规消息的相同 UART 端口发送特定应答消息来回复该消息。 在这个例子中,我没有包括阅读和回答过程,以使这个例子尽可能简单。

 SBP_PERIODIC_EVT_PERIOD 设置为1000、因此 SimpleBLEPeripheral_performPeriodicTask()将每秒执行一次。  

SimpleBLEPeripheral_performPeriodicTask()如下所示:

SimpleBLEPeripheral_performPeriodicTask()
{

      UARTCC26XX_read(my_Handle, &my_Buffer, 80);

      SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, SIMPLEPROFILE_CHAR4_LEN, my_Buffer);

}

非常简单。 问题是:

通过蓝牙连接时、我的电流消耗从1.40 mA 开始、并在2小时内降至0、7 mA。 之后、立即上升至1、7 mA、并随着时间的推移缓慢下降至0、7 mA。

我想情况是:调用 UARTCC26XX_READ 函数并等待数据传入时、UART 外设处于活动状态、阻止了睡眠模式。 电流消耗的缓慢下降可以通过连接器件和 CC2650MODA 中的时钟之间的时序差异来解释。 因此、睡眠模式被阻断的周期变得更短并且突然变为最大值1、7mA。

我已经尝试通过回调函数分段读取 UART、但这会使 UART 外设始终处于激活状态、这意味着睡眠模式永久停用、因此电流消耗始终为1、7mA。

我尝试优化应用的电流消耗、因此这个问题对于我的项目至关重要。

是否有办法停止活动的 UART 外设阻止睡眠模式? 或者优化时序以尽可能延长睡眠模式下的时间?

感谢您的时间和帮助。

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

    您好、Hans:

    [quote userid="547690" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1462883/cc2650moda-uart-blocking-sleepmode-and-increasing-current-consumption 我认为这样是:当调用 UARTCC26XX_READ 函数并等待输入数据时、UART 外设处于活动状态并阻止了睡眠模式

    这是正确的、在 UART_READ 期间阻止了待机模式。  我有 两个缓解思路

    1. PC 首先发送一个虚拟字节、CC2650 已将其 UART RX 引脚配置为是 GPIO 中断、以便它可以检测到虚拟字节的电平变化、从而更改模式以在有效数据到达之前启动 UART_READ。  这将需要双方的时序协议、以便 UART_READ 不会在该虚拟字节的中间意外启动、并导致传入的数据位移位。
    2. 在第一个 UART_READ 之前立即启动计时器、并在现有计时器之后停止、从而获得等待 UART 事务所花费的时间。  这应该会给您一个偏移量、您可以将其应用于下一个周期性任务、以便您可以与连接的 PC 同步。  为 防止漂移、可能需要偶尔执行此操作。  

    考虑到我不知道的系统配置、这些想法中的任何一种都可能无效、但希望这能为您提供一些可供 尝试的想法。

    此致、
    Ryan

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

    Ryan、您好!

    感谢您的快速响应。 今天我尝试实施你的第一个建议。 我关于该方法的第一个问题是:是否可以同时将您的 UART RX 引脚配置为 UART 和硬件中断? 当我尝试此功能时、UART 停止工作。

    我还发现、很难找到有关如何在此 API 中配置 GPIO 端口以触发硬件中断的有用信息。 我浏览了"SimpleLink WirelessMCU 技术参考手册"、但找不到任何有用的东西。 《技术参考手册》为我提供了有关该问题的更多信息、但没有提供有关实施的信息。 我最终在 SDK 文件夹中找到了 Sensortag 示例。 该示例在中断模式下使用 GPIO 通过继电器进行用户输入。

      hGpioPin = PIN_open(&pinGpioState, SensortagAppPinTable);
      PIN_registerIntCb(hGpioPin, SensorTag_callback);

    我确定这两条线与配置用于中断的 GPIO 引脚相关。 以及在 PinTable 中如何初始化它。

    要么未调用回调函数、我看不到器件广播、要么 UART 无法正常工作。 但我不能让这种方法发挥作用。

    我觉得很难获得关于此 API 使用情况的确切信息。 是否有有关语法的更多文档? 您能告诉我可以在哪里找到这个吗?

    感谢你的帮助。 非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以同时为 UART 和硬件中断配置 UART RX 引脚?

    否、您需要在函数之间重新配置引脚

    我发现这两行与配置用于中断的 GPIO 引脚相关。 以及如何在 PinTable 中初始化它。[/QUOT]

    应有支持的 Board.h 和 LaunchPad .c/.h 文件来初始化引脚表

    我觉得很难获得有关此 API 使用情况的确切信息。 是否有有关语法的更多文档? 您能告诉我可以在哪里查找吗?

    SDK 中应该有一个对这些 API 进行说明的 docs 文件夹。

    很抱歉、CC2650MODA 器件和 SDK 中缺少支持、因为它是旧器件、已被较新的 Simplelink F2 SDK 器件取代。  www.ti.com/.../SIMPLELINK-LOWPOWER-SDK

    此致、

    Ryan

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

    您好!

    我设法通过中断进行接收、方法是将 UART RX 引脚短接到另一个 GPIO 引脚。 现在发生的情况是通过两个引脚接收 UART 消息。 一个用于中断、另一个用于 UART 处理。 令我感到困扰的是、文件中有关实施 HWI 的例子根本不起作用。 我巧合的是在 PINCC26XX.c 中的 PIN_INIT 函数中找到了硬件中断的实现方案:

        Hwi_Params_init(&hwiParams);
        hwiParams.priority = PINCC26XX_hwAttrs.intPriority;
        Hwi_construct(&PinHwi, INT_AON_GPIO_EDGE, PIN_hwi,&hwiParams, NULL);

    当触发我配置用于中断的 PIN 时、会运行此代码并调用 PIN_Hwi (UArg arg)。

    我在文档中找到的内容是:

    Hwi_Params_init(&hwiParams);
    hwiParams.arg = 10;
    hwiParams.enableInt = FALSE;
    myHwi = Hwi_create(5, myIsr, &hwiParms, &eb);

    我在任何可用的文档中找不到任何与 Hwi_built 函数相关的信息。

    无法使用 hwi_disable 来禁用中断、但我需要这样做、因为接收整个消息将会多次触发中断服务例程并失真接收到的消息。

    你是否有关于我如何正确实现硬件中断的任何提示?

    感谢您的帮助!

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

    您好、Hans:

    请问您为什么使用 SYS/BIOS HWI 硬件而不是 PIN TI 驱动程序?  你是否尝试过改用 Hwi_析 构函数?

    引脚 TI 驱动程序: tirtos_cc13xx_cc26xx_2_21_01_08/products/tidrivers_cc13xx_cc26xx_2_21_01_01/docs/doxygen/html/_p_i_n_8h.html
    SYS/BIOS: tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/docs/cdoc/index.html、 模块  ti.sysbios.hal.hwi

    此致、
    Ryan