嗨
我正在为我的应用程序使用DSPS设备模式代码。我的代码的一般目的是改变广告字符串根据我的主机MCU板状态机。有时我看到BLE由于某种原因停止发送广告包。我看到在gapm_cmp_evt_handler()函数中,param->状态是0x43 (GAP_ERR_COMMAND_DISALLOWED),然后它变成0x44 (GAP_ERR_CANCELED)。您能帮我一下吗?获得这些状态的可能原因是什么?您是否认为这可能与我所拥有的广告停止传输有关?
短代码说明:
在我的代码中,当我接收主机MCU的广告修改请求(通过UART)时,对话框MCU发送广告停止请求并等待gapm_cmp_evt_handler函数调用来获得操作标志。一旦到达,它就发送带有广告字符串的新值的广告开始请求(MAJOR字符串中的字节变化),并等待gapm_cmp_evt_handler调用来获得操作标志。
谢谢
关键词:
设备:
嗨asalhuv,
我想控件上执行更改时,会发生此事件广告的字符串。广告字符串通过有效性检查时,它的时间被传输到空中,也许你提供给580的字符串不是一个有效的(一个奇怪的标志或类似的东西),这会导致你的设备不发布广告。或者,您发布和发布命令而没有取消前一个命令。
由于MT_dialog
嗨,谢谢你的答案,
关于第一种选择:
它是不是应该发送GAP_ERR_ADV_DATA_INVALID如果广告字符串是错误的?
我将检查不停止广告选项。
还有一件事:我假设GAP_ERR_CANCELED消息是在我调用advertise停止函数后发送的,对吗?
谢谢
阿米尔
嗨asalhuv,
是的,在一个无效的数据字符串中,您应该得到一个GAP_ERR_ADV_DATA_INVALID。是的,首先你取消了广告过程然后你得到GAP_ERR_CANCELED消息。
由于MT_dialog
好吧谢谢
我还有最后一个问题。如果一切顺利,并发生以下步骤:
1.我已经取消了带有停止广告功能的广告
2.从内核获得GAP_ERR_CANCELED(在param->状态寄存器中)
3.然后调用start advertise函数并修改advertise字符串
4.我的问题-什么是内核响应应该在param->状态寄存器之后?
再次感谢
嗨asalhuv,
你的意思是当广告开始时内核发送的消息是什么?发送GAPM_START_ADVERTISE_CMD后,您不会从内核获得任何消息,操作将继续(除非是定向发布),直到您停止发布(使用GAPM_CMP_EVT响应)或接收到连接请求(GAPC_CONNECTION_rEQ_IND)。请查看RW_BLE_GAP_IS.pdf以获得更多信息。
Thansk MT_dialog
你好,谢谢你的回答。以我为例,一段时间后(可能是10分钟到24小时),广告由于某种原因停止了。我看到了这样的情况:
1.我的主机MCU发送一个新的广告修改请求(我可以随时触发它)。
2.我得到请求并调用stop_adv()函数,然后在gapm_cmp_evt_handler()函数中得到param->status==GAP_ERR_CANCELED。
3.在我获得这个状态之后,我调用adv_start()函数并修改advertise字符串,然后gapm_cmp_evt_handler()函数不会被调用。
随着我们的转换,我认为这是正确的程序,但我仍然没有看到任何广告包在我的BLE扫描应用程序。你能想到什么可以帮助我调试/解决这个问题吗?
谢谢
阿米尔
嗨asalhuv,
更改广告字符串的过程是正确的:
1)启动广告 - 发出GAPM_START_ADVERTES_CMD并继续广告,直到您决定停止
2)停止发布-发布一个GAPM_CANCEL_CMD
3)接收到广告已经停止的GAPM_CMP_EVT
4)改变广告线,再次开始广告。
我假设当您取消广告时,您会得到gapm_cmp_evt_handler(),而不是GAP_ERR_CANCELED,您得到的是gap_err_command_disabled。尝试连接到智能片段工具,并检查您的设备肯定没有广告(没有rx, tx活动),当重新启动广告不工作,你也可以检查您的设备的状态,当这个事件发生。我试图修改的DSPS项目,以便得到GAP_ERR_COMMAND_DISALLOWED,似乎当我连接到设备时,我得到了这个错误,我试图开始发布,但一旦我断开连接,设备就能够再次发布。
由于MT_dialog
嗨
我会尝试,但是我检查了一下,我得到了你在上面4个步骤中描述的准确过程。我没有得到gap_err_command_disabled。我将尝试使用智能片段工具,但我仍然很高兴知道是否有另一个标志或任何其他指示,为RF开始广告。目前我需要定期重置,但批量生产的解决方案不会持续。
谢谢
嗨asalhuv,
考虑到你的第一个帖子,我认为你的问题是,你得到了GAP_ERR_COMMAND_DISALLOWED当你试图重新发布而不是GAPM_CANCEL_CMD和你的设备只是停止广告。你可以使用arch_last_rwble_evt_get()来获取设备经过的最后一个BLE事件。请检查app_sleep.h文件中的app_asynch_trm()函数中的信标参考设计。它使用这个函数来计算广告事件。
由于MT_dialog
嗨
我确实跟踪了rwble_last_event中的最后一个状态,它似乎是ok的:它得到一些0x02 (BLE_EVT_RX)和0x03 (BLE_EVT_RX),直到我得到0x04 (BLE_EVT_END)。我假设(根据信标项目),BLE_EVT_TX和后来的BLE_EVT_END意味着这个1计数的广告。但还是过了一段时间,我没有看到包裹在空中。我有一些建议也许能帮到你
1.我不使用任何外部振荡器-我取消了两个睡眠与CFG_EXT_SLEEP和CFG_DEEP_SLEEP的#undef
2.我取消了SW和HW UART流量控制(没有足够的引脚)
3.我使用开发调试
再次感谢你的帮助,我真的很感激
嗨asalhuv,
你提到的要点不应该影响580的广告程序,它不应该停止广告。您能否通过使用计时器来发布广告停止,广告启动和修改字符串,而不是通过外部MCU发送命令以隔离问题。也许MCU以某种方式影响你的系统,并以某种方式向Hault Activity的原因产生影响。此外,如果通过跟踪BLE_EVT_END作为BEACON SCIPPET检查BLE Activity是否存在BLE Activity,并且当没有活动发出启动通告命令时,是执行的命令,或者您必须重置堆栈,以便您的设备启动广告?
由于MT_dialog
你好,很抱歉我没有理解你的最后一句话(带有BLE_EVT_END),你能再解释一下吗?当我做调试时,BLE_EVT_END是一个临时状态,在它到达断点后,它再次与状态RX或TX。如果它提到的状态是TX,是不是应该是广告已经肯定发生了?即使我解决了这个问题,我希望能够知道BLE是否发射。
嗨asalhuv,
广告发生时按照以下顺序函数应该返回美国TX / RX / TX / RX / TX / RX / BLE_END_EVT(这是一个广告事件的循环——它将返回其他州觉醒以来但是你不感兴趣,CSNT_EVT和SLP等等),所以每一个成功的广告活动都应该以BLE_END_EVT结束。在我之前的文章中我提到过,你可以通过保留最后一个和当前的BLE事件来跟踪广告流程的整个周期。如果你的设备状态没有改变到上述状态,也没有完成上述循环,你就可以知道你的设备没有进行广告。如果你想追踪TX,你也可以追踪它,因为它只是在一个渠道上做广告,而不是在一个完整的广告运作中。
由于MT_dialog
你好,谢谢你的回答。我试着看看原始代码会发生什么:我使用了版本DSPS 3.150.2,有以下改变:
1.#undef CFG_EXT_SLEEP (was #define)
2.#undef CFG_UART_HW_FLOW_CTRL (was #define)
我正在通过UART端口上传FW, CRC正常。该单位开始传输,但一段时间后,它停止相同的我的固件版本。
正如我之前提到的,我没有使用外部振荡器,在我的设置中,我有几个单元,大约8个单元,它们之间的距离是~30cm,每个单元内部有ZigBee发射器(距离BLE模块约5 CM),偶尔发送数据。也许这能帮到你帮到我。
谢谢
嗨asalhuv,
当你说你不使用外部振荡器时,你的意思是,你不使用任何外部振荡器,甚至不使用XTAL16 ?XTAL16对于580是强制的,因为数据表表明,当您处于buck模式时,只能省略XTAL32外部振荡器,在boost模式下,XTAL32也是强制的。很抱歉没有注意到您在第11期之前的指示。
由于MT_dialog
嗨
我使用Murata模块与您的嵌入式芯片(类型ZY),包括XTAL16。我认为DSPS 3.0.8在加载环境下有一些问题:
当我周末在家里测试时(只有一个模块)一切正常,它持续传输了3天。当我在工作中开始测试时(我们有很多BLE模块{至少30},ZigBee发射器和WIFI),广告一段时间后就停止了,即使是我在之前的文章中描述的参考FW。
我尝试了SDK 5的DSPS(你发布的新版本),现在看起来更好,但我将知道只有在周日,我将再次检查它。
也许我值得看看这个问题,我会在周日再次更新。