TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2340R5: TX Power Index

Part Number:CC2340R5

关于CC2340R5的TX_Power_Index问题,我逛论坛发现七八个月前就已经修复好了这个问题,我现在使用的SDK版本是7.20.0.29,发现仍然不可以调用,最新的7.20.1.10也是一样的?请问我需要修改时,应该怎样操作?

/**
 * @defgroup TX_Power_Index TX Power Index
 * @{
 */
#ifndef CC23X0
#if defined( CC26XX ) || defined( CC13XX ) || defined ( CC33xx )
#define HCI_EXT_TX_POWER_MINUS_20_DBMLL_EXT_TX_POWER_MINUS_20_DBM//!< -20 dBm
#define HCI_EXT_TX_POWER_MINUS_18_DBMLL_EXT_TX_POWER_MINUS_18_DBM//!< -18 dBm
#define HCI_EXT_TX_POWER_MINUS_15_DBMLL_EXT_TX_POWER_MINUS_15_DBM//!< -15 dBm
#define HCI_EXT_TX_POWER_MINUS_12_DBMLL_EXT_TX_POWER_MINUS_12_DBM//!< -12 dBm
#define HCI_EXT_TX_POWER_MINUS_10_DBMLL_EXT_TX_POWER_MINUS_10_DBM//!< -10 dBm
#define HCI_EXT_TX_POWER_MINUS_9_DBMLL_EXT_TX_POWER_MINUS_9_DBM//!< -9 dBm
#define HCI_EXT_TX_POWER_MINUS_6_DBMLL_EXT_TX_POWER_MINUS_6_DBM//!< -6 dBm
#define HCI_EXT_TX_POWER_MINUS_5_DBMLL_EXT_TX_POWER_MINUS_5_DBM//!< -5 dBm
#define HCI_EXT_TX_POWER_MINUS_3_DBMLL_EXT_TX_POWER_MINUS_3_DBM//!< -3 dBm
#define HCI_EXT_TX_POWER_0_DBMLL_EXT_TX_POWER_0_DBM//!< 0 dBm
#define HCI_EXT_TX_POWER_1_DBMLL_EXT_TX_POWER_1_DBM//!< 1 dBm
#define HCI_EXT_TX_POWER_2_DBMLL_EXT_TX_POWER_2_DBM//!< 2 dBm
#define HCI_EXT_TX_POWER_3_DBMLL_EXT_TX_POWER_3_DBM//!< 3 dBm
#define HCI_EXT_TX_POWER_4_DBMLL_EXT_TX_POWER_4_DBM//!< 4 dBm
#define HCI_EXT_TX_POWER_5_DBMLL_EXT_TX_POWER_5_DBM//!< 5 dBm
#if defined( CC13X2P ) || defined( CC33xx )
#define HCI_EXT_TX_POWER_P2_14_DBM_P4_6_DBMLL_EXT_TX_POWER_P2_14_DBM_P4_6_DBM//!< P2: 14 dBm P4: 6 dBm
#define HCI_EXT_TX_POWER_P2_15_DBM_P4_7_DBMLL_EXT_TX_POWER_P2_15_DBM_P4_7_DBM//!< P2: 15 dBm P4: 7 dBm
#define HCI_EXT_TX_POWER_P2_16_DBM_P4_8_DBMLL_EXT_TX_POWER_P2_16_DBM_P4_8_DBM//!< P2: 16 dBm P4: 8 dBm
#define HCI_EXT_TX_POWER_P2_17_DBM_P4_9_DBMLL_EXT_TX_POWER_P2_17_DBM_P4_9_DBM//!< P2: 17 dBm P4: 9 dBm
#define HCI_EXT_TX_POWER_P2_18_DBM_P4_10_DBMLL_EXT_TX_POWER_P2_18_DBM_P4_10_DBM//!< P2: 18 dBm P4: 10 dBm
#define HCI_EXT_TX_POWER_P2_19_DBMLL_EXT_TX_POWER_P2_19_DBM//!< P2: 19 dBm
#define HCI_EXT_TX_POWER_P2_20_DBMLL_EXT_TX_POWER_P2_20_DBM//!< P2: 20 dBm
#endif // CC13X2P || CC33xx
#else // CC254x
#define HCI_EXT_TX_POWER_MINUS_23_DBMLL_EXT_TX_POWER_MINUS_23_DBM //!< -23 dBm
#define HCI_EXT_TX_POWER_MINUS_6_DBMLL_EXT_TX_POWER_MINUS_6_DBM  //!< -6 dBm
#define HCI_EXT_TX_POWER_0_DBMLL_EXT_TX_POWER_0_DBM//!< 0 dBm
#define HCI_EXT_TX_POWER_4_DBMLL_EXT_TX_POWER_4_DBM//!< 4 dBm
#endif // CC26XX/CC13XX
#endif //CC23X0
/** @} End TX_Power_Index */

