你好
我正在使用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消息,对吧?
谢谢
阿米尔
嗨Asalhuv,
是的,在无效的数据字符串中,您应该得到一个gap_err_adv_data_invalid。是的,首先取消广告过程,然后获取Gap_err_Canceled消息。
谢谢mt_dialog.
好,谢谢
我有一个最后一个问题。如果一切顺为确定,就会出现这些步骤:
1.我已经取消了停止宣传功能的广告
2.从内核获取GAP_ERR_CANCELED(在PARAM->状态寄存器中)
3.然后我称之为启动函数并修改了广告字符串
4.我的问题 - 之后应该在Param->状态登记中的内核响应是什么?
再次感谢
嗨Asalhuv,
您的意思是内核在广告启动时发送的消息是什么?发送GAPM_START_ADVERTESE_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,
考虑到你的第一篇文章,我认为你的问题是你在尝试重新打造而不是GapM_Cancel_cmd和你的设备刚刚停止广告时,你正在获得Gap_err_command_disogped。您可以使用ARCH_LAST_RWBLE_EVT_GET()以获取您的设备通过的最后一个BLE事件。请在app_sleep.h文件中查看app_asynch_trm()函数中的信标参考设计。它使用此功能来计算广告事件。
谢谢mt_dialog.
你好
我确实在rwble_last_event中追踪了最后一个状态,似乎可以获得几个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,它不是假设是肯定发生的广告吗?即使我解决了这个问题,我也希望能够知道是否发送或不发送。
嗨Asalhuv,
当广告发生时,函数应该以下列顺序返回状态Tx / Rx / Tx / Rx / Tx / Rx / BLE_END_EVT(这是广告事件的周期 - 它将返回其他州,因为您的觉醒对此不感兴趣,CSNT_EVT和SLP等)因此每个成功的广告活动应该以BLE_END_EVT结尾。在我上一篇文章中,我提到通过保持最后一个和当前的BLE事件来跟踪广告过程的完整周期。如果您的设备状态无更改为上述状态,则无法完成上述循环,您将能够知道您的设备不是广告。通过跟踪只有TX只是在一个频道中进行广告而不是完整的广告操作,您也可以跟踪,如果您想要。
谢谢mt_dialog.
嗨,谢谢你的答案。我试图看看原始代码发生的事情:我使用Version DSPS 3.150.2使用此更改:
1. #undef cfg_ext_sleep(是#define)
2. #undef cfg_uart_hw_flow_ctrl(是#define)
我上传FW通过UART端口,CRC还可以。单位开始传输但过一段时间后,它会停止与我的固件版本相同。
正如我之前提到的,我不使用外部振荡器,在我的设置中,我几个单元约为8个单位,它们之间的距离为约30cm,在每个单元内部有ZigBee发射器(距离BLE模块约5厘米)偶尔传输数据。也许这会帮助你帮助我。
谢谢
嗨Asalhuv,
当你说你不使用外部振荡器时,你不使用任何外部静脉器,甚至不是xtal16?对于580,XTAL16是强制性的,因为数据表指示您只能在降压模式下省略XTAL32外部振荡器时,XTAL32也是强制性的。对不起,没有注意到早些时候的第11篇帖子中的指示。
谢谢mt_dialog.
你好
我使用Murata模块与您的嵌入式芯片(类型ZY),包括XTAL16。我认为DSPS 3.0.8在加载环境下有一些问题:
当我在周末(只有一个模块)在我家中在我的房子里测试它一切都好,它一直在运行3天。当我开始在工作中进行测试时,即将发出3天(我们有许多BLE模块{至少30},ZigBee发射器和WiFi),广告后一段时间停止,即使是参考FW,因为我在早期帖子中描述。
我尝试了SDK 5的DSP(你发表的新一个),现在看起来更好,但我会肯定只在星期天时才知道我再次检查一下。
也许我值得检查这个问题,我会在星期天再次更新。