嗨
我正在使用DSP设备模式代码进行应用程序。我的代码的一般目的是根据我的主机MCU板状态机更改广告字符串。有时我看到BLE从某种原因停止传输广告数据包。我看到,在GAPM_CMP_EVT_HANDLER()函数中,参数 - >状态为0x43(GAP_ERR_COMMAND_DISALLED),然后更改为0x44(GAP_ERR_CANCELED)。您可以帮助获取这些状态的可能原因,以及如果您认为它可能与我所拥有的广告停止传输有关吗?
短代码说明:
在我的代码中,当我收到主机MCU的广告修改请求时(通过UART)对话框MCU发送通告停止请求并等待GAPM_CMP_EVT_HANDLER函数调用以获取操作标志。一旦到达,它会使用通告字符串的新值发送通告启动请求(主要字符串中的字节上的更改)并等待GAPM_CMP_EVT_HANDLER调用以获取操作标志。
谢谢
关键词:
设备:
嗨Asalhuv,
我想在执行更改时发生此事件广告的字符串。广告字符串通过有效性检查它在空中传输时间,也许是您对580馈送的字符串不是一个有效的字符串(一个奇怪的标志或类似的东西),这会导致您的设备不到广告。或者您正在发出和广告命令,而不取消前一个。
由于MT_dialog
嗨,谢谢你的答案,
关于第1个选项:
如果广告字符串错误,它是否认为发送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.然后我称之为启动函数并修改了广告字符串
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()函数并修改通告字符串,然后不调用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_disallow。尝试连接智能代码段工具并检查您的设备是否肯定是在重新启动广告不起作用时肯定的(没有RX,TX活动),您可以在发生此事件时检查设备的状态。我试图修改DSP项目以获得GAP_ERR_COMMAND_DISALLED,当我连接到设备时,我似乎正在收到此错误,我尝试开始通告,但一旦我断开连接,设备就可以再次通告。
由于MT_dialog
嗨
我会尝试,但我检查一下,我得到了上面4步中描述的确切程序。我没有得到gap_err_command_disogped。我会尝试使用智能片段工具,但我仍然很高兴知道是否有另一个标志或任何其他指示,对于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的两个睡眠
我取消了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)
我上传FW通过UART端口,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天。当我开始在工作中进行测试时,即将发出3天(我们有许多BLE模块{至少30},ZigBee发射器和WiFi),广告后一段时间停止,即使是参考FW,因为我在早期帖子中描述。
我尝试了SDK 5的DSP(你发表的新一个),现在看起来更好,但我会肯定只在星期天时才知道我再次检查一下。
也许我值得检查这个问题,我会在星期天再次更新。