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.
关于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_DBM LL_EXT_TX_POWER_MINUS_20_DBM //!< -20 dBm #define HCI_EXT_TX_POWER_MINUS_18_DBM LL_EXT_TX_POWER_MINUS_18_DBM //!< -18 dBm #define HCI_EXT_TX_POWER_MINUS_15_DBM LL_EXT_TX_POWER_MINUS_15_DBM //!< -15 dBm #define HCI_EXT_TX_POWER_MINUS_12_DBM LL_EXT_TX_POWER_MINUS_12_DBM //!< -12 dBm #define HCI_EXT_TX_POWER_MINUS_10_DBM LL_EXT_TX_POWER_MINUS_10_DBM //!< -10 dBm #define HCI_EXT_TX_POWER_MINUS_9_DBM LL_EXT_TX_POWER_MINUS_9_DBM //!< -9 dBm #define HCI_EXT_TX_POWER_MINUS_6_DBM LL_EXT_TX_POWER_MINUS_6_DBM //!< -6 dBm #define HCI_EXT_TX_POWER_MINUS_5_DBM LL_EXT_TX_POWER_MINUS_5_DBM //!< -5 dBm #define HCI_EXT_TX_POWER_MINUS_3_DBM LL_EXT_TX_POWER_MINUS_3_DBM //!< -3 dBm #define HCI_EXT_TX_POWER_0_DBM LL_EXT_TX_POWER_0_DBM //!< 0 dBm #define HCI_EXT_TX_POWER_1_DBM LL_EXT_TX_POWER_1_DBM //!< 1 dBm #define HCI_EXT_TX_POWER_2_DBM LL_EXT_TX_POWER_2_DBM //!< 2 dBm #define HCI_EXT_TX_POWER_3_DBM LL_EXT_TX_POWER_3_DBM //!< 3 dBm #define HCI_EXT_TX_POWER_4_DBM LL_EXT_TX_POWER_4_DBM //!< 4 dBm #define HCI_EXT_TX_POWER_5_DBM LL_EXT_TX_POWER_5_DBM //!< 5 dBm #if defined( CC13X2P ) || defined( CC33xx ) #define HCI_EXT_TX_POWER_P2_14_DBM_P4_6_DBM LL_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_DBM LL_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_DBM LL_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_DBM LL_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_DBM LL_EXT_TX_POWER_P2_18_DBM_P4_10_DBM //!< P2: 18 dBm P4: 10 dBm #define HCI_EXT_TX_POWER_P2_19_DBM LL_EXT_TX_POWER_P2_19_DBM //!< P2: 19 dBm #define HCI_EXT_TX_POWER_P2_20_DBM LL_EXT_TX_POWER_P2_20_DBM //!< P2: 20 dBm #endif // CC13X2P || CC33xx #else // CC254x #define HCI_EXT_TX_POWER_MINUS_23_DBM LL_EXT_TX_POWER_MINUS_23_DBM //!< -23 dBm #define HCI_EXT_TX_POWER_MINUS_6_DBM LL_EXT_TX_POWER_MINUS_6_DBM //!< -6 dBm #define HCI_EXT_TX_POWER_0_DBM LL_EXT_TX_POWER_0_DBM //!< 0 dBm #define HCI_EXT_TX_POWER_4_DBM LL_EXT_TX_POWER_4_DBM //!< 4 dBm #endif // CC26XX/CC13XX #endif //CC23X0 /** @} End TX_Power_Index */
根据这个,发现在CC2340中有extern hciStatus_t HCI_EXT_SetTxPowerDbmCmd( int8 txPower, uint8 fraction );
但是参数依然是跟图中是一样的,并且链接中并没有这个API函数,
最后一张图可以看出对于CC2340这些都是不可用状态,需要自己修改?
您好,
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)。
Hi Cherry,
HCI_EXT_SetTxPowerDbmCmd API已经添加到最新的CC2340 7.40 SDK中,请知悉,谢谢。
Best regards,
Shuyang
Hi cherry,
您可以点击此链接,下载 7.40.00.64 版本 SDK :https://www.ti.com.cn/tool/cn/download/SIMPLELINK-LOWPOWER-F3-SDK
似乎关于txpower的 Tx Power Index依然没有更新,如果要使用的话还是只能如上所述的:
例如要设置8dBm,就直接输入HCI_EXT_SetTxPowerDbmCmd(8, 0)。
另外再请问有更新关于RTC的例程吗?
您好,
例如要设置8dBm,就直接输入HCI_EXT_SetTxPowerDbmCmd(8, 0)。
对的
另外再请问有更新关于RTC的例程吗?
应该是没有的,以 SimpleLink 学院为准:https://dev.ti.com/tirex/explore/node?node=A__AJE8rC9SSzb3kRUd2VMM9w__com.ti.SIMPLELINK_LOWPOWER_F3_SDK__58mgN04__LATEST
看了这个贴子,他们是在外设初始化的时候进行的修改,而且帖子中也说明了,更改的只是广播功率,并没有更改连接时的功率。而我则是在蓝牙连接后通过服务来对其进行功率修改,也是直接使用函数 HCI_EXT_SetTxPowerDbmCmd( 8,0 );来设置。发现当程序运行该函数时便跑飞了(蓝牙断开连接并且没有广播)。所以在蓝牙连接后无法对其进行修改吗?
可以在连接完成后修改 TX 功率。
首先确认一下您使用的设备是工程版本 (rev A)吗?
如果是这样,需要更换使用 Rev B 版芯片。
现在,在 TI.com 上可以订购的所有 LaunchPad 均配备 B 版芯片。
在蓝牙连接后通过服务来对其进行功率修改,也是直接使用函数 HCI_EXT_SetTxPowerDbmCmd( 8,0 );来设置。发现当程序运行该函数时便跑飞了(蓝牙断开连接并且没有广播)
您是怎么调用的,把代码贴上来,我这边看看能不能复现问题。
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); } } }
您好,
以下是来自E2E的回复:
使用函数HCI_EXT_SetTxPowerDbmCmd设置功率是蓝牙连接后修改功率的正确方法。使用此功能时要确保做的一件事是在启用广播之前添加该功能。您可以查看TI BLE5-Stack API Documentation 以获取有关该命令的更多信息,但我没有分享任何相关的例程描述。
我设置的最大连接数是1,在我连接后,正常情况是已经停止广播了。必须再停止广播然后再开启广播?
启用广播之前添加该功能。
您试试添加上停止广播的代码,然后再设置功率,再开启广播。
这样的函数调用顺序应该没问题。
已经向内部团队提出这个问题,看看是否有一个简单的解决方案。
要创建新函数,最简单的实现方法是创建任务。用户指南中的“ Creating Additional ICall Enabled Tasks ”部分以及附加链接的 Tasks 提供了更多详细信息。
请帮我看一下这样调用是否有问题
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); //开启广播 }
谢谢。
可以先写死一个频率试试看这个函数能不能正常用。
void SetTxPower( ) { BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播 HCI_EXT_SetTxPowerDbmCmd( -21 , 0 ); BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1); //开启广播 }
这样的话会在调用停止广播时直接不工作
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 #elif defined(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); }
如果是这样的话,至少说明 Stop 函数不能在这个时机用了。
注释掉 Stop 函数,直接跑 setTx 、start 流程试试。
HCI_EXT_SetTxPowerDbmCmd( -21 , 0 );
BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1); //开启广播
不管是直接调用
BLEAppUtil_advStop(peripheralAdvHandle_1);//停止广播
或者直接调用
BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1); //开启广播
都会使程序进入Icall_abort();
只要任务开始跑,调用这些基本的外设都会使程序进入Icall_abort(); 比如我开启串口后,收到主机指令关闭串口,如果直接调用UART2_close(uart);也会使程序进入Icall_abort();
查看并增加 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
我这三个函数都调用了,任务跑不起来,都没有进任务循环。
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); }
这样调用可有问题?
代码片段中没有明显的问题。您能否提供有关此部分代码添加位置的更多上下文?
此外,您是否尝试过使用 BLEAppUtil_invokeFunction() 命令来尝试调用这些函数并进入任务循环?