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

发布者:雅意盎然最新更新时间:2020-03-08 来源: eefocus关键字:STM32  SX1268  芯片唤醒 手机看文章 扫描二维码
随时随地手机看文章

单片机型号: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  SX1268  芯片唤醒 引用地址:STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)

上一篇:STM32开发笔记86:使用printf向串口输出数据
下一篇:STM32开发笔记84: SX1268驱动程序设计(SPI总线)

推荐阅读最新更新时间:2024-11-03 11:05

STM32中flash的读写详解
一:对STM32内部FLASH写进行编程操作,需要遵循以下流程:   1.FLASH解锁   2.清除相关标志位   3.擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)   4.写入FLASH   5.锁定FLASH (1)获取状态:FLASH_Status FLASH_GetStatus(void); 返回值是通过枚举类型定义的。 typedef enum { FLASH_BUSY = 1, //忙 FLASH_ERROR_PG, //编程错误 FLASH_ERROR_WRP, //写保护错误 FLASH_COMPLETE, //操作完成 FLASH_TIMEOUT /
[单片机]
STM32驱动ADC0809详解
开发环境与工具 Keil 5主芯片为 STM32F103RET6下载工具为 JLINKXCOM V2.0 串口助手PC 为 Win10 准备工作 购买 ADC0809 芯片 习惯购买元器件多买一个,方便替换验证。 因为做过一次验证之后,这个板子就没有用了,所以购买 DIP-28 宽体底座,让底座焊板子上,芯片插底座上,方便芯片的二次使用,节约成本。 PCB 打板 下图这种模块: STM32 要想驱动 ADC0809 这个芯片需要很多个引脚(不考虑复用的话,需要 16 个引脚),如果这些引脚都用杜邦线连接的话会很乱,如果哪个杜邦线再接触不好,那么对于程序的调试很不方便,所以我就采用核心板+底板的形式来实现,避
[单片机]
STM32启动过程解析-2.02固件库启动文件分析
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况: 1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处; 2、 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC
[单片机]
stm32头文件和源文件的作用
对于STM32F4xx_StdPeriph_Driver,其重要源文件为: stm32f4xx_ppp.h:外设头文件。这里的ppp只是一个代码,在实际上是具体的外设名字,如ADC,DMA等。在实际使用时根据所需的外设选择性移植。 stm32f4xx_ppp.c:外设源文件。这里的ppp只是一个代码,在实际上是具体的外设名字,如ADC,DMA等。在实际使用时根据所需的外设选择性移植。 stm32f4xx_conf.h:外设驱动配置文件。通过修改该文件中所包含的外设头文件,用户启动或禁用外设驱动。此外,在此文件夹打开宏定义USE_FULL_ASSERT,通过预处理启 用或禁用标准外设库运行时的故障检测。 stm32f4xx_
[单片机]
STM32窗口看门狗WWDG复位
STM32除了有一个独立看门狗外,还有一个窗口看门狗。窗口看门狗当然也能复位MCU,但是与独立看门狗复位不同。首先,窗口看门狗所需要的时钟源来自PCLK2,它时钟是经过PCLK2的4096分频后得到的,能够提供准确的计数。其次,复位的条件有要求:(1)当减计数器的值小于0x40,则产生复位;(2)当减计数值在窗口外被重新装载,则复位。接着,窗口看门狗的计数值与窗口值都只有7位,所以变化范围在0~127之间。还有,装载值一定要大于0x3F,否则就失去了看门狗的功能。 窗口看门狗,它的 窗口 可以有下图体现出来: 图中W 表示窗口值,当看门狗的减计数器不断递减,只有计数值到达窗口值与0x3F之间的时候 喂狗 ,才不会发生复位,
[单片机]
<font color='red'>STM32</font>窗口看门狗WWDG复位
关于STM32的IAP总结
最近有项目要用到IAP的功能,于是调试了下STM32的IAP,可能因为个人水平的原因吧,也颇 费了一般周折 现在返回头来想,其实还是蛮简单的. 整个过程按照如下步骤: 1.解锁 2.判断是否保护,有保护的话要先关闭保护 3.擦除 4.编程 5.复位进入应用程序区 关于解锁:看资料的时候说的神乎其神,有个读/编程控制器叫”FPEC 有几个寄存器,专门负责Flash的,对这几个寄存器以一定得顺序访问并设置即可成功解锁Flash,至于怎么访问,谁先谁后,数据手册上写的头晕,直接来个快刀斩乱麻Flash_UnLock()函数封装了这一系列的操作,有一点要注意,如果你是自己操作寄存器的话,如果操作的方法或者顺序不对都会造成Flash
[单片机]
STM32延时函数的方法
STM32延时函数的方法 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD寄存器中自动重装载定时初值。 延时函数delay的编写 原理:3层for循环,循环次数是 NUM = 4X5X248 = 4960次,由每次循环都有条件判断(如 i 》0)和自减语句(如 i--),因此每次循环又耗费两个机器周期 所以,总耗费的机器周期为 SUM = NUM x 2 = 9920个。 整合自:CS
[单片机]
STM32之六独立看门狗
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生,在一定的时间内(通过计数器)没有喂狗信号输入给看门狗则表示MCU出现问题,自动会给处理器发送复位信号,是MCU重新启动,是系统正常运转。 STM32的独立看门狗有内部的专门40KHz低速时钟驱动,即使主时钟发生故障,它仍然有效。看门狗时钟十一个内部RC时钟,并不是准确的40KHz,而是在30~60KHz之间的变化时钟,估算时间的时候以40KHz来计算。 第一步,首先取消寄存器写保护,我们利用库函数的IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);来实现,
[单片机]
<font color='red'>STM32</font>之六独立看门狗
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved