你好,
我们正在构建一个音频流应用,其中中心将压缩音频发送到外围设备。
在外围设备上,我们有一个外部音频处理器,可切换GPIO线,每8毫秒中断DA14580。作为响应,DA14580通过I2C将71个字节的数据流流到处理器。I2C数据传输是中断驱动的。外围设备不传输到中心。请注意,我们的外设以升压模式运行。
当未启用睡眠时,这按照预期工作。
当我们启用延期睡眠时(使用外围设备始终唤醒),每个唤醒一次执行BLE_WAKEUP_LP_HANDLER中的以下等待循环。
while(getBits32(ble_cntl2_reg,wakuplpstat)||!getbits32(ble_intstat_reg,slpintstat))
如果(t)休息;
此循环以及后续BLE_SLP_HANDLER似乎只需5毫秒即可完成。较低的优先级中断,任何GPIO或I2C ISR都被关机,直到唤醒完成。这会使数据流分为处理器。
实际上,I2C传输足够快,即我可以抓住数据传输的开始,直到唤醒完成。剩下的问题是唤醒可以启动,而I2C传输在飞行中会因此破坏流程。
我可以在等待循环中手动服务GPIO和I2C任务。我能够为I2C,连接参数等的特定参数进行工作,但它似乎并不强大。显然,这种方法可以延迟唤醒过程,我不确定可以有什么效果。
作为替代方案,我想调查等待循环是否可以从BLE_WAKEUP_LP_HANDLER中提出并在主循环中执行 - 例如在APP_SLEEP_EXIT_PROC()中。这应该允许GPIO和I2C中断执行并仍然保持主循环直到唤醒完成的时间。但是,这似乎没有工作。
欢迎大家提出意见。
提前致谢,
sand
---------- -
设备:
嗨Sandeep Sira,
我理解你的问题,但是你想要做的事情是我们无法遵守它将工作的东西,低于5ms的时间,你看到的时间是xtal需要解决的时间,如果中断任何这些功能你会错过BLE活动的机会。我可以推荐的是,自从你有外围设备,不能拯救你那么多的力量,所以我建议你在有音频处理的同时保持漏洞。
谢谢mt_dialog.
嗨mt_dialog,
感谢您的及时回应。
在执行唤醒等待之前,等待任何正在进行的I2C事务进行解决方法。只要交易短于比说3毫秒,我应该没问题,对吧?自GPIO中断被关押以来,无法启动进一步的事务。
您能将我指出对外围功耗的分析吗?我们的音频处理器是sub 1 ma @ 1.5 v所以一切都很重要。
谢谢,
sand
---------- -
嗨Sandeep,
醒来时,您应该避免延迟LP处理程序的执行。XTAL16M应尽快启用。然后LP等待循环等待,以便被解除,并且代码立即跳转到SLP。重要的是不要将LP延迟到SLP转换。如果在等待LP的同时启动I2C事务以取消断言并且在去断言之前完成事务,则应确定,但您无法停止执行LP的执行3ms,以便为I2C事务进行I2C事务完成,然后执行LP,也不会将LP延迟到SLP转换。如果您这样做,那么您将面临BLE连接的问题。
We would also propose to try and measure on your application the time that the 580 is able to go sleep (with GPIOs) and check if it’s worth the additional complexity, as well as if the penalty from the sleep/wake-up procedure give you any actual power benefit when going into sleep. If the time of sleeping isn't that long perhaps you should reconsider the sleeping scheme and keep your 580 always awake while streaming.
这与您正在使用的连接间隔依赖于您使用的连接间隔应该很小,以避免延迟。
我们希望我们没有误解您的系统配置,我们并没有以任何方式误导您。
谢谢mt_dialog.
嗨mt_dialog,
再次感谢您的回复。实际上,你已经理解了我们的情况,并且你的观察是有用的,非常有意义,而且与我的预期非常重要。
我已经使用GPIO线条告诉我关于睡眠事件,但也许你可以建议我应该假设我应该从睡眠中退出的确切位置(从电力绘图的角度来看)。
是在指令之后的ble_wakeup_lp_lp_handler的点
setbits16(clk_radio_reg,ble_enable,1);// BLE时钟启用
(pmu_ctrl_reg,radio_sleep,0);// 充电!注意:系统必须在启动Radio_PD时为16MHz运行。
或者应该在完成BLE_SLP_Handler后?
我假设教学后的无线电睡眠
setbits16(pmu_ctrl_reg,radio_sleep,1);
在main()。
我正在尝试在各种情况下测量实际的当前绘制,但这需要一些时间。
谢谢,
sand
---------- -
嗨Sandeep,
您可以将其放在主循环之前在WFI()之前关闭WFI()之前的外设和LP处理程序中,在外围初始化之后。
谢谢mt_dialog.
谢谢你的帮助。
sand
---------- -