Skip to content
Snippets Groups Projects

Apsct ad9511

1 file
+ 21
23
Compare changes
  • Side-by-side
  • Inline
+ 21
23
@@ -196,7 +196,7 @@ class PllClass:
write_data = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
def read_byte_pll(self, reg_address, nof_bytes=1):
def read_byte_pll(self, reg_address, nof_bytes=1, print_value=False):
#
# Read byte from the PLL
#
@@ -213,11 +213,8 @@ class PllClass:
for bit in bit_array:
for clk in [0,1,0]:
write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (int(bit) << APSCT_I2C.SDI)
print(f"Write data to IO {write_data:08b}")
self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(sleep_time)
# write_data = 0x02 | (0 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
# self.dev_i2c_pll.write_bytes(0x02, write_data)
self.dev_i2c_pll.write_bytes(0x06, 0xAC)
for cnt in range(8*nof_bytes):
for clk in [0, 1]: #[0, 1, 0]: # Read after rizing edge
@@ -229,7 +226,8 @@ class PllClass:
read_bit += str((int(ret_value, 16) >> APSCT_I2C.SDO) & 0x01)
else:
print("ACK nok")
print(f"Read bits {read_bit}")
if print_value:
print(f"Read bits {read_bit}")
self.dev_i2c_pll.write_bytes(0x06, 0x2C)
write_data = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
@@ -237,7 +235,7 @@ class PllClass:
stri = "Read back at address 0x{0:{fill}2x} result : 0x{1:{fill}2x} ".format(reg_address,
int(read_bit, 2), fill='0')
print(stri)
return read_bit
return int(read_bit, 2)
def setup_pll(self):
#
@@ -245,24 +243,27 @@ class PllClass:
#
print(f"Setup PPL {self.frequency}")
divider_r = 1
divider_a = 0
divider_p = 2
divider_a = 1
divider_p = 1
divider_b = int((int(self.frequency[:-3]) * divider_r) / (10 * divider_p))
print(f"Divider P : {divider_p}, Divider A : {divider_a}, Divider B : {divider_b}")
charge_pump_current = 3 # 0 is low (0.6 mA), 7 is high (4.8 mA)
if self.frequency == '160MHz':
print("Select 160MHz clock")
i2c_address = APSCT_I2C.PLL_200M
dev_i2c_pll_sel = I2C(i2c_address, BUSNR=I2CBUSNR)
dev_i2c_pll_sel.write_bytes(0x03, 0x08)
else:
self.dev_i2c_pll.write_bytes(0x03, 0x28)
self.write_byte_pll(0x04, (divider_a & 0x3F))
self.write_byte_pll(0x04, 1) #(divider_a & 0x3F))
self.write_byte_pll(0x05, (divider_b & 0x1F00) >> 8)
self.write_byte_pll(0x06, (divider_b & 0x00FF))
self.write_byte_pll(0x07, 0x04) # Lock detect
self.write_byte_pll(0x08, 0x03) # Charge pump normal + Status bit
self.write_byte_pll(0x07, 0x00) # No LOR
self.write_byte_pll(0x08, 0x3B) # Charge pump normal + Status bit
self.write_byte_pll(0x09, (charge_pump_current & 0x7) << 4)
self.write_byte_pll(0x0A, 0x04) # Fixed Divide 2
self.write_byte_pll(0x0A, 0x00) # Fixed Divide 1
self.write_byte_pll(0x0B, 0x00)
self.write_byte_pll(0x0C, 0x01)
self.write_byte_pll(0x45, 0x00) # CLK2 as feedback clock input
self.write_byte_pll(0x3D, 0x08) # OUT0 ON LVDS Standard
self.write_byte_pll(0x3E, 0x0A) # OUT1 OFF
@@ -274,7 +275,7 @@ class PllClass:
self.write_byte_pll(0x4F, 0x80) # OUT2 bypass divider
self.write_byte_pll(0x51, 0x80) # OUT3 bypass divider
self.write_byte_pll(0x53, 0x80) # OUT4 bypass divider
self.write_byte_pll(0x5A, 0x01) # Update registers
self.write_byte_pll(0x5A, 0x0F) # Update registers
def read_all_regs_pll(self):
@@ -282,10 +283,9 @@ class PllClass:
# Read all registers on the PLL and print on screen
#
bytes_to_read = 90
ret_value = self.read_byte_pll(0, nof_bytes=bytes_to_read)
for cnt in range(bytes_to_read):
start = cnt*8
stri = "Reg nr 0x{:0>2x} value: 0x{:0>2x}".format(cnt, int(ret_value[start:start+8], 2))
ret_value = self.read_byte_pll(cnt, 1)
stri = f"Reg nr 0x{cnt:0>2x} value: 0x{ret_value:0>2x}"
print(stri)
def read_lock(self, print_on=True):
@@ -648,19 +648,17 @@ class ApsctId:
def main():
apsct = ApsctClass()
apsct.power(False)
sleep(1)
if False:
apsct.power(False)
sleep(1)
apsct.power(True)
sleep(1)
if False:
# apsct.pll_200.reset_interface()
apsct.pll_200.write_byte_pll(0x06, 0xA5)
apsct.pll_200.write_byte_pll(0x5A, 0x01)
# apsct.pll_200.reset_interface()
apsct.pll_200.read_byte_pll(0x06)
apsct.pll_200.setup_pll()
apsct.pll_200.read_byte_pll(0x0A)
apsct.sensors.read_all_voltages()
# apsct.pll_200.read_all_regs_pll()
# apsct.sensors.read_all_voltages()
if __name__ == "__main__":
main()
Loading