头图
相信大家第一次接触LoRa芯片时,阅读Semtech官方Demo代码或者自己进行项目开发时,不知道对于待机模式,是使用STDBY_RC还是STDBY_XOSC呢?今天我们就来介绍射频芯片SX1261/2该如何选择时钟源,对应的时钟源应该选择哪种待机模式以及相关源码该怎么写。

一、参考时钟

内部时钟:

SX1261/2芯片内部有两个RC时钟源可用:64kHz、13MHz。64kHz时钟一般在WOR(无线电唤醒)模式执行唤醒射频芯片的操作时使用,而13MHz在芯片正常工作时使用。但一般来说,开发时射频芯片基本都连接了外部晶振,不会使用内部时钟,这样可以保证通信的稳定性。

外部时钟:

  • 无源晶振(XTAL)

我们知道无源晶振需要借助外围时钟电路才可以振荡,而SX1261/2芯片不需要硬件设计在32MHz晶振旁加入电容元件,该芯片引脚XTA、XTB配置了可编程电容器。电容器的值以0.47pF为步长,寄存器设置0x00值对应电容值为11.3pF(最小值),设置0x2F值对应电容值为33.4pF(最大值)。

补充一个如何调整晶振旁两个负载电容值的知识:

根据下列公式来设置晶振旁的两个负载电容值Cg和Cd:

$$ C_l \approx \frac{C_g * C_d}{C_g + C_d} + C_s $$

其中Cl为晶振的标称负载电容,Cs为PCB的杂散电容,Cs一般经验值为3-5pF,并且一般取Cg = Cd。晶振的标称负载电容可以查阅晶振的数据手册。Cg 和 Cd变大晶体振荡的频率变小;Cg 和 Cd变小晶体振荡的频率变大;

注意事项: 使用无源晶振时,在POR上电复位或冷启动模式下从休眠唤醒时,XTA、XTB引脚设置电容值的寄存器会将值初始化为0x05(对应电容值为13.6pF),芯片设置为STDBY_XOSC模式后,两个寄存器的值会被覆盖为0x12(对应电容值为19.7pF)。因此开发时应确保射频芯片已处于STDBY_XOSC模式,然后才能更改电容值寄存器的值,以免被覆盖。

  • 有源晶振(TCXO)

使用有源晶振时,不必关心XTA、XTB引脚电容配置寄存器值,可以通过一个220Ω电阻和一个10pF直流截止电容将其连接到XTA引脚(数据手册推荐设计),XTB引脚保持未连接状态。射频芯片的DIO3引脚可用于为TCXO提供稳压直流电压。SetDIO3AsTCXOCtrl命令用于配置DIO3控制外部TCXO参考电压。

注意事项: 使用SetDIO3AsTCXOCtrl命令进行设置后,控制XTA内部电容值的寄存器值将自动更改为0x2F(对应电容值为33.4pF),来过滤传播到PLL锁相环的杂散。

使用此命令后,射频芯片会在需要时(在STDBY_XOSC、FS、TX、RX模式下),将DIO3引脚设置为预定义的输出电压。32MHz晶振频率出现并稳定所需的时间可以通过delay(23:0)来控制。如果在延迟周期结束时,内部未检测到来自有源晶振的32MHz,使用GetDeviceErrors命令可以查询到错误码为XOSC_START_ERR。

在这再介绍下锁相环(PLL,Phase-Locked Loop),它是一种反馈控制电路。其特点为:利用外部的参考信号控制环路内部振荡信号的频率和相位。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环的名称由来。

锁相环通常由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)和压控振荡器(VCO,Volatge Controlled Oscillator)三部分组成,锁相环组成的原理框图所下图所示。

工作原理:压控振荡器的输出经过采集并分频;和基准信号同时输入鉴相器;鉴相器通过比较上述两个信号的频率差,然后输出一个直流脉冲电压;控制VCO,使它的频率改变;这样经过一个很短的时间,VCO的输出就会稳定于某一期望值。

二、源码实现

通过阅读第一章节,相信读者对不同的参考时钟应该如何操作射频芯片初始化有了初步的了解,接下来我们看下初始化的具体源码该如何实现。(下面源码为伪代码,只是为了描述初始化具体步骤)

使用内部时钟:

void SX126xInit(void)
{
  //复位
  SX126xReset();
  //射频芯片唤醒
  SX126xWakeup();
  //射频芯片设置待机模式STDBY_RC
  SX126xSetStandby(STDBY_RC);
}

使用无源晶振:

void SX126xInit(void)
{
  //复位
  SX126xReset();
  //射频芯片唤醒
  SX126xWakeup();
  //射频芯片设置待机模式STDBY_RC
  SX126xSetStandby(STDBY_RC);
  //射频芯片设置待机模式STDBY_XOSC
  SX126xSetStandby(STDBY_XOSC);
  //设置XTA、XTB引脚电容值
  SX126xWriteRegister(REG_XTA_TRIM,XTAL_DEFAULT_CAP_VALUE);
  SX126xWriteRegister(REG_XTB_TRIM,XTAL_DEFAULT_CAP_VALUE);
}

使用有源晶振:

void SX126xInit(void)
{
  //复位
  SX126xReset();
  //射频芯片唤醒
  SX126xWakeup();
  //射频芯片设置待机模式STDBY_RC
  SX126xSetStandby(STDBY_RC);
  //设置为TCXO提供的直流电压的值和延迟时间
  SX126xSetDio3AsTcxoCtrl(TCXO_CTRL_VOLTAGE,RF_WAKEUP_TIME << 6);
  //射频芯片设置待机模式STDBY_XOSC
  SX126xSetStandby(STDBY_XOSC);
  //此时,不用对XTA内部电容值寄存器进行控制,其会自动更改为0x2F,来过滤传播到PLL的杂散。
  //对射频进行校准
  CalibrationParams_t calibParam;
  calibParam.Value = 0xFF;
  SX126xCalibrate( calibParam );

何小胖
1 声望0 粉丝

一个在嵌入式开发领域摸爬滚打的程序员,欢迎大家与我交流,共同进步!