如何在BLE\Peripheral工程和RF_phy工程结合的工程下开启HAL_SLEEP时通过TOMS事件唤醒后让CH57X_LowPower及时退出?

@TECH_Rzz@TECH13@TECH_JW您好!

在做RF通讯时,开启HAL_SLEEP时通过TOMS事件唤醒后,无法保证通讯正常运行(会出现CRC error)。

已排除通讯窗口期问题。

使用RF通讯,发送端可以直接调用协议栈的睡眠,即将HAL_SLEEP设置为true,使用tmos调用发送函数,

而接受端,是不可以这样使用的,接收端最好是保持接收状态。


@TECH_Hy非常感谢您的回复。

1、接收端也要保持低功耗的,接收端到约定时间点通过TMOS提前唤醒开启接收状态,接收完每个从设备发过来的数据后(假设2min)再次通过TMOS进行睡眠模式不可以吗?

2、是不是设备从sleep模式醒来进行RF通讯需要一定的时间,ms级的?

3、现已在最新CH579例程进行测试,将\BLE\RF_PHY移植到\BLE\Peripheral工程下,打开sleep,通过tmos唤醒设备来进行两个设备间相互通讯,会出现CRC error。任意一方出现CRC error后通讯不能再次接收数据。

通讯过程为:b设备先设置为RX-MODE,a设备为TX-mode发送数据给b设备,a设备发送完成后设置为接收,b设备收到a设备数据后转为TX-MODE给a设备回应。

已在CH57X_LowPower()里设置标志位来退出sleep。



HAL_SLEEP设置为true,并在CH57X_LowPower函数中设置sleep退出标志

image.png

通过蓝牙下发指令开启接收,并退出sleep

image.pngimage.png


在睡眠函数中置flag的方法是可以实现的,如果仅是A和B通讯,可以使用auto模式,无需手动切换收发,出现crc后不再通讯显然是不合理的,可以检查下代码,是否是出现crc之后并没有再次打开发送或接收。


1、是一接收,多发送,采用的BASIC模式。

2、出现crc之后,再次打开接收或发送也是不行,只有重启设备



调用发送或接收之前是否调用了 RF_Shut(); 


调用了


如果方便的话,可以将你的代码发送到hy@wch.cn,我们来帮你看看,另外在邮件中也将你具体怎么测试的描述下。


已发送


问题已解决,上述功能可实现。


只有登录才能回复,可以选择微信账号登录