forked from M-Labs/artiq
Phaser upconverter: Follow datasheet procedure for VCO calibration (close #1643)
Signed-off-by: Marius Weber <marius.weber@physics.ox.ac.uk>
This commit is contained in:
parent
7404152e4c
commit
1c96797de5
|
@ -323,6 +323,7 @@ class Phaser:
|
||||||
delay(.2*ms)
|
delay(.2*ms)
|
||||||
for data in channel.trf_mmap:
|
for data in channel.trf_mmap:
|
||||||
channel.trf_write(data)
|
channel.trf_write(data)
|
||||||
|
channel.cal_trf_vco()
|
||||||
|
|
||||||
delay(2*ms) # lock
|
delay(2*ms) # lock
|
||||||
if not (self.get_sta() & (PHASER_STA_TRF0_LD << ch)):
|
if not (self.get_sta() & (PHASER_STA_TRF0_LD << ch)):
|
||||||
|
@ -331,6 +332,7 @@ class Phaser:
|
||||||
if channel.trf_read(0) & 0x1000:
|
if channel.trf_read(0) & 0x1000:
|
||||||
raise ValueError("TRF R_SAT_ERR")
|
raise ValueError("TRF R_SAT_ERR")
|
||||||
delay(.1*ms)
|
delay(.1*ms)
|
||||||
|
channel.en_trf_out()
|
||||||
|
|
||||||
# enable dac tx
|
# enable dac tx
|
||||||
self.set_cfg(clk_sel=self.clk_sel)
|
self.set_cfg(clk_sel=self.clk_sel)
|
||||||
|
@ -689,6 +691,7 @@ class PhaserChannel:
|
||||||
self.phaser = phaser
|
self.phaser = phaser
|
||||||
self.index = index
|
self.index = index
|
||||||
self.trf_mmap = TRF372017(trf).get_mmap()
|
self.trf_mmap = TRF372017(trf).get_mmap()
|
||||||
|
|
||||||
self.oscillator = [PhaserOscillator(self, osc) for osc in range(5)]
|
self.oscillator = [PhaserOscillator(self, osc) for osc in range(5)]
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
|
@ -891,6 +894,32 @@ class PhaserChannel:
|
||||||
return self.trf_write(0x00000008 | (cnt_mux_sel << 27),
|
return self.trf_write(0x00000008 | (cnt_mux_sel << 27),
|
||||||
readback=True)
|
readback=True)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cal_trf_vco(self):
|
||||||
|
"""Start calibration of the upconverter (hardware variant) VCO.
|
||||||
|
|
||||||
|
TRF outputs should be disabled during VCO calibration.
|
||||||
|
"""
|
||||||
|
self.trf_write(self.trf_mmap[1] | (1 << 31))
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def en_trf_out(self, rf=1, lo=0):
|
||||||
|
"""Enable the rf/lo outputs of the upconverter (hardware variant).
|
||||||
|
|
||||||
|
:param rf: 1 to enable RF output, 0 to disable
|
||||||
|
:param lo: 1 to enable LO output, 0 to disable
|
||||||
|
"""
|
||||||
|
data = self.trf_read(0xc)
|
||||||
|
delay(0.1 * ms)
|
||||||
|
# set RF and LO output bits
|
||||||
|
data = data | (1 << 12) | (1 << 13) | (1 << 14)
|
||||||
|
# clear to enable output
|
||||||
|
if rf == 1:
|
||||||
|
data = data ^ (1 << 14)
|
||||||
|
if lo == 1:
|
||||||
|
data = data ^ ((1 << 12) | (1 << 13))
|
||||||
|
self.trf_write(data)
|
||||||
|
|
||||||
|
|
||||||
class PhaserOscillator:
|
class PhaserOscillator:
|
||||||
"""Phaser IQ channel oscillator (NCO/DDS).
|
"""Phaser IQ channel oscillator (NCO/DDS).
|
||||||
|
|
|
@ -17,7 +17,7 @@ class TRF372017:
|
||||||
vco_sel = 2 # 2b
|
vco_sel = 2 # 2b
|
||||||
vcosel_mode = 0
|
vcosel_mode = 0
|
||||||
cal_acc = 0b00 # 2b
|
cal_acc = 0b00 # 2b
|
||||||
en_cal = 1
|
en_cal = 0 # leave at 0 - calibration is performed in `Phaser.init()`
|
||||||
|
|
||||||
nfrac = 0 # 25b
|
nfrac = 0 # 25b
|
||||||
|
|
||||||
|
@ -27,9 +27,9 @@ class TRF372017:
|
||||||
pwd_vcomux = 0
|
pwd_vcomux = 0
|
||||||
pwd_div124 = 0
|
pwd_div124 = 0
|
||||||
pwd_presc = 0
|
pwd_presc = 0
|
||||||
pwd_out_buff = 1
|
pwd_out_buff = 1 # leave at 1 - only enable outputs after calibration
|
||||||
pwd_lo_div = 1
|
pwd_lo_div = 1 # leave at 1 - only enable outputs after calibration
|
||||||
pwd_tx_div = 0
|
pwd_tx_div = 1 # leave at 1 - only enable outputs after calibration
|
||||||
pwd_bb_vcm = 0
|
pwd_bb_vcm = 0
|
||||||
pwd_dc_off = 0
|
pwd_dc_off = 0
|
||||||
en_extvco = 0
|
en_extvco = 0
|
||||||
|
@ -84,6 +84,7 @@ class TRF372017:
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
def get_mmap(self):
|
def get_mmap(self):
|
||||||
|
"""Memory map for TRF372017"""
|
||||||
mmap = []
|
mmap = []
|
||||||
mmap.append(
|
mmap.append(
|
||||||
0x9 |
|
0x9 |
|
||||||
|
|
Loading…
Reference in New Issue