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.

[参考译文] CC2640R2L:定时器异常。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1134675/cc2640r2l-timer-exception

器件型号:CC2640R2L

大家好、

以下是客户的请求:

他希望使用两个计时器来实现广播切换的功能。  触发计时器 A 事件时切换自定义广播包、触发计时器 B 事件时切换标准广播包、 并循环30秒。

但是、当第一个广播包被切换时、时序异常、其它触发事件也异常 、例如串行端口和按钮。

发生了什么以及 如何修复。

代码如下图所示:

#define SP_ADV_SOS_EVT_PERIOD                300
advInt = 160


Util_constructClock(&advsos, SimplePeripheral_clockHandler,
                      SP_ADV_SOS_EVT_PERIOD, 0, false, (UArg)&argadvsos);
                      
Util_constructClock(&advupade, SimplePeripheral_clockHandler,
                      advInt * 0.625, 0, false, (UArg)&argadvupade);


static void adv_init()
{
    //Method 1
    if (sos_state == 1)
        memcpy(updateAdvData, advertDataNew, sizeof(advertDataNew));
    else if(sos_state == 0)
        memcpy(updateAdvData, advertData, sizeof(advertData));

    bStatus_t status = FAILURE;

    status = GapAdv_prepareLoadByHandle(advHandleLegacy,GAP_ADV_FREE_OPTION_ADV_DATA);
    SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

    // Load advertising data for set #1 that is statically allocated by the app
    status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_ADV,
                                 sizeof(updateAdvData), updateAdvData);
    SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);


    //Method 2
/*
        GapAdv_params_t advParamLegacy;

        advParamLegacy.eventProps = GAP_ADV_PROP_CONNECTABLE | GAP_ADV_PROP_SCANNABLE | GAP_ADV_PROP_LEGACY;
        advParamLegacy.primIntMin = advInt;
        advParamLegacy.primIntMax = advInt;
        advParamLegacy.primChanMap = GAP_ADV_CHAN_ALL;
        advParamLegacy.peerAddrType = PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID;
        //memcpy(advParamLegacy.peerAddr, pPkt->devAddr, B_ADDR_LEN);
        advParamLegacy.filterPolicy = GAP_ADV_WL_POLICY_ANY_REQ;
        advParamLegacy.primPhy = GAP_ADV_PRIM_PHY_1_MBPS;
        advParamLegacy.secPhy  = GAP_ADV_SEC_PHY_1_MBPS;
        advParamLegacy.sid     = 0;

        // Create Advertisement set #1 and assign handle
        status = GapAdv_create(&SimplePeripheral_advCallback, &advParamLegacy,
                               &advHandleLegacy);
        SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

        // Load advertising data for set #1 that is statically allocated by the app
        status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_ADV,
                                     sizeof(updateAdvData), updateAdvData);
        SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

        // Load scan response data for set #1 that is statically allocated by the app
        status = GapAdv_loadByHandle(advHandleLegacy, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                     sizeof(scanRspData), scanRspData);
        SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

        // Set event mask for set #1
        status = GapAdv_setEventMask(advHandleLegacy,
                                     GAP_ADV_EVT_MASK_START_AFTER_ENABLE |
                                     GAP_ADV_EVT_MASK_END_AFTER_DISABLE |
                                     GAP_ADV_EVT_MASK_SET_TERMINATED);

    // Enable legacy advertising for set #1
    status = GapAdv_enable(advHandleLegacy, GAP_ADV_ENABLE_OPTIONS_USE_MAX, 0);

    SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
*/
}

static void SimplePeripheral_processAppMsg(spEvt_t *pMsg)
{
  bool dealloc = TRUE;

  switch (pMsg->event)
  {
    ...
    case SP_ADV_SOS_EVT:
        sos_start_handler();
        break;

    case SP_ADV_UPDATE_EVT:
        adv_start_handler();
        break;

    default:
      // Do nothing.
      break;
  }
}

static void sos_start_handler(void)
{
    flag_status.adv_clock_ticks++;
    Util_startClock(&advsos);
    if (flag_status.adv_clock_ticks == 50)
    {
        Uart0_Write("Stop\r\n", 6);
        flag_status.adv_clock_ticks = 0;
        GapAdv_disable(advHandleLegacy);
        sos_state = 0;
        adv_init();
        Util_stopClock(&advsos);
        Util_stopClock(&advupade);
    }
    else
    {
        Uart0_Write("sos\r\n", 5);
        sos_state = 1;
        adv_init();        
    }
}

static void adv_start_handler(void)
{
    Uart0_Write("adv\r\n", 5);
    Util_startClock(&advupade);
    sos_state = 0;
    adv_init();
}

您可以帮助检查此案例吗? 谢谢。

此致、                                                        

Nick

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

    您好、Nick、

    多次"创建"广播集似乎不正确。 我建议函数"GapAdv_create()"只调用一次、并且仅更新 用户指南中提到的广播数据。

    客户还应考虑使用两个广告集来实现这一点。 在这种情况下、每个广播集将根据计时器启用/禁用。

    我希望这将有所帮助、

    此致、