关于嵌入式编程: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 );