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.

[参考译文] LP-EM-CC2745R10-Q1:在运行时更改 TX 功率

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1475795/lp-em-cc2745r10-q1-changing-tx-power-during-runtime

器件型号:LP-EM-CC2745R10-Q1
主题中讨论的其他器件:SysConfig

工具与软件:

大家好!

我将在 cc2745 Launchpad 上使用 simplelink_lowpower_f3_sdk_8_40_00_61测试基本 BLE 项目。

我正在尝试使用此 HCI_EXT_SetTxPowerDbmCmd() 函数在运行时修改 TX 功率。

我已更新 SysConfig 中的 TX 功率设置、如下所示:

此外、我将使用 Basic BLE 项目中 Simple GATT 服务的特征1发送命令、以在运行时更改 TX 功率值。 以下是我的代码片段:

/********* changes in app_simple_gatt.c file*******************/
static void SimpleGatt_changeCB( uint8_t paramId )
{
  int8_t newValue = 0;

  switch( paramId )
  {
    case SIMPLEGATTPROFILE_CHAR1:
      {
        SimpleGattProfile_getParameter( SIMPLEGATTPROFILE_CHAR1, &newValue );

        // Print the new value of char 1
        MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE, 0, "Profile status: Simple profile - "
                          "Char 1 value = " MENU_MODULE_COLOR_YELLOW "%d " MENU_MODULE_COLOR_RESET,
                          newValue);
        if((newValue<=10) & (newValue>=-10))
        {
          set_txpower=1;
          txpower_value=newValue;
          
        }
      
      }
      break;
      //.................//
      }
    /*************** app_simple_gatt.c*************/
    
    /*************** custom task created to change tx power value*************/
    void *SystemThread(void *arg0)
{
    /* 1 second delay */
    uint32_t time = 1;
    // so that the application can send and receive messages.
    ICall_registerApp(&selfEntityloc_sys, &syncEventloc_sys);

    /* Call driver init functions */
    GPIO_init();
    // I2C_init();
    // SPI_init();
    // Watchdog_init();

    while (1)
    {
        sleep(time);
        GPIO_toggle(CONFIG_GPIO_LED_RED);
        if(set_txpower)
        {
            set_txpower=0;//clear tx power flag
            GAP_TerminateLinkReq(0, HCI_DISCONNECT_REMOTE_USER_TERM); //terminate connection
            usleep(100000);
            stop_adv(); //stop adv
            usleep(100000);
            HCI_EXT_SetTxPowerDbmCmd(txpower_value,0); //change tx power
            MenuModule_printf(9, 0,"tx power changed to %d",txpower_value);
            start_adv(); //start adv
        }
    }
}

但我不能使用上述代码更改 TX 功率。

请向我提供解决此问题的解决方案。

此致、

