单片机
返回首页

STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)

2020-03-08 来源:eefocus

单片机型号: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();

}


在这里又牵扯到天线打开与关闭函数,我们将在下一篇日志中介绍。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章