大家好,
我在使用DSP项目时面临问题,我禁用默认的HW和SW流程
控制定义,并使用GPIO用于MCU唤醒DA14580.Y问题是
uart received data is wrong,but byte count is right.Some times, the data may be right
也是。(当禁用扩展睡眠模式时,数据都是正确的)
eg:
当我发送0x00时,然后我得到0x80;当我发送0x55时,我得到0xad。
我相信DA14580睡醒了,不花er sleep unitl the gpio changes
等级。
当DA1480被唤醒时,我使用periph_init()函数重新in in in in in in in in in rear.and.
Callback Funtion基于Demo项目的按钮回调
(九)。
我试图发送一些虚拟字节数据,但这种方法不起作用。
我还试图增加GPIO级别变化与数据之间的延迟
stream. only when the delay is as long as the connection interval,data seems to be
对。这是一种不好的方法,因为MCU和DA很长。
我应该更改软件结构吗?或UART的配置?或改变
the wake up callback?
任何建议都赞赏!
关键词:
设备:
嗨Birenpeter,
为了使UART正常工作它需要XTAL16进行适当的时钟,当通过外部中断从睡眠唤醒时,没有切换到XTAL16,直到触发BLE事件并强制唤醒BLE才能唤醒。因此,当从外部中断唤醒时,UART通过RC16运行(不准确以获得来自UART的有效数据)。所以在醒来时,您必须调用Arch_ble_Force_WakeUp以唤醒您的BLE并切换到XTAL16。还要唤醒BLE核心,切换时钟并等待XTAL16定居需要一段时间(约5ms),因此您必须延迟从MCU发送数据或将外部MCU与580醒目的其他引脚触发,它安全地开始发送数据。
谢谢mt_dialog.
非常感谢!DSP可以完全接收数据!并且当前是对的。My方法如下所述!
In my wakeup callback,I manually enable the XTAL16M and set as system clk, then force ble powered.
//////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////
void gpio_wakeup_callback(void)
{
//re-init periph
periph_init();
setbits16(clk_ctrl_eg,txal16m_disable,0); //启用XTAL16M
而((getword16(sys_stat_reg)&xtal16_settled)== 0); //等待准备好了
setbits16(clk_ctrl_reg,sys_clk_sel,0); //将xtal16m设置为sys clk
while((getword16(clk_ctrl_reg)&running_at_xtal16m)== 0); //等待准备好了
arch_ble_force_wakeup();//force ble wakeup
....
//重新启动唤醒
gpio_wakeup_init();
}
//////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在mainloop调用函数user_on_system_powered()中,检查BLE和XTAL16M状态,并通知MCU。
//////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum user_on_system_powered(void)
{
.....//check buffer
if(ble_is_powered())// check wether ble is powered
{
if(getword16(sys_stat_reg)&xtal16_settled)!= 0)&&((getword16(clk_ctrl_reg)&tranning_at_xtal16m)!= 0)
{
//切换另一个GPIO以通知MCU,DA已准备好接收数据。
....
}
}
}
//////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
Although it is workong well now,there are some questions I am not sure.
1. arch_ble_force_wakeup(),在xtal16m上没有任何操作。是之前接收错误数据的确切原因吗?它建议手动转身
在XTAL16?它会使软件不稳定吗?我也不知道XTAL16M关闭的位置。
2.我从唤醒到通知MCU的时间窗口,它在连接状态下约为4〜6ms,但广告状态为100〜200us。我不知道为什么。
3.特殊目的,我用单个字符数据替换了TX(读取,通知)和RX(WriteWithoutResponse)字符(读取,writeWithoutResponse,Notify),
当DA14580持续发送通知时(约5KB / s),手机应用程序将一些字节写入数据字符.DA14580可以正确地获得写入数据,而
PhoneApp获得了一些错误的通知数据。DA14580同时不支持二进制方向传输?
嗨Birenpeter,
1. The arch_ble_force_wakeup() doesn't switch the crystal to the XTAL16, it just triggers the BLE wakeup functionallity, after you ve used that function (arch_ble_force_wakeup()) the LP and SLP Handlers should be called and in the SLP handler is where the XTAL16 crystal switches. So normally by just calling the arch_ble_force_wakeup() your device's XTAL16 should ready and you dont have to explictly switch clocks in your wake up function. The problem is that when you invoke the BLE force wake up the LP handler doesn't get invoked immidiatelly. The XTAL is closed in the main loop function in arch_go_to_sleep() function, there the system changes from the XTAL16 to the RC16.
2. 100〜200us是LP和SLP获得执行的非常少的时间。
3.它听起来有点奇怪,你通过BLE传输损坏数据,我想CRC大部分时间都会从那种情况下拯救你,也许不是总是(不确定)。但是,您可以同时将数据从从机传输到Master和Master到从站,在连接间隔期间始终向从站发送空数据包,从设备响应,而不是设备正在交换数据。
谢谢mt_dialog.