乐趣区

关于嵌入式编程:SX12612芯片开发那些事儿一时钟源选择

置信大家第一次接触 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);
退出移动版