Yolande Wang:

您好,

调整发射功率请参阅这个链接:

https://dev.ti.com/tirex/explore/content/simplelink_lowpower_f3_sdk_7_20_01_10/docs/ble5stack/ble_user_guide/html/cc23xx/txpower-cc23xx.html?highlight=tx%20power#changing-txpower-at-run-time

,

Cherry VIP:

根据这个,发现在CC2340中有extern hciStatus_t HCI_EXT_SetTxPowerDbmCmd( int8 txPower, uint8 fraction );

但是参数依然是跟图中是一样的,并且链接中并没有这个API函数,

最后一张图可以看出对于CC2340这些都是不可用状态,需要自己修改?

,

Yolande Wang:

您好,

为了更好地解决问题,我需要询问更了解这款芯片的TI资深工程师,确定这个 bug 在最新版本 SDK 已被修复,再为您解答。

,

Yolande Wang:

您好,

HCI_EXT_SetTxPowerDbmCmd函数原型位于<SDK_path>\source\ti\ble5stack_flash\hci\cc26xx\hci.c,目前文档中确实尚未更新此API的信息,我会上报产品线在后续SDK中更新。HCI_EXT_SetTxPowerDbmCmd函数不需要(也不可以)使用功率索引值(例如HCI_EXT_TX_POWER_0_DBM),它的输入参数是以dBm为单位的功率值,例如要设置8dBm,就直接输入HCI_EXT_SetTxPowerDbmCmd(8, 0)。

,

Shuyang Zhong:

Hi Cherry,

HCI_EXT_SetTxPowerDbmCmd API已经添加到最新的CC2340 7.40 SDK中,请知悉,谢谢。

https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/7.40.00.64/exports/docs/ble5stack/ble_user_guide/doxygen/ble/html/group___h_c_i.html#gaa61487d3db72c8628aa9d529e8de1bed

Best regards,

Shuyang

,

Cherry VIP:

有发布这个版本吗?我在CCS里面并没有看到可以更新。

,

Yolande Wang:

Hi cherry,

您可以点击此链接,下载 7.40.00.64 版本 SDK :https://www.ti.com.cn/tool/cn/download/SIMPLELINK-LOWPOWER-F3-SDK

,

Cherry VIP:

似乎关于txpower的 Tx Power Index依然没有更新,如果要使用的话还是只能如上所述的:

例如要设置8dBm,就直接输入HCI_EXT_SetTxPowerDbmCmd(8, 0)。

另外再请问有更新关于RTC的例程吗?

,

Yolande Wang:

您好,

Cherry VIP 说:例如要设置8dBm,就直接输入HCI_EXT_SetTxPowerDbmCmd(8, 0)。

对的

Cherry VIP 说:另外再请问有更新关于RTC的例程吗?

应该是没有的,以 SimpleLink 学院为准:https://dev.ti.com/tirex/explore/node?node=A__AJE8rC9SSzb3kRUd2VMM9w__com.ti.SIMPLELINK_LOWPOWER_F3_SDK__58mgN04__LATEST

,

Cherry VIP:

那我这边需要使用到RTC,该如何进行?

,

Yolande Wang:

您好,

此问题和原帖关联不大,我将在拆分后的帖子进行回复:

https://e2echina.ti.com/support/wireless-connectivity/bluetooth/f/bluetooth-forum/796808/re-cc2340r5-rtc

,

Cherry VIP:

我使用了这个函数后在手机端直接写入失败,然后导致程序跑飞。这样设置似乎不行

,

Cherry VIP:

我试过了。当我使用这个函数之后,程序跑飞了,蓝牙断开并且扫描不到。

,

Yolande Wang:

您好,

参考下面的帖子并检查程序是否存在并发问题、函数调用顺序是否正确等:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1281991/cc2340r5-cc2340-about-hci_ext_settxpowerdbmcmd-function

,

Cherry VIP:

