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