笔记|使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune

使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune
CTune介绍:
EFR32 器件配备了一个可配置的内部电容器组,用于加载外部晶振以实现正确操作和频率校准。我们通常把这个电容组的可配置值称为CTune。
CTUNE值在高频晶振(HFXO)的启动阶段应用。以下等式给出了电容的配置值和实际值之间的关系:
Ctune = Cpar + CTUNE<8:0> * 40fF,
Cpar表示寄生电容,寄生电容的值取决于电路板类型、布局、温度和晶体类型。内部电容大小与频率成反比,电容值越大,HFXO 频率越低。
CTune的设置会影响芯片的HFXO(frequency crystal oscillator)时钟,无线射频也使用HFXO时钟,因此调节CTune也是调节无线电链路的质量,不正确的CTune设置可能会导致两个设备之间的无线电链路断开。
CTune校准值可以存储在设备的非易失性存储器中。在客户定制板上,应始终执行校准操作。可以对每块板进行校准,但需要更长的时间。一种优选的方法是针对每个设计测量10-20块板的HFXO频率,并计算出一个可用于所有设备的平均CTune值通过这种方式,可以获得足够好的校准值。
使用 RAILTEST设置CTune
校准过程
在使用 RAILEST 编程的设备上按顺序发出以下命令,以便在初始化校准后重置:

rx 0 setPower 1 getCTune setCTune <0x[hex-value] or [decimal value]> setTxTone 1

RAILTEST 以rx 模式启动设备,因为功放电源只能在RAIL_RF_STATE_IDLE状态下更改,因此设备首先应切换到IDLE模式。可以使用 getCTune命令读取实际的CTune变量。通过 setCTune 命令改写该值。配置完成后,setTxTone 1 命令将无线电设置为使用载波信号的发射模式。
HFXO自动启动和CTune 配置
CMU_HFXOAutostartEnable() 可在从EM2/3唤醒后启用自动启动。如果在最后两个参数中的任何一个为true的情况下调用这个API,它会阻止HFXO的重新启动,从而阻止CTune值的更改。蓝牙堆栈中默认启用了此功能。
测量
测量是使用频谱分析仪和868MHz的EFR32MG14射频板 (BRD4169A) 完成的。建议使用传导射频连接进行这些校准。建议在测量期间使用低功率输出,以避免由于功率放大器的电流消耗引起的温度升高导致的校准漂移。
频谱分析仪的频率跨度(Span)应设置为不超过100 kHz,分辨率带宽较低,以便能够测量由晶体频率调整引入的微小频率变化。
最佳 CTune 值
通过迭代方法找到最佳 CTune 值。 将频谱仪标记设置为所需的频率并更改CTune值,直到无线电以该频率发射。
频率漂移
发射功率越高,最佳值就越难找到,因为芯片升温会影响晶体的谐振频率。 下图是频谱仪在"max hold"模式下在使用较高传输功率的2分钟内拍摄的。 结果表明,频率漂移约为0.5KHz,这可能导致校准不准确。
笔记|使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune
文章图片

安装并导入python的pynput模块检测键盘事件,serial模块控制串口数据收发:
from pynput import keyboard import serial import time import threadingtxser = serial.Serial("COM1",115200,5) ctuneValue = https://www.it610.com/article/0x67def ReadEchoData(): global ctuneValue while True: Rx_Buffer = txser.read(txser.in_waiting).decode("gbk") if len(Rx_Buffer) > 6: print(Rx_Buffer)CtunePosition = Rx_Buffer.find("{{(getCtune)}{CTUNEXIANA:0x") if CtunePosition > 0: CtunePosition = CtunePosition + 25 print("CTUNE Value") newStr = Rx_Buffer[36:41] print(newStr) ctuneValue = https://www.it610.com/article/int(newStr,16) print(ctuneValue)def IncCtuneValue(): global ctuneValue ctuneValue = ctuneValue + 16 txser.write(b"settxtone 0\r\n") time.sleep(0.1) txser.write(b"rx 0\r\n") time.sleep(0.1) txser.write(b"setCtune 0x%x \r\n" %ctuneValue) time.sleep(0.1) txser.write(b"settxtone 1\r\n") time.sleep(0.1) return

【笔记|使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune】使用pynput模块检测键盘事件并做出相应处理:
def on_press(key): try: print('alphanumeric key {0} pressed'.format(key.char)) except AttributeError: print('special key {0} pressed'.format(key)) if key == keyboard.Key.space: InitTx(); if key == keyboard.Key.up: IncCtuneValue(); if key == keyboard.Key.down: DecCtuneValue(); if key == keyboard.Key.left: AddCtuneValue(); if key == keyboard.Key.right: ReduceCtuneValue(); if key == keyboard.Key.enter: PrKeyValue(key); if __name__ == "__main__": ''' Start the app if this file is executed''' while True: with keyboard.Listener( on_press = on_press, on_release = on_release) as listener: listener.join()

    推荐阅读