看了这个贴子,他们是在外设初始化的时候进行的修改,而且帖子中也说明了,更改的只是广播功率,并没有更改连接时的功率。而我则是在蓝牙连接后通过服务来对其进行功率修改,也是直接使用函数 HCI_EXT_SetTxPowerDbmCmd(  8,0 );来设置。发现当程序运行该函数时便跑飞了(蓝牙断开连接并且没有广播)。所以在蓝牙连接后无法对其进行修改吗?

,

Yolande Wang:

可以在连接完成后修改 TX 功率。

根据这个帖子问题的描述:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1277443/cc2340r5-cc2340r5-modify-tx-power-at-run-time

首先确认一下您使用的设备是工程版本 (rev A)吗?

如果是这样,需要更换使用 Rev B 版芯片。

现在,在 TI.com 上可以订购的所有 LaunchPad 均配备 B 版芯片。

,

Cherry VIP:

使用的是REV B版本

,

Yolande Wang:

Cherry VIP 说:在蓝牙连接后通过服务来对其进行功率修改,也是直接使用函数 HCI_EXT_SetTxPowerDbmCmd(  8,0 );来设置。发现当程序运行该函数时便跑飞了(蓝牙断开连接并且没有广播)

您是怎么调用的,把代码贴上来,我这边看看能不能复现问题。

,

Cherry VIP:

case ADVERTISING_POWER_CHAR_UUID:if ( offset == 0 ){if ( len != 1 ){status = ATT_ERR_INVALID_VALUE_SIZE;}}else{status = ATT_ERR_ATTR_NOT_LONG;}if ( status == SUCCESS ){uint8 *pCurValue = (uint8 *)pAttr->pValue;if(pValue[0]<= ADVERTISING_POWER_8dB){*pCurValue = pValue[0];switch (*pCurValue){case ADVERTISING_POWER_0dB:Advertising_Power=0;HCI_EXT_SetTxPowerDbmCmd(0,0);break;case ADVERTISING_POWER_1dB:Advertising_Power=1;HCI_EXT_SetTxPowerDbmCmd(1,0);break;case ADVERTISING_POWER_2dB:Advertising_Power=2;HCI_EXT_SetTxPowerDbmCmd(2,0);break;case ADVERTISING_POWER_3dB:Advertising_Power=3;HCI_EXT_SetTxPowerDbmCmd(3,0);break;case ADVERTISING_POWER_4dB:Advertising_Power=4;HCI_EXT_SetTxPowerDbmCmd(4,0);break;case ADVERTISING_POWER_5dB:Advertising_Power=5;HCI_EXT_SetTxPowerDbmCmd(5,0);break;case ADVERTISING_POWER_6dB:Advertising_Power=6;HCI_EXT_SetTxPowerDbmCmd(6,0);break;case ADVERTISING_POWER_7dB:Advertising_Power=7;HCI_EXT_SetTxPowerDbmCmd(7,0);break;case ADVERTISING_POWER_8dB:Advertising_Power=8;HCI_EXT_SetTxPowerDbmCmd(8,0);break;default:Advertising_Power=0;HCI_EXT_SetTxPowerDbmCmd(0,0);break;}if(Last_Advertising_Power!=Advertising_Power){Last_Advertising_Power=Advertising_Power;sysParas.advertisementPower=Advertising_Power;BLEAppUtil_invokeFunction(do_para_save,NULL);}}}

,

Yolande Wang:

我这边复现了此问题。

我将询问一下英文论坛的工程师,请等候。

,

Cherry VIP:

好的,静候佳音

,

Yolande Wang:

好的。

,

Yolande Wang:

您好,

以下是来自E2E的回复:

使用函数HCI_EXT_SetTxPowerDbmCmd设置功率是蓝牙连接后修改功率的正确方法。使用此功能时要确保做的一件事是在启用广播之前添加该功能。您可以查看TI BLE5-Stack API Documentation 以获取有关该命令的更多信息,但我没有分享任何相关的例程描述。 

,

Cherry VIP:

你们复现了此问题,那是如何解决的?

,

Yolande Wang:

在启用广播之前执行此操作,以使其按预期运行。

回复在这个链接,请参阅:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1318205/cc2340r5-after-the-bluetooth-connection-call-the-hci_ext_settxpowerdbmcmd-function-the-bluetooth-connection-is-disconnected-and-does-not-broadcast/5016375#5016375

,

Cherry VIP:

