主题中讨论的其他器件:CC2340R5
您好
我目前正在使用的 SDK 为 simplelink_lowpower_f3_SDK_7_40_00_64、工程为 basic_ble_LP_EM_CC2340R5_freertos_ticlang。
我需要使用 CC2340Q5-R1 来监控 CC2340Q5-R1和我的手机之间的通信链路、以获取 RSSI。
如何使用(CC2340Q5-R1CONNECTION_MONITOR)例程实现侦听 CC2340Q5-R1?
此致、
普雷斯顿
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.
您好
我目前正在使用的 SDK 为 simplelink_lowpower_f3_SDK_7_40_00_64、工程为 basic_ble_LP_EM_CC2340R5_freertos_ticlang。
我需要使用 CC2340Q5-R1 来监控 CC2340Q5-R1和我的手机之间的通信链路、以获取 RSSI。
如何使用(CC2340Q5-R1CONNECTION_MONITOR)例程实现侦听 CC2340Q5-R1?
此致、
普雷斯顿
您好,普雷斯顿,
我将向您介绍 RTLS 工具箱。 RTLS 协调器当前仅在 CC26x2器件系列上实施、可与 CC2340器件一起使用以建立工作连接监控演示。 在这种情况下、手机可以连接到 CC26X2 (现在称为协调器)、而 CC2340器件可以是连接监视器。 在这里、协调器在与手机形成连接后、与连接监视器(CC2340)共享重要的连接参数。 诸如连接 ID、访问地址、通道映射(以及连接过程中发生的任何通道映射更新)等信息。
使用 TI 演示时、您会注意到协调器和连接监控器之间的通信是通过 NPI 层实现的、通过 UART 实现。 为了帮助您构建将 CC2340器件同时用于协调器和连接监视器的实施方案、我想向您推荐一个软件示例、该示例展示了协调器的实施案例、尽管 CC26x2器件上采用了该器件。 您可以使用类似的逻辑构建代码、并更接近实现所需的目标。 请参阅以下学院课程、其中介绍了 RTLS 协调器是什么以及它为何对于连接监控器很重要:
https://dev.ti.com/tirex/explore/node?node=A__AQ0TYkLXd7cPWtNUtMqjSw__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST
此致!
阿赫尤特·雷
您好,普雷斯顿,
请允许我澄清一下。 现在、连接监视器(CM)软件需要某种形式的 NPI 通信、其中向 CM 提供了连接参数。在 TI 提供的软件示例中、由一个称为 RTLS 协调器的示例完成。 此协调器示例仅适用于 CC26X2器件系列。 是否将为 CC2340R5器件提供协调器示例、我需要进行检查。 毫无疑问、可以使用两个 CC2340R5器件来构建您自己的 CM 示例。 我指着你 CC26X2的协调器示例、以供您用作参考、从而帮助您了解如何在 CC2340上实现协调器。
有关您是否可以使用 CC2340监视与非 TI 器件的连接的第二个问题、毫无疑问、这也是可行的。 我建议您查看 CC2340的 CM 示例和 CC26x2的协调器示例、以便您更好地了解 CM 的工作原理以及如何使其实现与其他设备的互操作。
此致!
阿赫尤特·雷
您好、Ray
我正在使用 CC2340和 CC2652进行调试。
根据我的初步研究,我相信 cc2652通过串行端口将连接参数传输到 cc2340,然后 CC2340开始通过 ubCM_startNewSession()进行扫描以获得 RSSI。
这是否意味着我可以从 basic_ble 的 app_connection.c 中获取连接参数? 在 BLEAPPUTIL_LINK_SEATED_EVENT 的处理程序代码中使用 HCI_EXT_GetActiveConnInfoCmd ()。
是这样吗?
此致、
普雷斯顿
您好、Ray
现在、我使用 cc2652连接到手机(使用 basic_ble)并在建立连接后将连接参数发送到 CM (cc2340)。
CC2340接收到数据后、通过串行端口的回调函数发送自定义事件
void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status) { MicroCmApp_enqueueAppMsg(MICRO_CM_APP_UART_EVT, buffer); }
在 CM 收到事件后、我启动一个连接监视器。
static void MicroCmApp_processMicroCmAppMsg(uint8_t *pMsg) { microCmAppEvt_t *pEvt = (microCmAppEvt_t *)pMsg; volatile uint32_t keyHwi; switch(pEvt->event) { case MICRO_CM_APP_RTLS_CTRL_EVT: { MicroCmApp_processRtlsCtrlMsg((uint8_t *)pEvt->pData); } break; case MICRO_CM_APP_CM_EVT: { MicroCmApp_processCmMsg((uint8_t *)pEvt->pData); } break; case MICRO_CM_APP_UART_EVT: { MicroCmApp_cmStartReq((uint8_t *)pEvt->pData); } break; default: break; } keyHwi = Hwi_disable(); free(pEvt->pData); Hwi_restore(keyHwi); }
然后、如何获得 RSSI?
我的理解是、每次检测到连接事件时都会生成 CM_CONN_EVT_COMPLETE_EVT。
然后转到 MicroCmApp_monitorCompleteEvt()函数,其中可以获取 connInfo.rsiPeripheral(用于连接的手机扫描协调器)
我不知道我的流程是否有任何问题、请帮助我确认
此致、
普雷斯顿
您好、Ray
已经阐明了在 MicroCmApp_monitorCompleteEvt()中获取 RSSI 的问题,扫描连接事件时生成 CM_CONN_EVT_COMPLETE_EVT。
当前串行传输出现问题、如 连接监视器与 UART 驱动程序冲突中所述。
我使用所连接显示器的串行端口驱动程序来接收参数。 在禁用节能后如何重复读取 NPITLUART_readTransport ()。 NPITLUART_readTransport ()只在初始化期间调用, NPITLUART_readCallBack 在读取串行端口时如何处理数据。 您能帮助说明一下逻辑吗? 我不太明白。
此致、
普雷斯顿
您好、Ray
我今天正在调试、并意识到串行端口接收缺少一些数据。
我进行了以下尝试、通过 CC2652上的串行输出将参数连接到串行模块、 并按以下方式在计算机上打印数据:FE 1C 00 59 02 00 C8 CD C8 29 04 18 00 08 FA 00 1B 00 F8 F3 1F 98 FE B6 00 F3 C4 AE CB 4A 54 DE
然后、CC2340的 RX 连接到 CC2652的 TX、CC2340的 TX 通过串行模块连接到计算机。 CC2340读取数据、然后通过串行端口写入数据、输出如下:FE 1C 00 59 02 00 C8 CD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
这是发送数据部分的代码
static void RTLSCoordinator_processRTLSConnInfo(uint16_t connHandle) { hciActiveConnInfo_t connInfo; linkDBInfo_t addrInfo; bleConnInfo_t rtlsConnInfo = {0}; // Get BD Address of the requested Responder linkDB_GetInfo(connHandle, &addrInfo); memcpy(rtlsConnInfo.addr, addrInfo.addr, B_ADDR_LEN); // Get current active connection information HCI_EXT_GetActiveConnInfoCmd(connHandle, &connInfo); BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : RTLSConnInfo hopValue=%d, currChan=%d\n", connInfo.hopValue, connInfo.nextChan); rtlsConnInfo.connHandle = connHandle; rtlsConnInfo.accessAddr = connInfo.accessAddr; rtlsConnInfo.connRole = addrInfo.connRole; rtlsConnInfo.connInterval = connInfo.connInterval; rtlsConnInfo.currChan = connInfo.nextChan; rtlsConnInfo.hopValue = connInfo.hopValue; rtlsConnInfo.cSCA = connInfo.mSCA; rtlsConnInfo.crcInit = BUILD_UINT32(connInfo.crcInit[0], connInfo.crcInit[1], connInfo.crcInit[2], 0); memcpy(rtlsConnInfo.chanMap, connInfo.chanMap, LL_NUM_BYTES_FOR_CHAN_MAP); RTLSCtrl_connInfoEvt((uint8_t*)&rtlsConnInfo, sizeof(bleConnInfo_t)); }
我在回调函数开始时读取缓冲器的内容
void NPITLUART_readCallBack(UART2_Handle handle, void *ptr, size_t size, void *userArg, int_fast16_t status) { #if (NPI_FLOW_CTRL == 0) uint16_t packetSize; uint16_t sofIndex; #endif // NPI_FLOW_CTRL = 0 _npiCSKey_t key; key = NPIUtil_EnterCS(); UART2_write(handle, ptr, size, NULL); if (size) { if (size != NPITLUART_readIsrBuf(size)) { // Buffer overflow imminent. Cancel read and pass to higher layers // for handling #if (NPI_FLOW_CTRL == 1) RxActive = FALSE; #endif // NPI_FLOW_CTRL = 1 } }
为什么数据丢失、或者我是在错误的时间读取的?
此外、我在回调函数的末尾输出读取部分的 isrRxBuf、结果全为零
此致、
普雷斯顿
您好,普雷斯顿,
NPI 的工作方式是 MCU 等待 MREADY 引脚改变状态。 发生这种情况时,在 GPIO 事件的回调中,我们调用 readTransport ()。 这样一来、即使启用了待机功能、GPIO 事件也会唤醒 MCU、然后发生 readTransport。 禁用待机功能后、我建议为协调器添加类似的逻辑。 其中 MREADY 引脚改变了状态 、这在连接监控器 MCU 上生成了一个中断、反过来、应该允许您在正确的时间调用 readTransport。
此致!
阿赫尤特·雷
您好,普雷斯顿,
NPI MREADY 引脚的逻辑已经可以在 NPI 文件夹/驱动程序中找到、您可以通过 CC26X2协调器项目访问该文件夹/驱动程序。 我提到这一点的原因是、已经实现了 NPI 的写入传输功能。 您可以为器件编程类似的逻辑。 我还建议检查"主"器件实际发送了多少数据。 是否正在发送完整的数据、从而使 CC2340错过了正在发送的数据?
最后、我想更好地了解您为什么要将 CC2340同时用于连接监控器和协调器? 为什么 CC26X2不适合您的应用?
此致!
阿赫尤特·雷
您好、Ray
我已经测试了通过串口转 USB 模块连接到计算机的主设备、显示的数据是正常的。 如 上所述,计算机接收的数据为:FE 1C 00 59 02 00 C8 CD C8 29 04 18 00 08 FA 00 1B 00 F8 F3 1F 98 FE B6 00 F3 C4 AE CB 4A 54 DE
我认为这可能是因为我禁用了待机功能,而读取使用 readCallback ()函数,该函数在完成接收数据之前返回。 我认为我需要像您所说的那样使用 MREADY 引脚检测。 另外、当 NPI_FLOW_CTRL=1时、我也看到了采用同样逻辑的 MONITOR 演示。 但 MREADY 引脚配置为 IOID_UNUSED。
const NPI_Params NPI_defaultParams = { .stackSize = 1024, .bufSize = 530, .mrdyGpioIndex = 0/*IOID_UNUSED*/, .srdyGpioIndex = 0/*IOID_UNUSED*/, #if defined(NPI_USE_UART) .portType = NPI_SERIAL_TYPE_UART, .portBoardID = 0, /* CC2650_UART0 */ #elif defined(NPI_USE_SPI) .portType = NPI_SERIAL_TYPE_SPI, #if (defined(CC2650DK_5XD) || defined(CC2650DK_4XS )) && !defined(TI_DRIVERS_DISPLAY_INCLUDED) .portBoardID = 0, /* CC2650_SPI0, conflicts with SRF06 display so both can't be enabled */ #elif (defined(CC2650DK_7ID) || defined(CC2650_LAUNCHXL) || \ defined(CC2640R2_LAUNCHXL) || defined(CC26X2R1_LAUNCHXL) || defined(CC2652RB_LAUNCHXL) || \ defined(CC13X2R1_LAUNCHXL) || (defined (CC13X2P1_LAUNCHXL) || defined (CC13X2P_2_LAUNCHXL) || defined (CC13X2P_4_LAUNCHXL) || \ defined (CC2652PSIP_LP) || defined (CC2652RSIP_LP)) || defined (CC2652R7_LP) || defined (CC1352P7_1_LP) || \ defined (CC1352P7_4_LP)) || defined (CC2651P3_LP) || defined (CC2651R3_LP) .portBoardID = 1, /* CC2650_SPI1 */ #elif (defined(CC2650DK_5XD) || defined(CC2650DK_4XS)) && defined(TI_DRIVERS_DISPLAY_INCLUDED) #error "WARNING! CC2650_SPI0, is used to drive the SmartRF06 display. Cannot use SPI0 if display is enabled." #endif #endif };
cc2340使用哪个引脚? 我没有在 MCU 数据表中看到对其进行说明。
最后、由于我们项目的硬件选择是 cc2340、因此我们需要在 cc2340上运行连接监视器以获取 RSSI (如果我们扫描手机的蓝牙广播以获取 RSSI、则会导致手机进入睡眠状态后扫描错过目标)。
此致、
普雷斯顿