你好,
我有麻烦在设置扩展睡眠模式(没有OPT拷贝)。我们正在使用定制的14586板。
在arch_main.c中,在程序int main(void)(第139行)中
如果我替换sleep_mode=rwip_power_down();(第176行)睡眠模式=激活模式;它每秒钟连续传输一次数据,没有问题。
但是如果我离开sleep_mode = rwip_power_down(),数据包就不会得到更新。初始化后,数据包更新一次,然后每一秒发送一次相同的数据包。
Adv_data_update_timer_cb是使用APP_Adv_data_update_TO计划的,未更改,保留为100
CFG_MAX_SLEEP_DURATION_PERIODIC_WAKEUP_MS为500。
.intv_min和.intv_max的尝试值687.5和3000
应用程序默认睡眠模式设置为ARCH\u EXT\u sleep\u ON
所有的arch_set_extended_sleep调用都带有参数false (arch_set_extended_sleep(false))。
app_easy_gap_non_connectable_advertise_start ();使用。
SysCLK改为16MHz。
定时器0和systick用于设置MNF_数据的某些值。
我有两个问题,
1) 数据包没有得到更新
2)从智能片段的当前关卡和开发板的测试点6来看,我不认为它会进入睡眠模式。(在CRO上,基极电压为100mv,发射时为400mV。
能帮我个忙吗?我从你的ble_app_sleepmode开始了这个项目,并修改以适应我们的需要。
谢谢你
设备:
嗨anushiya,
为了在没有OTP镜像的情况下将DA14586设置为扩展睡眠模式,您只需将user_config.h中的app_default_sleep_mode变量设置为ARCH_EXT_sleep_ON。您不应该修改ARCH_main.c文件,因为它是与SDK相关的文件。在SDK的ble_app_sleepmode示例中,设备会广播定义的时间量APP_ADV_DATA_UPDATE_TO的默认值为30秒。当设备处于广告状态时,其睡眠模式设置为带OTP copy的延长睡眠(当系统在开发调试模式下运行时模拟OTP副本)。在上述超时过期后,如果设备未进入连接状态,则停止播发,因此执行应用程序的adv_data_update_timer_cb()将停止播发。这意味着制造商特定的数据将不会更新,设备将进入扩展睡眠模式,等待外部事件退出睡眠状态。用户可以通过按下按钮唤醒设备。按下按钮后,设备将在预定义的时间内再次开始播发。当设备进入conn时选中状态,则睡眠模式将变为无OTP复制的延长睡眠。因此,如果您想更新制造商特定的数据,应在用户_app_adv_start()中设置第二个计时器。有关DA14585/6产品系列中睡眠模式的更多信息,请阅读教程4:睡眠模式电流测量.
谢谢,下午好
谢谢你的及时回复。我不想要一个连接状态,我想滥用系统无限期地每x秒传输一个数据包。
>你不应该修改arch_main.c文件,因为它是SDK相关文件。
我没有改变任何东西。为了使它连续传输,我临时替换sleep_mode = rwip_power_down();(第176行)使用sleep_mode = mode_active的arch_main.c,并确认它连续传输。
user_config.h中的> app_default_sleep_mode变量变为ARCH_EXT_SLEEP_ON
我已经做到了
>在SDK的ble_app_sleepmode示例中,设备发布一个定义的时间量APP_ADV_DATA_UPDATE_TO,默认值为30秒。当设备处于发布状态时,它的睡眠模式被设置为带有OTP拷贝的扩展睡眠(OTP拷贝在系统以DEVELOPMENT_DEBUG模式运行时被模拟)。在上述超时过期后,如果设备没有进入连接状态,则停止发布,因此执行app_easy_gap_advertise_stop()的adv_data_update_timer_cb()。这意味着制造商特定的数据将不会更新,设备将进入扩展睡眠模式,等待外部事件退出睡眠状态。
我已经评论了adv_data_update_timer_cb()中的app_easy_gap_advertise_stop(),并替换为app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);并将APP_ADV_DATA_UPDATE_TO设置为100
(这就是为什么当我在arch_main.c中更改sleep_mode = mode_active时,它会无限传输)
我不想要一个连接的状态,想要无限期地传输一个数据包在x秒
>用户按下按钮即可唤醒设备。按下按钮后,设备将开始在预定的时间内再次发布广告。当设备进入连接状态时,睡眠模式变为无OTP拷贝的扩展睡眠。因此,如果您想更新特定于制造商的数据,您应该在user_app_adv_start()中设置第二个计时器。
我希望这个设备永远不要按下按钮。此外,设备将永远不会进入连接状态。我希望该设备在特定的时间间隔内传输一个paket,并进入无OTP拷贝的长睡眠状态。这就是为什么我改变了app_easy_gap_undirectional_advision_start();作为应用程序_easy_gap_non_connectable_Advertised_start();
而且所有的arch_set_extended_sleep调用都是使用参数false(arch_set_extended_sleep(false))调用的。最初的例子是arch_set_延长了睡眠时间(真)
>有关DA14585/6产品系列中睡眠模式的更多信息,请阅读教程4:睡眠模式电流测量.
这就是我用的。我尝试了两种方法。1)使用智能片段将代码放入flash中,这样JTAG就不需要连接。2)在Keil_5中按下调试,让程序运行,然后退出调试。两次的正确值都保持在高位。
非常感谢你的帮助。
请注意,我可以发送完整的项目设置,如果我可以上传一个更大的文件,或者如果你特别想看到某个文件,我可以上传它。
嗨anushiya,
谢谢你的详细反馈。
您使用的是哪个SDK版本?我使用的是最新版本的SDK6.0。10.我可以找到sleep_mode = rwip_power_down();在arch_main.c文件的第195行。在while(1)循环中,如果您将rwip_power_down()替换为mode_active,那么设备似乎永远不会进入睡眠模式。
您可以将设备配置为广播或使用非连接广告。当一个设备充当广播器时,这意味着它只能支持非连接广告。请按照以下步骤将您的设备配置为广播设备。我在SDK6.0.10的ble_app_sleepmode示例中完成了这些步骤
如果你发现任何有用的答案,请标记为“接受”。
谢谢,下午好
谢谢你的帮助。你的建议帮助我将设备设置为广播模式。但仍然存在以下两个问题。
1) mnf_data_update()仍然未被调用,并且
2) smartsnippets显示0.5mA,在传输期间出现峰值(删除调试模式),这意味着未调用睡眠模式。
(使用示波器,通过主板上的测试点匹配smartsnippets值)
我使用的是SDK 6.0.4.326。
我定义user_app_adv_non_connectable_complete(uint8_t)为
空白user_app_adv_non_connectable_complete (uint8_t状态)
{
//I查看状态,计划下一个传输数据包
app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);
}
where APP_ADV_DATA_UPDATE_TO = 3000 -这应该不会对广播有任何影响吗
所有arch_set_extended_sleep调用都带有参数“false”,表示无OTP编程
app_default_sleep_mode = ARCH_EXT_SLEEP_ON
嗨anushiya,
我想让你知道SDK6.0.4是一个非常老的版本,它目前不受支持。为此,我强烈建议您下载并使用DA14585/6产品系列的最新版本SDK,即SDK6.0.10。SDK6.0.10的ble_app_sleep模式示例用于我为您提供的步骤,以便将您的in设备设置为广播模式。每次非连接的发布完成时都会触发user_app_adv_non_connectable_complete()。因此,您在这个函数中设置了一个计时器,当计时器到期时,将执行adv_data_update_timer_cb。在SDK的ble_app_sleepmode示例中,请遵循将设备配置为广播模式的指导方针。我建议你只做我提供给你的修改不可连接的广告将停止每个APP_ADV_DATA_UPDATE_TO,并触发adv_data_update_timer_cb()。检查user_app_adv_start()。计时器一到期,飞机上的制造商具体数据就会更新,广告将停止,设备将进入延长睡眠模式。 The manufacture data are stored into the retention RAM, so when the chip wakes up with the button pressing, the adverting date will be updated. If you want to update the manufacturer data while the device is adverting, you should set up a second timer. So you will have a timer to stop adverting and a second timer to update the manufactured specific data.
谢谢,下午好
谢谢。我将升级到6.0.10
>因此,当按下按钮唤醒芯片时,广告日期将被更新。
我想要一个周期性的叫醒,而不是按按钮叫醒。没有来自外部世界的互动。
>如果你想在设备发布时更新制造商数据,你应该设置第二个定时器。所以你将有一个定时器停止广告和第二个定时器更新制造的具体数据。
我不需要这个。醒来,传送,更新,睡眠对我来说很好。
在完整的函数中,如果我像我提到的那样安排它可以吗?
谢谢你!
你好,
我下载了SDK 6.0.10.511,并做了你建议的更改。
空白user_app_on_adv_nonconn_complete (uint8_t状态)
{
//安排下一个广告数据更新
app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);
}
空白user_app_on_adv_nonconn_complete (uint8_t状态);
.app_on_adv_nonn_complete=NULL,
作为
.app\u on\u adv\u noncn\u complete=用户app\u adv\u noncn\u complete,
(类似于SDK6.0.4.326)
案件GAPM_取消:
{
如果(param - >状态! = GAP_ERR-NO-ERROR)
{
ASSERT_ERROR (0);
}
...
}
所以我不得不在app_easy_gap_advision_stop()上加上注释;在静态void adv_data_update_timer_cb()中
然后它就一直在传输。但还是同样的问题。
1) MNF_DATA没有更新,意味着原始数据的最后两个字节暂时为0000,更新一次到0100,然后保持不变。
[{“时间戳”:“2019 - 06 - 13 t07:14:09z”、“类型”:“未知”,“mac”:“80 eaca700005”、“bleName”:“”,“rssi”:-39年,“rawData”:“03030”a1811072f2a93a6bdd84152ac0b10992ec6feed05ffcdab0100}]
2) 电流消耗为2.5mA(见附图)
嗨anushiya,
让我检查一下,我会尽快给你回复。
谢谢,下午好
请问有什么最新消息吗?
请在一个干净的SDK ble_app_sleepmode示例中尝试以下步骤。
如果你想有非连接广告,你应该做以下事情:
1.修改user_app_adv_start()以发布不可连接的包
2在user_callback_config.h中,将user_app_adv_undirective_从移动到complete。应用程序打开,无方向完成。应用程序已完成
在此之后,广告数据的适当数据,应该每APP_ADV_DATA_UPDATE_TO秒更新1。
谢谢,下午好
感谢您的回复。尝试此操作后,MNF_数据将得到更新。但是smartsnippets仍然说消耗2.5mA(Keil环境在下载代码后关闭)。这不意味着它不会进入睡眠模式。我在上一条消息中附加了相同的波形。
嗨anushiya,
如果你觉得前面的答案有用,请标记为“接受”。
请说明您为测量睡眠电流而遵循的步骤>注意,设备在广告间隔之间进入睡眠模式。
谢谢,下午好
在您提供的解决方案中,我有一个问题:
在步骤2中,您请求在user_callback_config.h中移动user_app_adv_undirect_complete。app_on_adv_undirect_complete。app_on_adv_nonconn_complete。
需要采取的行动。app_on_adv_undirect_complete和。App_on_adv_nonconn_complete将是不同的,不是吗?我有
内部用户应用程序高级不可连接功能完成并分配给。app_on_adv_noncn_complete=用户_app_adv_non_connectable_complete并将其从最后一行删除
但这并没有奏效。我能知道为什么吗?
关于测量电流,我用了两种方法。
1) 使用smartsnippets和混合连接(JTAG和com端口)。(使用booter下载代码后,我也尝试从开发板上移除JTAG跳线)。正确的电流为0.5mA(峰值电流为5mA,平均电流为0.5mA)
2)使用测试点TP6和相应的跳线连接激活放大器(期望电流过小)。示波器上的测量值是智能片段中接收值的100倍。
如果代码将DA14586置于睡眠模式,我希望电流在uA范围内。
我下载了6.0.10.511的新版本,提取了代码,只更改了上面提到的3项。
嗨anushiya,
的。app_on_adv_undirect_complete和。App_on_adv_nonconn_complete是两个完全不同的回调函数,它取决于你正在使用的广告过程。
然而,如果你停止广告程序,两者都将被执行
在您的情况下,您正在使用不可连接的广告,因此如果您向BLE发送停止命令,则将执行app_on_adv_nonn_complete。
步骤3是静态void adv_data_update_timer_cb()。你能解释一下这行不通是什么意思吗?请指出静态无效adv_data_update_timer_cb()是否被触发?
需要注意的是,如果你不停止广告,设备将永远不会进入永久休眠,但它会在广告间歇进入休眠状态。为了测量睡眠模式电流,强烈建议不要使用SmartSnippets工具箱。请查看本教程教程4:睡眠模式电流测量为了检验如何测量睡眠电流。
谢谢,下午好
嗨,很抱歉耽误了回来。我仍然困惑不解,试图恢复理智。
>这个。应用程序在非直接应用程序上,并完成。app_on_adv_nonn_complete是两个完全不同的回调函数,它取决于您使用的广告过程。
这也是我的问题。当它们是完全不同的两种功能时,你让我……在user_callback_config.h中,将user_app_adv_undirect_complete从。app_on_adv_undirect_complete。app_on_adv_nonconn_complete"当像那样移动和替换"user_app_adv_undirect_complete"与NULL我有一些问题。现在我两者都有了。”app_on_adv_undirect_complete。App_on_adv_nonconn_complete "与"user_app_adv_undirect_complete"一起工作。但是当我用一行创建“user_app_adv_non_connectable_complete”时,它不起作用。
但如果我把它作为最后一行
它的工作原理。
我主要担心的是,它似乎仍然没有休眠之间的传输。
>请注意,如果您不停止广告,设备将永远不会进入永久睡眠状态,但它将在广告间隔期间进入睡眠状态。
是,设备从启动时开始持续发送(广播)。所以我想让它在广告间隙进入休眠状态。
为了测量电流,我使用“UM-B-049 DA1458x Getting started with Development Kit - pro_v1 .pdf”第29页的技术,而不是教程教程4:睡眠模式电流测量因为我需要在运行样本代码“ble_app_sleepmode”时测量14586子板的当前消耗,并使用相同的样本代码“ble_app_sleepmode”来测量自定义板的当前消耗。
目前两者在CRO中测量250mV,其解释为2.5mA。(前附图片)。SmartSnippets工具箱功率分析器也可测量2.5mA。
在进行测量时,我关闭了Keil开发环境。(从本线程开始,情况就是这样)
现在我已经更改为SDK 6.0.10.511
谢谢你的帮助
您好,我注意到,当我将子板与DA14586一起使用时,如果我没有将默认的目标选择ble_app_sleepmode_585更改为ble_app_sleepmode_586,则电流消耗会高得多。如果目标选择是ble_app_sleepmode_586,则示波器上的电流测量基准地板为20mV,并且当连接a时在跨接接头J1之间串联的M表显示约4uA休眠模式电流和小于1mA的传输电流。
因此,我只剩下一个问题:建议采取什么行动?”App_on_adv_nonconn_complete "而不是仅仅复制相同的函数"。app_on_adv_undirect_complete”
嗨anushiya,
你能告诉我你最后是怎么配置你的设备的吗?你把它设置为外围模式使用非连接广告还是你把它设置为广播模式?
关于你的第二个问题,是的,你应该为DA14586设备构建一个项目,flash是与适当的二进制图像,只要你使用这个芯片。
谢谢,下午好
>你能说明你最后是如何配置你的设备的吗?你把它设置为外围模式使用非连接广告还是你把它设置为广播模式?
使用不可连接的广告。(我正在将我们的代码从6.0.4.326中的ble_app_示例移动到新的SDK 6.0.10.511 ble_app_睡眠模式示例中。我们的主板有一个外部RAM(因为我们也在从DA14585切换到DA14586,并且CS配置为高)。希望这是正确的方法。
你说的“外围模式”是什么意思?我是不是错过了什么场景?上面我接受的答案有3个步骤,我在ble_app_sleepmode例子中做了它们。
正如我在2019-07-02 09:43星期二问的那样,我仍然不明白为什么“.app_on adv_non_complete”和“.app_on adv_unddirective_complete”被要求指向同一件事,建议采取什么行动“.app_on adv_non_complete”而不是复制与“.app_on adv_unddirective_complete”相同的功能在user\u callback\u config.h中的“user\u app\u adv\u undirect\u complete”?
嗨anushiya,
当不可连接的广告完成时,将触发.app_on_adv_nonn_complete回调。但是,在无向广告完成后,将触发.app_on_adv_unddirect_complete。在.app_on_adv_nonn_complete中,当使用不可连接的广告时,您应该放置自己想要执行的回调。例如,如果停止广告,设备进入永久睡眠模式,则可以使用以下功能:
空白user_app_non_conn_complete (uint8_t状态)
{
//禁用BLE和计时器事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。
如果(状态==间隙错误已取消)
{
拱门可外接唤醒开启();
//配置唤醒按钮
app_button_enable ();
}
}
谢谢,下午好
>在.app_on_adv_nonn_complete中,当使用不可连接的广告时,您应该放置自己想要执行的回调。
我完全同意。这就是为什么我在以下问题之前问:
我有
内部用户应用程序高级不可连接功能完成并分配给。app_on_adv_noncn_complete=用户_app_adv_non_connectable_complete并将其从最后一行删除
但这并没有奏效。我能知道为什么吗?
嗨anushiya,
很抱歉耽搁了。因为你停止了不可连接的广告并且你配置了。App_on_adv_nonconn_complete = user_app_adv_non_connectable_complete,则应该触发user_app_adv_non_connectable_complete。你能不能在调试模式下运行代码,并试着在设备停止广告后找到代码去了哪里?触发了哪个函数?
谢谢,下午好