你好,
我在使用DSPS项目时遇到了一个问题,我禁用了默认的HW & SW流程
控制定义,并使用gpio单片机唤醒DA14580。我的问题是
uart接收的数据是错误的,但字节计数是正确的。有时,数据可能是正确的
了。(当禁用扩展睡眠模式时,数据总是正确的)
如:
当我发送0x00时,我得到0x80;当我发送0x55时,我得到0xAD。
我确信DA14580已被唤醒,在gpio发生变化时不会进入睡眠状态
的水平。
当DA1480被唤醒时,我使用外围init()函数重新初始化pad和uart
回调函数是基于演示项目的按钮回调函数
(报表生成程序)。
我试图发送一些虚拟字节数据,但这个方法不太好。
我还试图增加GPIO级别变化和数据之间的延迟
流动只有当延迟与连接时间间隔一样长时,数据才显得不可靠
正确的。这是一个不好的方法,因为MCU和DA不能长时间休眠。
我应该改变软件结构吗?还是uart的配置?或改变
叫醒电话?
如有任何建议,我们将不胜感激!
关键词:
设备:
嗨birenpeter,
为了使UART正常工作,它需要XTAL16进行适当的时钟,当通过外部中断从睡眠中唤醒时,在触发BLE事件并强制唤醒BLE之前,不能切换到XTAL16。因此,当从外部中断中醒来时,您的UART通过RC16运行(不够精确,无法从UART获得有效数据)。因此,当你醒来时,你必须调用arch_ble_force_wakeup来唤醒你的BLE并切换到XTAL16。也祝福核心醒来,切换时钟和等待XTAL16解决需要一段时间(大约5 ms)所以你必须延迟从单片机发送数据或触发单片机外部其他销580是醒着的,所以它的安全开始发送数据。
由于MT_dialog
很多谢谢!dsp现在可以准确接收数据了!电流是正确的。我的方法如下!
在唤醒回调中,我手动启用XTAL16M并将其设置为系统clk,然后强制启动。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
空白gpio_wakeup_callback(空白)
{
//重新初始化外围
periph_init ();
SetBits16 (CLK_CTRL_EG TXAL16M_DISABLE 0); / /启用XTAL16M
而((GetWord16 (SYS_STAT_REG) &XTAL16_SETTLED) = = 0); / /等准备好了
//设置XTAL16M为sys clk . SetBits16(CLK_CTRL_REG,SYS_CLK_SEL,0)
而((GetWord16 (CLK_CTRL_REG) &RUNNING_AT_XTAL16M) = = 0); / /等准备好了
拱力唤醒()//强制唤醒
....
/ /重新init唤醒
gpio_wakeup_init ();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在主循环回调函数user_on_system_powered()中,我检查ble和XTAL16M状态,并通知MCU。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
枚举系统上的用户(无效)
{
..…//检查缓冲区
如果(ble_已通电())//检查ble是否通电
{
如果(GetWord16 (SYS_STAT_REG) &XTAL16_SETTLED) ! = 0) & & ((GetWord16 (CLK_CTRL_REG) &RUNNING_AT_XTAL16M) ! = 0)
{
//切换另一个gpio通知MCU,DA准备接收数据。
....
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
虽然它现在运行良好,但有一些问题我不确定。
1.在arch_ble_force_wakeup()中,没有对XTAL16M进行任何操作。这是之前接收错误数据的确切原因吗?是否建议手动转向
在XTAL16吗?这会使软件不稳定吗?我也不知道XTAL16M在哪里关门。
2.测试了从唤醒到通知MCU的时间窗口,连接状态约为4~6ms,广告状态约为100~200us。我不知道为什么。
3.出于特殊目的,我将TX(读,通知)和RX(写而无响应)字符替换为单个字符DATA(读,写而无响应,通知),
当DA14580连续发送通知(约5KB/s)时,Phone App向DATA字符写入一些字节。DA14580可以正确地获取写入的数据,而DA14580可以正确地获取写入的数据
PhoneApp得到一些错误的通知数据。DA14580不同时支持二进制方向传输?
嗨birenpeter,
1.arch_ble_force_wakeup()不会将晶体切换到XTAL16,它只会触发ble wakeup函数,在您使用该函数(arch_ble_force_wakeup())后,应该调用LP和SLP处理程序,并且在SLP处理程序中,XTAL16晶体会进行切换。因此,通常只需调用arch_ble_force_wakeup(),设备的XTAL16就应该准备好了,您不必在唤醒功能中明确地切换时钟。问题是,当您调用bleforce唤醒时,LP处理程序不会立即被调用。XTAL在arch_go_to_sleep()函数中的主循环函数中是闭合的,在那里系统从XTAL16更改为RC16。
2.100~200us对于LP和SLP的执行时间是非常小的。
3.这听起来有点奇怪,你得到的数据损坏BLE传输,我认为CRC会拯救你从那种情况下大多数时候,也许不是总是(不确定)。但是,是的,你可以在同一时间从从机和从机之间传输数据,在连接间隔期间,主机总是发送一个空包给从机,从机响应,而不是空包,设备正在交换数据。
由于MT_dialog