我设置的最大连接数是1,在我连接后,正常情况是已经停止广播了。必须再停止广播然后再开启广播?

,

Yolande Wang:

Cherry VIP 说:我设置的最大连接数是1,在我连接后,正常情况是已经停止广播了。必须再停止广播然后再开启广播?

启用广播之前添加该功能。

您试试添加上停止广播的代码,然后再设置功率,再开启广播。

这样的函数调用顺序应该没问题。

,

Cherry VIP:

我按照这个顺序测试了,发现依然死在这里。另外如果我需要自己的函数一直运行,除了创建任务之外可还有其他办法?

,

Cherry VIP:

但是当我在 Peripheral_start()时修改确实没有死,但是当我在连接后,停止广播,修改功率,开启广播则会死。

,

Yolande Wang:

很抱歉,我这边只能帮您解答函数该在何时调用。

但是您的具体业务场景,建议您到 e2e 询问资深的工程师,这是链接:

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1318205/cc2340r5-after-the-bluetooth-connection-call-the-hci_ext_settxpowerdbmcmd-function-the-bluetooth-connection-is-disconnected-and-does-not-broadcast/5015230?tisearch=e2e-sitesearch&keymatch=%2520user%253A577663#5015230

,

Yolande Wang:

已经向内部团队提出这个问题,看看是否有一个简单的解决方案。

要创建新函数,最简单的实现方法是创建任务。用户指南中的“ Creating Additional ICall Enabled Tasks ”部分以及附加链接的 Tasks 提供了更多详细信息。 

,

Cherry VIP:

请帮我看一下这样调用是否有问题

void SetTxPower( int8_t val )
{
//BLEAppUtil_invokeFunction(do_stop_adv, NULL);BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播switch( val ){case -21:HCI_EXT_SetTxPowerDbmCmd( -21 , 0 );break;case -18:HCI_EXT_SetTxPowerDbmCmd( -18 , 0 );break;case -15:HCI_EXT_SetTxPowerDbmCmd( -15 , 0 );break;case -12:HCI_EXT_SetTxPowerDbmCmd( -12 , 0 );break;case -9:HCI_EXT_SetTxPowerDbmCmd( -9 , 0 );break;case -6:HCI_EXT_SetTxPowerDbmCmd( -6 , 0 );break;case -3:HCI_EXT_SetTxPowerDbmCmd( -3 , 0 );break;case 0:HCI_EXT_SetTxPowerDbmCmd(0 , 0 );break;case 1:HCI_EXT_SetTxPowerDbmCmd(1 , 0 );break;case 2:HCI_EXT_SetTxPowerDbmCmd(2 , 0 );break;case 3:HCI_EXT_SetTxPowerDbmCmd(3 , 0 );break;case 4:HCI_EXT_SetTxPowerDbmCmd(4 , 0 );break;case 5:HCI_EXT_SetTxPowerDbmCmd(5 , 0 );break;default:HCI_EXT_SetTxPowerDbmCmd( 0 , 0 );val = 0;break;}sysParas.txPower = val;//BLEAppUtil_invokeFunction(adv_new_name, NULL);BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1);//开启广播
}

谢谢。

,

Yolande Wang:

代码的调用看起来基本是正确的,如果其他代码有正确的的实现和初始化,这个函数应该能够按照预期工作。

,

Yolande Wang:

可以先写死一个频率试试看这个函数能不能正常用。

void SetTxPower()
{BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播HCI_EXT_SetTxPowerDbmCmd( -21 , 0 );BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1);//开启广播
}

,

Cherry VIP:

这样的话会在调用停止广播时直接不工作

BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播

程序会进入 Icall_abort();

卡在While(j);

/*** Aborts.** This is preferred over C runtime abort() function,* in an external image since the C runtime abort() is only* guaranteed in a root image which contains the C runtime* entry function that is executed upon startup.*/
ICall_Errno
ICall_abort(void)
{
#ifdef HALNODEBUG
#elifdefined(EXT_HAL_ASSERT)HAL_ASSERT(HAL_ASSERT_CAUSE_ICALL_ABORT);
#else{volatile uint8_t j=1;while(j);//一直在这里循环}
#endif /* EXT_HAL_ASSERT */ICALL_HOOK_ABORT_FUNC();return(ICALL_ERRNO_SUCCESS);
}

,

Yolande Wang:

如果是这样的话,至少说明 Stop 函数不能在这个时机用了。

注释掉 Stop 函数,直接跑 setTx 、start 流程试试。

