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这样,值就得足够好的校准值。
校准过程 在使用 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)应设置不超过1000 kHz,分辨率带宽较低,以便能够测量由晶体频率调整引入的微小频率变化。
最佳 CTune 值 通过迭代找到最佳方法 CTune 值。 设置频谱仪标记为所需频率并更改CTune值,直到无线电以此频率发射。
频率漂移 由于芯片加热会影响晶体的谐振频率,因此发射功率越高,最佳值就越难找到。 下图是频谱仪"max hold"在使用高传输功率的2分钟内拍摄模式。 结果表明,频率漂移约为0.5KHz,这可能导致校准不准确。
安装并导入python的pynput模块检测键盘事件,serial收发模块控制串口数据,subprocess模块通过Shell调用Silicon labs 的Commander:
from pynput import keyboard import serial import time import threading txser = serial.Serial("COM1",115200,5) ctuneValue = 0x67 def 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 = 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
使用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'''
if len(sys.argv)>1:
portx=sys.argv[1]
try:
self=ProCTuneCalibration() # open the serial port for Z-Wave chip
except:
print('error - unable to start program')
ProCTuneCalibration.usage()
exit()
while True:
with keyboard.Listener(
on_press = on_press,
on_release = on_release) as listener:
listener.join()