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-Q1:如何使用连接监视器示例

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1339763/cc2340r5-q1-how-to-use-the-connection-monitor-example

器件型号:CC2340R5-Q1
主题中讨论的其他器件: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?

此致、

普雷斯顿

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

    您好,普雷斯顿,

    我将向您介绍 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

    此致!
    阿赫尤特·雷

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

    您好、Ray

    如您所述、当前仅在 CC26x2器件系列上实施。 我使用了两个 CC2340 (包括另一个连接到手机的 CC2340)、它可以正常工作吗?

    否则、支持 cc2340的代码稍后会更新吗?

    此外、我们还有一个项目需要使用 cc2340来监控其他器件(非 TI 器件)。 这可行吗?

    此致、

    普雷斯顿

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

    您好,普雷斯顿,

    请允许我澄清一下。 现在、连接监视器(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 ()。

    是这样吗?

    此致、

    普雷斯顿

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

    您好,普雷斯顿,

    从理论上讲、这应该起作用。 但是、我建议对协调器和 CM 之间传输的数据进行双重检查、以确保传输正确的数据和所有必需的数据。

    此致、
    阿赫尤特·雷

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

    您好、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(用于连接的手机扫描协调器)

    我不知道我的流程是否有任何问题、请帮助我确认

    此致、

    普雷斯顿

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

    您好,普雷斯顿,

    CM_CONN_EVT_COMPLETE_EVT 会触发 MicroCmApp_monitorCompleteEvt ()函数,您可以在该函数中读取正确的 RSSI。 我对您有关获取 RSSI 的问题有一点不确定。 您是否已经通过 MicroCmApp_monitorCompleteEvt ()函数获得了它?

    此致!
    阿赫尤特·雷

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

    您好、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。

    此致!
    阿赫尤特·雷

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

    您好、Ray

    连接监视器当前设置为 PowerCC23X0_doWFI、串行端口接收到的数据不完整。 我尝试将其更改为待机政策、这与协调人是一致的。 更改后串口没有数据、逻辑是否有异常

    按照您的说明、是否可以向我的连接监视器驱动器添加类似的逻辑(MREADY 引脚)、以便它正确接收串行数据? 这个逻辑是如何修改的以及您是否有参考代码?

    此致、

    普雷斯顿

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

    您好,普雷斯顿,

    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、则会导致手机进入睡眠状态后扫描错过目标)。

    此致、

    普雷斯顿