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.

[参考译文] CC2564:运行经修改的 SPPLE Demo Lite 的 PAN1326的高功耗

Guru**** 2520140 points
Other Parts Discussed in Thread: MSP430F2418, CC2564MODN

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/615504/cc2564-high-power-draw-with-pan1326-running-modified-spple-demo-lite

器件型号:CC2564
主题中讨论的其他器件:MSP430F2418

根据第38页的 PAN1326数据表、平均 BLE"广播、可发现"电流为121uA。 但是、我测量的平均系统电流为800uA。 我需要尽可能减少电流消耗、并需要帮助以实现理论上可能达到的~130uA。

使用的 MSP430F2418位于 LPM3中、如果我将 PAN1326上的 nShutdown 引脚置为有效、则电路板电流降至15uA。 根据这一结论、我得出的电流由 PAN1326模块消耗、并且它未进入正确的电源状态。 我将 Bluetopia v1.5用于堆栈、代码基于 SPPLE Demo Lite 示例的修改版本。

原理图摘录如下所示。 VBAT 为3.4V、S1和 S2是 VBAT 位置的跳线。 我在下面包含了修改后的 SPPLEDemo.c 和 MainThread()以及 IdleFunction()实现。

/*以下函数负责检查空闲状态*/*
并可能进入 LPM3模式。 */
static void IdleFunction (void *UserParameter)
{
if (BLEdataToProcess)
return;//仍可完成
#ifdef __connection_timeout__//if
((ConnectionID !=0)&&(connection_timeout !=0)// 2017年5月23
日 if ((ConnectionID !=0)&&(flgBLEOperationOn =1)) // 2017年5月23日
{
返回; //do not sleep
}
#endif
//如果堆栈空闲且我们处于 HCILL 睡眠状态,则可以进入*//*
LPM3模式(禁用计时器中断)。 //
if (((bsc_QueryStackIdle (BluetoothStackID))&&(SlepEnabled)
){
/*尝试暂停 UART。 *
if (!HCITR_COMSSENPEND (0))
{
/*在禁用计时器中断的情况下输入 MSP430 LPM3 (我们将*/
/*需要中断才能将我们从该状态唤醒)。 *
//HAL_LowPowerMode ((unsigned char) false);
#if 1.
if ((beacon INT_flag = 1)&&(Pkt_RCD = 0)&&(RxCount=0)&&(RxState_=0)&&(RxState_=0))
//if (((Pkt_RCD = 0)&&(RxCount=0)&&(RxState=0))
{
//FRAM_POWEROFF ();//comment out 05/18/2017 // 06/2017
PWRDO_FlashIC ();//确保闪存已断电
HAL_LowPowerMode ((unsigned char) false);
}
其他
HAL_LowPowerMode ((unsigned char) false);
#endif
/*检查是否正在唤醒(由控制器)。*/
/*如果是,我们将禁用睡眠模式,以便完成*/
/*过程。 *
if (!HCITR_UartSusspened (0))
SlepEnabled = false;
}
其他
{
/*未能暂停 UART,这必须是指 *
/*控制器正在尝试唤醒。 因此、我们将*/
禁用睡眠模式的标志。 *
SlepEnabled = false;
}
}
}/*


以下函数是主用户界面线程。 它 //
//*打开蓝牙堆栈,然后驱动主用户界面。*/
static void MainThread (void)
{
int 结果;
BTPS_Initialization_t BTPS_Initialization;
HCI_DriverInformation_t HCI_DriverInformation;
HCI_HCIILLConfiguration_t HCILLConfig;
HCI_Driver_reconfigure_Data_t DriverReconfigureData;

/*标记睡眠当前未启用。 */
SlepEnabled = false;

/*配置 UART 参数。 */
HCI_DRIVER_SET_COMM_information (&HCI_DriverInformation、1、115200、cpHCILL);
HCI_DriverInformation.DriverInformation.COMMDriverInformation.InitializationDelay = 100;

/*设置应用程序回调。 //
BTPS_Initialization.GetTickCountCallback = GetTickCallback;
BTPS_Initialization.MessageOutputCallback = DisplayCallback;

/*初始化应用程序。 //
if (((结果= InitializeApplication (&HCI_DriverInformation、&BTPS_Initialization))> 0)
{
/*保存蓝牙堆栈 ID。 *
BluetoothStackID =(无符号 int)结果;

/*如果我们使用 HFILL 模式,请注册睡眠模式回调。 *
if ((HCI_DriverInformation.DriverInformation.COMMDriverInformation.Protocol =cpHCILL)||(HCI_DriverInformation.DriverInformation.COMMDriverInformation.Protocol ==cpHCILL_RTS_CTS))
{
HILLConfig.Sleep 回调功能 = HCI_SLEEP_Callback;
HILLConfig.Sleep CallbackParameter = 0;
DriverReconfigureData.ReconfigureCommand = HCI_COMM_DRIVER_RECONFIG_DATA_COMMAND_CHANGE_HCILL_PARAMETERS;
DriverReconfigureData.ReconfigureData =(void *) HFILLConfig;

/*注册睡眠模式回调。 请注意、如果是这样 *
/*函数返回大于0的值,则睡眠当前为 *
/*已启用。 *
结果= HCI_RECONFIG_Driver (BluetoothStackID、false、&DriverReconfigureData);
if (结果>0)
{
/*标志睡眠模式已启用。 *
SlepEnabled = true;
}
}
//FRAM_POWERON ();//comment out 05/18/2017 // 06/2017
//FRAM_POWEROFF ();//comment out 05/18/2017 // 06/2017
BTPS_AddFunctionToScheduler (IdleFunction、NULL、0);//用于管理

if (BTPS_AddFunctionToScheduler (BLEApplication、NULL、5))

/*添加 IDLE 函数(用于确定是否可以进入 LPM3)*/
/*到调度程序。 *
//if (BTPS_AddFunctionToScheduler (IdleFunction、NULL、0))
{
/*永久循环并执行调度程序。 *
while (1)

BTPS_ExecuteScheduler();
}
}

e2e.ti.com/.../SPPLEDemo.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    您的查询已分配给相关专家。 我们很快会回来。

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

    Peter、

    SPPLEDemo_Lite 还为 SPP 初始化 BT 经典。 请分别在 SetConnect()、SetDisc()和 SetPairable()函数中将设备设为非连接、不可发现和不可配对。

    这将停止仅使用 LE 时会导致电流消耗的页面和查询扫描。

    此致、

    Vihang

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

    谢谢您、进行这些更改后、平均电流下降了约5倍。 遗憾的是、平均电流仍远高于数据表所示的值。 在广播间隔设置为1.28秒的情况下、我测量的平均电流为245uA。 我还在另一个板上尝试了具有相同结果的新代码。 您是否有任何其他建议可进一步降低电流?

    作为参考,SetConnect()、SetDisc()和 SetPairable()函数现在如下:

    /*以下功能负责放置本地 //
    //*蓝牙设备进入常规发现模式。 进入此*/
    /*模式后,设备将响应来自其它 Bluetooth*/
    /*设备的查询扫描。 此函数要求
    在运行之前存在有效的蓝牙协议栈 ID *//*。 此函数在*/
    //*成功执行时返回0、如果发生错误、则返回负值。 */
    static int SetDisc (void)
    {
    int ret_val = 0;
    
    /*首先,检查是否存在有效的蓝牙堆栈 ID。 //
    if (BluetoothStackID)
    {
    /*存在半有效的蓝牙堆栈 ID,现在尝试设置*/
    /*连接的设备将"发现模式"更改为"常规"。 *
    RET_val = GAP_SET_DISCONNICE_Mode (BluetoothStackID、dmNonDiscoverableMode、0);//dmDiscoverGeneralableMode、0);
    
    /*接下来,检查间隙集可发现性的返回值*/
    /*模式命令以成功执行。 *
    if (!ret_val)
    {
    /**注意*发现性仅适用于我们 *
    /* 广播、因此保存默认可发现性*/
    /* 模式下运行。 *
    LE_Parameters.DiscoverabilityMode = dmGeneralDiscoverableMode;
    }
    其他
    {
    /*尝试设置可发现性时出错*/
    设备的/*模式。 *
    DisplayFunctionError ("设置可发现模式"、RET_val);
    }
    }
    否则
    {
    /*不存在有效的蓝牙堆栈 ID。 *
    RET_val = INVALID_STACK_ID_ERROR;
    }
    
    return (ret_val);
    }
    
    /*以下函数负责放置局部变量 //
    //*蓝牙设备进入可连接模式。 进入此模式后,*/
    /*设备将响应来自其它蓝牙设备的页面扫描。 //
    //*此函数要求存在有效的蓝牙堆栈 ID */
    /*运行前。 此函数在成功时返回0、并返回 A //
    //*如果发生错误,则为负值。 */
    static int SetConnect (void)
    {
    int ret_val = 0;
    
    /*首先,检查是否存在有效的蓝牙堆栈 ID。 //
    if (BluetoothStackID)
    {
    /*尝试将连接的设备设置为可连接。 *
    RET_val = GAP_SET_connectable_Mode (BluetoothStackID、cmNonConnectableMode);/cmConnectableMode);
    
    /*接下来,检查的返回值 *
    /* gap_set_connectability _Mode()函数成功 *
    /*执行。 *
    if (!ret_val)
    {
    /**注意*可连接性仅在以下情况下适用 *
    /* 广播、因此我们将仅保存默认值 *
    /* 我们下次启用时的可连接性 *
    /* 广播。 *
    LE_Parameters.ConnectableMode = lcmConnectable;
    }
    其他
    {
    /*尝试制作设备时出错 *
    /*可连接。 *
    DisplayFunctionError ("设置可连接性模式"、RET_val);
    }
    }
    否则
    {
    /*不存在有效的蓝牙堆栈 ID。 *
    RET_val = INVALID_STACK_ID_ERROR;
    }
    
    return (ret_val);
    }
    静态 int SetPairable (void)
    {
    
    int 结果;
    int ret_val = 0;
    
    /*首先,检查是否存在有效的蓝牙堆栈 ID。 //
    if (BluetoothStackID)
    {
    //#ifdef __TAM__
    /*尝试将连接的设备设置为可配对。 *
    结果= GAP_SET_Pairable_Mode (BluetoothStackID、PmNonPairableMode);//pmPairableMode);
    
    /*接下来,检查 GAP 设置可气性模式的返回值*/
    成功执行的/*命令。 *
    if (!result)
    {
    //#endif
    /*器件已设置为可配对模式,现在注册一个*/
    /*身份验证回调以处理身份验证事件*/
    /*(如果需要)。 *
    结果= GAP_Register_Remote_Authentication (BluetoothStackID、GAP_Event_Callback、(无符号长整型) 0);
    
    /*接下来,检查 GAP 远程寄存器的返回值 *
    /*验证命令,以成功执行。 *
    if (!result)
    {
    /*现在设置 LE 可播放性。 *
    
    /*尝试将连接的设备设置为可配对。 *
    结果= GAP_LE_Set_Pairable_Mode (BluetoothStackID、lpmPairableMode);
    
    /*接下来,检查间隙集可气性的返回值*/
    成功执行的/*模式命令。 *
    if (!result)
    {
    /*设备已设置为可配对模式,现在注册*/
    /*用于处理的身份验证回调 *
    /*需要时的身份验证事件。 *
    结果= GAP_LE_Register_Remote_Authentication (BluetoothStackID、GAP_LE_Event_Callback、(无符号长整型) 0);
    
    /*接下来,检查 GAP 寄存器的返回值 *
    /*远程身份验证命令成功 *
    /*执行。 *
    if (结果)
    {
    /*尝试执行此操作时出错 *
    /*函数。 *
    DisplayFunctionError ("GAP_LE_Register_Remote_Authentication"、结果);
    
    RET_val =结果;
    }
    }
    其他
    {
    /*尝试制作设备时出错 *
    /*可配对。 *
    DisplayFunctionError ("GAP_LE_Set_Pairability 模式"、结果);
    
    RET_val =结果;
    }
    }
    #if 0
    其他
    {
    /*尝试执行此函数时出错。 *
    DisplayFunctionError ("GAP_Register_Remote_Authentication"、结果);
    
    RET_val =结果;
    }
    #endif
    //#ifdef __TAM__
    }
    //#endif
    0
    其他
    {
    /*尝试使设备配对时出错。 *
    DisplayFunctionError ("GAP_SET_Pairability 模式"、结果);
    
    RET_val =结果;
    }
    #endif
    }
    否则
    {
    /*不存在有效的蓝牙堆栈 ID。 *
    RET_val = INVALID_STACK_ID_ERROR;
    }
    
    return (ret_val);
    }
    
    

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

    通过上述软件更改并在 MainThread()中启用 HFILL,可以覆盖软件端的所有内容,以匹配数据表中提到的模式。

    请确保测量的是 CC256x 的 VDD_IN 上的电流、而不是整个板/模块上的电流。 我还建议使用 CC2564MODN 等 TI 模块、确保模块中的硬件差异不是责任因素。

    此致、
    Vihang