主题中讨论的其他器件: SysConfig
你好。
我是 Rushikesh。
我使用的是 CC2340R5和 SDK 7.20。
例如、我要在突发模式下广播数据、我要在每次广播之间广播5次、延迟小于10ms、然后进入待机状态10秒。
并重复该周期。
请指导我如何实现此目标。
谢谢。此致、
Rushikesh。
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.
尊敬的 Rushikesh:
根据蓝牙规范、最小广播间隔为20ms。 您可以通过同时启用多个广播集来解决此限制。
为了启用第二个(或更多)广播集、请在 SysConfig 中创建一个新的广播集(这将生成良性警告)、并确保对其进行初始化(BLEAppUtil_initAdvSet)并启用它(BLEAppUtil_advStart / BLEAppUtil_advStop)、正如在 app_peripheral.c 文件中为现有广播完成的那样。
可以使用传递给 BLEAppUtil_advStart 的结构 Util_Adv 中的"durationOrMaxEvents "字段设置有限的广告。
我希望这将有所帮助、
此致、
您好、Clement、
我已经这么做了、可以在进入待机状态30秒之前广播7次。
但是、我目前正在使用 GPIO 中断进行广播。 即、我仅在发生 GPIO 中断时广播。
为此、当中断生成时、我的当前代码可以很好地用于单次广播。
但是、我希望在使用中断代码进入待机状态之前逐个通告7个设置。
请建议如何实现此目标。 我已经尝试 在 syscfg 中添加广播集,并使用 broadcaster Handle_1 和 broadcaster StartAdvSet1 来初始化和启动它们;如下所示:但它不起作用,因为我的代码进入了 iCall_abort (void)函数。
/*For SET 2*/
status = BLEAppUtil_initAdvSet(&broadcasterAdvHandle_2, &broadcasterInitAdvSet2);
if(status != SUCCESS)
{
// Return status value
return(status);
}
status = BLEAppUtil_advStart(broadcasterAdvHandle_2, &broadcasterStartAdvSet2);
if(status != SUCCESS)
{
// Return status value
return(status);
}
以下是我用于该中断的代码。
1)中断配置:
void mainThread(void)
{
/* Configure GPIO pin */
GPIO_setConfig(CONFIG_GPIO_EXT_WAKEUP, GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_FALLING); //Since, low & high value interrupts are not available for Low Power F3 devices
// GPIO_setConfig(CONFIG_GPIO_EXT_WAKEUP, GPIO_CFG_IN_INT_FALLING);
/* Install GPIO Interrupt callback */
GPIO_setCallback(CONFIG_GPIO_EXT_WAKEUP, gpioButtonFxn0);
/* Enable interrupts */
GPIO_enableInt(CONFIG_GPIO_EXT_WAKEUP);
}
2)回叫:
/*Interrupt Callback*/
void gpioButtonFxn0(uint8_t index)
{
BLEAppUtil_invokeFunctionNoData(enableAdvertising);
}
3)启用广播:
void enableAdvertising()
{
bStatus_t status;
/*Set 1*/
BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
/*Don't free anything since we're going to use the same buffer to re-load*/
status = GapAdv_prepareLoadByBuffer(advData1, FALSE);
if (status == SUCCESS) /* Only update the data when return is successful*/
{
SensorMeasure(); /*Read sensor value from i2c*/
uint8_t ADV_DATA2_LEN = sizeof(advData1); /* Reload buffer to handle*/
GapAdv_loadByBuffer(ADV_DATA2_LEN, advData1);
}
}
4)在 app_broadaster.c 中禁用 void Broadcaster_Adv 中的广播(Uint32事件,BLEAppUtil_msgHdr_t *pMsgData)
switch(event)
{
case BLEAPPUTIL_ADV_START_AFTER_ENABLE:
{
MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Started - handle: "
MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
advData->pBuf->advHandle);
break;
}
case BLEAPPUTIL_ADV_END_AFTER_DISABLE:
{
MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Ended - handle: "
MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
advData->pBuf->advHandle);
break;
}
case BLEAPPUTIL_ADV_END:
{
MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv just ssent: - handle: "
MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle);
// Disable advertisement
BLEAppUtil_advStop(broadcasterAdvHandle_1);
break;
}5)
BLEAppUtil_EventHandler_t broadcasterAdvHandler =
{
.handlerType = BLEAPPUTIL_GAP_ADV_TYPE,
.pEventHandler = Broadcaster_AdvEventHandler,
.eventMask = BLEAPPUTIL_ADV_START_AFTER_ENABLE |
BLEAPPUTIL_ADV_END_AFTER_DISABLE | BLEAPPUTIL_ADV_END
};
如果有任何问题、请告诉我。
此致、
Rushikesh。
尊敬的 Rushikesh:
我不确定您为什么需要7个广播集、但您遇到的问题似乎是由广播集的配置引起的。 确保您已将第二个广播集准确配置为第一个广播集、而不会丢失扫描响应或任何其他元素。 此外、请确保传播 asterInitAdvSet1/broadcasterInitAdvSet2和广播 asterStartAdvSet1/broadcasterStartAdvSet2的结构正确。
希望这将有所帮助,
此致、
您好、Clement、
我来解释一下、
我有一个传感器连接到 BLE CC2340R5、该传感器定期发送中断(10秒)以将 BLE 从待机状态唤醒。
此外、通过 I2C 将数据"x"发送到 BLE。
现在在 BLE 端、我要通告此数据"x" 7次、然后将 BLE 置于待机状态、直到下一个中断发生(10秒之后)。
请查看下面的电流波形、以便您更好地了解我希望广播是如何发生的。
这在中断代码中不起作用。
因此,我想了解更多关于广告的这种方式。
希望您理解了。
此致、
Rushikesh。
尊敬的 Rushikesh:
-考虑使用参数 advSetStartParamsSet_1.enableOptions 和 advSetStartParamsSet_1.durationOrMaxEvents 来控制在禁用广播集之前传输广播集的次数
-查看您的函数 enableAdvertising 的内容。 除其他外:调用 BLEAppUtil_advStart 后不应修改广播数据。 我建议编写 enableAdvertising 函数的方式是:
GapAdv_prepareLoadByBuffer API 不应与 BLEAppUtil API 混合使用,因为二者会影响相同的数据并可能产生冲突。
我希望这将有所帮助、
此致、
您好、Clement、
我将遵循您在此处提到的相同代码流程。
它无法正常工作。
在调用 GapAdv_prepareLoadByBuffer (advData1、false)后;函数它会进入
(iCall_directAPI (ICALL_SERVICE_CLASS_BLE、(uint32_t) IDX_GapAdv_prepareLoadByBuffer、##_VA_args_)
和
进入 iCall_abort ();函数的 while 循环。
是否因为我调用 GapAdv_prepareLoadByBuffer (advData1、false)而发生超时错误; 以及 GapAdv_loadByBuffer (ADV_DATA2_LEN、advData1); 多次?
使用这些 API 以便多次广播相同数据的确切条件或方法是什么?
此致、
Rushikesh。
您好!
在下面的建议中、
[/报价]
- 读取传感器数据
- 更新 advData1的内容
- 调用 BLEAppUtil_advStart
我建议直接修改 advData1的内容。 不应使用 GapAdv_prepareLoadByBuffer / GapAdv_loadByBuffer。
此致、
您好、Clement、
这适用于单个广播。
但是、我想广播7次、但没有按预期运行。
我将调用 BLEAppUtil_advStart (broadcasterAdvHandle_1、&broadcasterStartAdvSet1);函数
在中断回调函数中执行7次。 但它只广播一次。
此外、我还尝试 在同一回调中调用在 syscfg 中配置的4个不同的设置。
void enableAdvertising()
{
SensorMeasure(); /*Read sensor value from i2c*/
BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1);
BLEAppUtil_advStart(broadcasterAdvHandle_2, &broadcasterStartAdvSet2);
BLEAppUtil_advStart(broadcasterAdvHandle_3, &broadcasterStartAdvSet3);
BLEAppUtil_advStart(broadcasterAdvHandle_4, &broadcasterStartAdvSet4);
}
但这也不起作用。
此致、
Rushikesh。
您好!
它不是我想使用7个广告集我只是想广告 相同的数据7次。 [/报价]然后、让我们重点讨论一下只有一个广播集。
确保满足以下条件:
-在打开广告之前设置数据
-状态成功由 BLEAppUtil_advStart 报告
- BLEAppUtil_advStart 在启用了 iCall 的任务上下文中进行调用
-如果广播不起作用、请检查程序是否崩溃并收集调试信息
请检查上面所附波形的图像是否相同。下面引用的波形是否是您所指的波形? 您现在得到的结果是什么?
![]()
此致、
[/quote]
您好、Clement、
在开启广播之前设置数据。
如果我通告单组、我会获得状态成功。 (当多个广播设置时、状态未成功。)
3.BLEAppUtil_advStart 在启用 iCall 的任务上下文中进行调用。
我不明白。 您能举个例子吗?
4.对于单集,广告工作正常。 但对于多个集合,它会进入 Call_Abort ();
是的、这些波形是我应该在中断代码内广播时得到的波形。
现在、我将尝试多次生成中断、而不是多次调用单个集。 但这会消耗更多的功耗、也会增加 BLE 和传感器的运行时间。
此致、
Rushikesh。
您好!
3.BLEAppUtil_advStart 在启用 iCall 的任务上下文中进行调用。
我不明白。 您能举个例子吗?
[/报价]但这似乎是正确的、因为单个广播正在工作
4.对于单集,广告效果不错。 但对于多个集合,它会进入 Call_Abort ();正如您之前提到的、您似乎只需要一个广告集。 所以我建议暂时不要把重点放在这一点上。
如果需要更多支持、请告诉我。
此致、
[/quote]