Aslam

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

    您好!

    BLE 函数需要在 BLEAppUtil 线程的上下文中调用。 您可能需要使用  BLEAppUtil_invokeFunction 、以便更改生效。

    请在项目中参阅 common/BLEAppUtil/inc/bleapputil_api.h。

    请尝试此操作、并告诉我。

    此致!

    Nima Behmanesh

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

    Nima 您好!

    感谢您的建议。

    我已根据您的建议修改了该代码。 下面是代码片段:

    /****************custom task***************/
    void *SystemThread(void *arg0)
    {
        /* 1 second delay */
        uint32_t time = 1;
        
        /* Call driver init functions */
        GPIO_init();
        // I2C_init();
        // SPI_init();
        // Watchdog_init();
    
        while (1)
        {
            sleep(time);
            GPIO_toggle(CONFIG_GPIO_LED_RED);
            if(set_txpower)
            {
                set_txpower=0;//clear tx power flag
                BLEAppUtil_invokeFunction(set_txpowerCB, NULL);
                
            }
        }
    }
    
    void set_txpowerCB(char *pvalue)
    {
        GAP_TerminateLinkReq(0, HCI_DISCONNECT_REMOTE_USER_TERM); //terminate connection
        usleep(100000);
        stop_adv(); //stop adv
        usleep(100000);
        HCI_EXT_SetTxPowerDbmCmd(txpower_value,0); //change tx power
        MenuModule_printf(9, 0,"tx power changed to %d",txpower_value);
        start_adv(); //start adv
    }

    但 TX 功率仍然没有改变。

    如果我使用 SysConfig 更改 TX 功率、它会起作用。 但是、如果我使用上述方法、它将无效。

    此致、

    Aslam

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

    Nima 您好!

    是否有上述问题的最新情况?

    此致、

    Aslam

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

    尊敬的 Aslam:

    我将在今天晚些时候尝试它、然后在今天晚些时候或明天回来与您联系。

    我很抱歉回复晚了!

    此致!

    Nima Behmanesh

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

    尊敬的 Aslam:

    为此、我需要更多时间。 星期五我会给你一个答案。

    我为等待而道歉!

    此致!

    Nima Behmanesh

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

    尊敬的 Aslam:

    我很抱歉响应延迟、虽然我能够让它在我这边工作、因此下面是步骤。

    1.确保 SysConfig 中的 TX 功率设置为 控制器将选择 Tx 功率

    您可以在 Broadcaster Configuration > Advertisement Set 1 > Advertisement Set Parameters 1中找到这些设置

    然后、我创建一个全局  TX_POWER  变量、该变量将被外部到  app_peripheral.c  文件中。 首先、我们需要将  tx_power  变量添加到  simple_gatt_profile.c 中 、然后更改值:

    uint8_t tx_power = 0; // My global variable that will be read in app_peripheral.c
    bStatus_t SimpleGattProfile_writeAttrCB( uint16_t connHandle,
                                         gattAttribute_t *pAttr,
                                         uint8_t *pValue, uint16_t len,
                                         uint16_t offset, uint8_t method )
    {
      bStatus_t status = SUCCESS;
      uint8 notifyApp = 0xFF;
    
      if ( pAttr->type.len == ATT_BT_UUID_SIZE )
      {
        // 16-bit UUID
        uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
        switch ( uuid )
        {
          case SIMPLEGATTPROFILE_CHAR1_UUID:
          {
              // Simple logic for setting the tx_power
              // This could be done a variety of more robust ways.
              // I did it this way just for the example.
              if (*pValue <= 10)
              {
                  tx_power = *pValue;
              }
          }

    我修改了 simple_GATT_profile.c::SimpleGattProfile_writeAttrCB 、但请注意、在该函数中、值的验证将在下一个情况(SIMPLEGATTPROFILE_CHAR3_UUID) 语句中进行。 我建议重构该函数、以便始终验证该值。 但是、在本示例中、我希望这一点很快、而且我知道您的总体实现会有所不同、因此不要过多关注这一点。 目标是  通过 GATT 设置 TX_POWER 变量、以使主应用程序能够访问该值、无论如何实现该值。

    3.现在我们需要修改  app_peripheral.c  peripheral_GAPConnEventHandler

    为了更改 TX 功率、我们需要停止所有连接并停止所有广播、以确保无线电不再使用。 我还没有做过彻底的测试、但是我认为在使用无线电时、TX 功率 不能 更改。 请参阅  BLEAPPUTIL_LINK_TERMIND_EVENT。

    extern uint8_t tx_power;
    
    void Peripheral_GAPConnEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
        switch(event)
        {
            case BLEAPPUTIL_LINK_ESTABLISHED_EVENT:
            {
                /* Check if we reach the maximum allowed number of connections */
                if(linkDB_NumActive() < linkDB_NumConns())
                {
                    /* Start advertising since there is room for more connections */
                    BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1);
                }
                else
                {
                    /* Stop advertising since there is no room for more connections */
                    BLEAppUtil_advStop(peripheralAdvHandle_1);
                }
                break;
            }
    
            case BLEAPPUTIL_LINK_TERMINATED_EVENT:
            {
                // Stop advertising completely.
                BLEAppUtil_advStop(peripheralAdvHandle_1);
    
                // Set the TX power.
                HCI_EXT_SetTxPowerDbmCmd(tx_power, 0);
    
                // Start advertising again.
                BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1);
                break;
            }
    
            default:
            {
                break;
            }
        }
    }

    或者、您可以在设置 TX 功率时触发连接终止、但我只需手动断开设备。 这将导致触发 BLEAPPUTIL_LINK_TERMIND_EVENT、从而设置广播的 TX 功率。

    总之、要在运行时更改广播的 TX 功率、必须确保未使用无线电、并设置了正确的 SysConfig 参数。

    希望这对您有所帮助。

    此致!

    Nima Behmanesh

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

    Nima 您好!

    感谢您的支持。

    将 SysConfig 设置更改为 控制器并选择 Tx 功率后、我先前的代码本身可以正常运行。

    此致、

    Aslam