单片机型号:STM32L053R8T6
本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片唤醒驱动程序。
一、RxDutyCycle模式
在讲述本篇内容之前,我们先来看一下SX1268的一种模式RxDutyCycle,译为中文为接收占空比模式。其可使用SetRxDutyCycle命令进入RxDutyCycle模式,我们来看一下该命令的详细解释。
该命令具有2个参数,从字面的意思可以看出,1个是指接收周期时间,另1个是指睡眠周期时间。我们可分析出,该命令是在RX模式和SLEEP模式之间自动转换的一种模式,其目的是为了节省芯片功耗。如果在使能外部中断后,则单片机可以进入睡眠态,SX1268大部分时间也是睡眠,而且可自动唤醒,功耗则大幅度节省。
When this command is sent in STDBY_RC mode, the context (device configuration) is saved and the chip enters in a loop
defined by the following steps:(当从STDBY_RC模式进入时,器件配置信息会被保存,芯片循环以下步骤)
The chip enters RX and listens for a packet for a period of time defined by rxPeriod(芯片在RX模式持续rxPeriod所定义的时间)
The chip is looking for a preamble in either LoRa® or FSK(芯片自动搜索LoRa或FSK报头)
Upon preamble detection, the timeout is stopped and restarted with the value 2 * rxPeriod + sleepPeriod(搜索到前导码,超时停止,并以2 * rxPeriod + sleepPeriod的时间重新开始)
If no packet is received during the RX window (defined by rxPeriod), the chip goes into SLEEP mode with context saved
for a period of time defined by sleepPeriod(经过rxPeriod时间未收到包,芯片则将配置信息保存后进入SLEEP模式,其时间由sleepPeriod确定)
At the end of the SLEEP window, the chip automatically restarts the process of restoring context and enters the RX
mode, and so on. At any time, the host can stop the procedure(睡眠结束后,芯片恢复配置信息重新启动,进入RX模式,如此周而复始。在任何时候,主机都可停止该循环)
循环可以通过以下方式中止:
在RX模式接收到1包数据,芯片置位RX_DONE标志位,中断主机,并进入STDBY_RC模式
芯片在RX模式接收到SetStandby命令(睡眠模式时接收不到的,必须通过拉低NSS进行唤醒)
SLEEP模式时间:sleepPeriod * 15.625 μs
RX模式时间:rxPeriod * 15.625 μs
在RX模式时,接收到前导码,则定时器将进入SLEEP模式的时间调整为2 * rxPeriod + sleepPeriod,应确保在这段时间内接收到前导码和报头,公式如下:
二、芯片唤醒
接下来,我们再看模式转换图,有3种模式需要唤醒,上电或复位、睡眠模式、RxDutyCycle模式。这3种模式,都先进入STARTUP模式,再进入STDBY模式。上电或复位操作与睡眠模式操作的方式是相同的,RxDutyCycle也存在睡眠模式,所以我们均需考虑使用NSS拉低的方式将其唤醒。
三、唤醒函数
在看一次唤醒时序图,NSS拉低后可将芯片唤醒。具体解释:可以通过NSS的下降沿使得芯片从sleep模式唤醒。下降沿发生后,芯片内部的稳压器都将打开。芯片开始初始化,然后具备接收第1个SPI命令的能力。这意味着NSS下降沿到SCK上升沿之间的延时,需考虑唤醒序列和芯片的初始化。在睡眠模式和初始化阶段,BUSY引脚为高电平,以表明芯片不能够接收1个新的命令。一旦芯片进入了STDBY_RC模式,BUSY引脚将变低,此时主机可以发送命令。整个过程同样适用于上电启动和硬复位。
程序如下:
void CSX1268::SX126xWakeup(void)
{
this->Select();
SX126xWaitOnBusy();
this->Deselect();
SX126xWaitOnBusy();
}
四、SX126xCheckDeviceReady函数
有了上述准备后,我们再来看一下SX126xCheckDeviceReady函数,程序如下。开始判断当前模式是否是SLEEP或RxDutyCycle模式,如果是先进行唤醒操作,然后将天线打开;如果不是,直接等待BUSY为低就绪即可。上电或复位,与从SLEEP模式唤醒的操作是相同的,我们只需在程序的起始,将模式设定为SLEEP模式即可。
void CSX1268::SX126xCheckDeviceReady(void)
{
if((SX126xGetOperatingMode() == MODE_SLEEP) || (SX126xGetOperatingMode() == MODE_RX_DC))
{
SX126xWakeup();
// Switch is turned off when device is in sleep mode and turned on is all other modes
SX126xAntSwOn(); //打开天线开关,此函数就是将相应的引脚设置为输出,还需仔细探讨
}
SX126xWaitOnBusy();
}
在这里又牵扯到天线打开与关闭函数,我们将在下一篇日志中介绍。
上一篇:STM32开发笔记86:使用printf向串口输出数据
下一篇:STM32开发笔记84: SX1268驱动程序设计(SPI总线)
推荐阅读最新更新时间:2024-11-03 11:05
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 LV4985VH 的参考设计
- Kazzo烧录器
- LM2902DTBR2G 多反馈带通滤波器运算放大器的典型应用
- LT1506CR 双路输出 SEPIC 转换器的典型应用电路
- LTC3552 演示板、锂离子电池充电器和两个同步降压稳压器
- LT3091IT7 正输出电流监视器的典型应用
- 32位单片机核心板外设
- 出租车计价器设计的原理图和相关文档
- EVAL-PS-E1BF12-SIC,FF11MR12W1M1_B11 和 FF23MR12W1M1_B11 CoolSiC MOSFET 模块的评估板
- LT6656AIDC-5、5V 扩展电源范围电压基准的典型应用