HCI_EXT_SetTxPowerDbmCmd( -21 , 0 ); BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1); //开启广播

,

Cherry VIP:

都是一样的,会进入Icall_abort();

,

Cherry VIP:

不管是直接调用

 BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播

或者直接调用

BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1); //开启广播

都会使程序进入Icall_abort();

只要任务开始跑,调用这些基本的外设都会使程序进入Icall_abort();  比如我开启串口后,收到主机指令关闭串口,如果直接调用UART2_close(uart);也会使程序进入Icall_abort();

,

Yolande Wang:

查看并增加 ICall 启用任务的最大数量,将其设置为所需的任务数量,并观察应用程序是否按预期运行。

另外如果是在自己创建的任务里面调用函数,需要先注册 iCall :https://dev.ti.com/tirex/explore/content/simplelink_lowpower_f3_sdk_7_40_00_64/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/the-application-cc23xx.html#icall-initialization-and-registration

,

Cherry VIP:

我尝试了在syscfg中修改iacll最大任务数量,依然是相同的情况。请问是否有完整的注册任务的例程供参考?

,

Yolande Wang:

参考上个回复中的链接即可,等下我找找看有没有例程。

,

Yolande Wang:

自己创建一个任务调用 BLE API 的话,关键是要调用下面一句

,

Cherry VIP:

我这三个函数都调用了,任务跑不起来,都没有进任务循环。

void *threadFxn0(void *arg0)
{// ******************************************************************// N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp// ******************************************************************// Register the current thread as an ICall dispatcher application// so that the application can send and receive messages.ICall_registerApp(&selfEntity1, &syncEvent1);// Register the current thread as an ICall dispatcher application// so that the application can send and receive messages.
//bleStack_createTasks();for(;;){GPIO_write(CONFIG_GPIO_Red,0);vTaskDelay(500);GPIO_write(CONFIG_GPIO_Red,1);vTaskDelay(500);}
}void *threadFxn1(void *arg0)
{// ******************************************************************// N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp// ******************************************************************// Register the current thread as an ICall dispatcher application// so that the application can send and receive messages.ICall_registerApp(&selfEntity1, &syncEvent1);// Register the current thread as an ICall dispatcher application// so that the application can send and receive messages.
//bleStack_createTasks();for(;;){GPIO_write(CONFIG_GPIO_Green,0);vTaskDelay(500);GPIO_write(CONFIG_GPIO_Green,1);vTaskDelay(500);}
}void *mainThread(void *arg0)
{pthread_t thread0,thread1;pthread_attr_t attrs;struct sched_param priParam;int retc;int detachState;/* Create application threads */pthread_attr_init(&attrs);detachState = PTHREAD_CREATE_DETACHED;/* Set priority and stack size attributes *///设置优先级和堆栈大小属性retc= pthread_attr_setdetachstate(&attrs, detachState);//设置线程分离状态if (retc != 0){/* pthread_attr_setdetachstate() failed */while (1) {}}retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);if (retc != 0){/* pthread_attr_setstacksize() failed */while (1) {}}/* Create threadFxn0 thread */priParam.sched_priority = 0;pthread_attr_setschedparam(&attrs, &priParam);retc = pthread_create(&thread0, &attrs, &threadFxn0, NULL);if (retc != 0){/* pthread_create() failed */while (1) {}}priParam.sched_priority = 1;pthread_attr_setschedparam(&attrs, &priParam);retc = pthread_create(&thread1, &attrs, &threadFxn1, NULL);if (retc != 0){/* pthread_create() failed */while (1) {}}// Register the current thread as an ICall dispatcher application// so that the application can send and receive messages.bleStack_createTasks();return (NULL);
}

这样调用可有问题?

,

Yolande Wang:

正在跟进问题,请等候一下。

,

Yolande Wang:

代码片段中没有明显的问题。您能否提供有关此部分代码添加位置的更多上下文?

此外,您是否尝试过使用 BLEAppUtil_invokeFunction() 命令来尝试调用这些函数并进入任务循环? 

具体请看:https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1318205/cc2340r5-after-the-bluetooth-connection-call-the-hci_ext_settxpowerdbmcmd-function-the-bluetooth-connection-is-disconnected-and-does-not-broadcast/5030109#5030109

赞(0)
未经允许不得转载:TI中文支持网 » CC2340R5: TX Power Index
分享到: 更多 (0)