Skip to content
Snippets Groups Projects
Commit bee84349 authored by Gijs Schoonderbeek's avatar Gijs Schoonderbeek
Browse files

Communication working, Setting not correct

parent 2b6a92f7
No related branches found
No related tags found
1 merge request!6Apsct ad9511
...@@ -27,7 +27,7 @@ else: ...@@ -27,7 +27,7 @@ else:
from I2C_serial import * from I2C_serial import *
I2CBUSNR = 5 I2CBUSNR = 5
sleep_time = 0.15 sleep_time = 0.0001
DEBUG = False DEBUG = False
...@@ -62,6 +62,11 @@ class ApsctClass: ...@@ -62,6 +62,11 @@ class ApsctClass:
stri = "Expander : 0x{:0>2x}, Reg 0x{:0>2x}, value 0x{}{}".format(addr, reg_cnt, ret_value[0], stri = "Expander : 0x{:0>2x}, Reg 0x{:0>2x}, value 0x{}{}".format(addr, reg_cnt, ret_value[0],
ret_value[1]) # [start+2:start]) ret_value[1]) # [start+2:start])
print(stri) print(stri)
def read_all_io_device_registers(self, device, registers=8):
print(f"Read IO-expander at register 0x{device.I2C_Address:X}")
for register in range(registers):
reg_content = device.read_bytes(register, 1)
print(f"Register {register} 0x{reg_content}")
def power(self, state): def power(self, state):
# #
...@@ -73,24 +78,30 @@ class ApsctClass: ...@@ -73,24 +78,30 @@ class ApsctClass:
stri = "Power to {}".format(state) stri = "Power to {}".format(state)
print(stri) print(stri)
i2c_io_device_a = I2C(0x20, BUSNR=I2CBUSNR) i2c_io_device_a = I2C(0x20, BUSNR=I2CBUSNR)
i2c_io_device_a.write_bytes(0x04, 0) # inversion off
i2c_io_device_a.write_bytes(0x05, 0) # inversion off
i2c_io_device_a.write_bytes(0x06, 0x2C) # '0' is output, '1' is input i2c_io_device_a.write_bytes(0x06, 0x2C) # '0' is output, '1' is input
i2c_io_device_a.write_bytes(0x07, 0x00) # '0' is output, '1' is input i2c_io_device_a.write_bytes(0x07, 0x00) # '0' is output, '1' is input
i2c_io_device_b = I2C(0x21, BUSNR=I2CBUSNR) i2c_io_device_b = I2C(0x21, BUSNR=I2CBUSNR)
i2c_io_device_b.write_bytes(0x04, 0) # inversion off
i2c_io_device_b.write_bytes(0x05, 0) # inversion off
i2c_io_device_b.write_bytes(0x06, 0x2C) # '0' is output, '1' is input i2c_io_device_b.write_bytes(0x06, 0x2C) # '0' is output, '1' is input
i2c_io_device_b.write_bytes(0x07, 0xFF) # '0' is output, '1' is input
if state: if state:
bits_to_set_a1 = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI) bits_to_set_a1 = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
bits_to_set_a2 = 0x04 bits_to_set_a2 = 0x08
bits_to_set_b1 = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI) bits_to_set_b1 = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
else: else:
bits_to_set_a1 = 0x00 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI) bits_to_set_a1 = 0x00 # | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
bits_to_set_a2 = 0x00 bits_to_set_a2 = 0x00
bits_to_set_b1 = 0x00 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI) bits_to_set_b1 = 0x00 # | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
if DEBUG:
stri = "Bits to reg 0 0x{0:x}".format(bits_to_set_a1)
print(stri)
i2c_io_device_a.write_bytes(0x02, bits_to_set_a1) i2c_io_device_a.write_bytes(0x02, bits_to_set_a1)
i2c_io_device_a.write_bytes(0x03, bits_to_set_a2) i2c_io_device_a.write_bytes(0x03, bits_to_set_a2)
i2c_io_device_b.write_bytes(0x02, bits_to_set_b1) i2c_io_device_b.write_bytes(0x02, bits_to_set_b1)
if DEBUG:
self.read_all_io_device_registers(i2c_io_device_a)
self.read_all_io_device_registers(i2c_io_device_b)
def set_apsct(self): def set_apsct(self):
# #
...@@ -142,6 +153,23 @@ class PllClass: ...@@ -142,6 +153,23 @@ class PllClass:
self.i2c_address = APSCT_I2C.PLL_200M self.i2c_address = APSCT_I2C.PLL_200M
self.dev_i2c_pll = I2C(self.i2c_address, BUSNR=I2CBUSNR) self.dev_i2c_pll = I2C(self.i2c_address, BUSNR=I2CBUSNR)
def reset_interface(self):
#
# Reset the SPI interface
#
self.dev_i2c_pll.write_bytes(0x06, 0x2C)
sleep(0.01)
write_data = 0x02 | (0 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
for cnt in range(4):
for clk in [0,1,0]:
write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(sleep_time)
write_data = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(0.01)
def write_byte_pll(self, reg_address, wr_data): def write_byte_pll(self, reg_address, wr_data):
# #
# Write Byte to the PLL # Write Byte to the PLL
...@@ -150,26 +178,21 @@ class PllClass: ...@@ -150,26 +178,21 @@ class PllClass:
if DEBUG: if DEBUG:
stri = "Write to address : 0x{1:{fill}2x} value 0x{0:{fill}2x}".format(wr_data, reg_address, fill='0') stri = "Write to address : 0x{1:{fill}2x} value 0x{0:{fill}2x}".format(wr_data, reg_address, fill='0')
print(stri) print(stri)
self.dev_i2c_pll.write_bytes(0x06, 0x2C) rw_reg_pll = 0b00101101 # 1 is input
self.dev_i2c_pll.write_bytes(0x06, rw_reg_pll)
rd_bytes = self.dev_i2c_pll.read_bytes(0x06, 1) rd_bytes = self.dev_i2c_pll.read_bytes(0x06, 1)
if DEBUG: if DEBUG:
stri = "IO expander wrote 0x{0:x}, read 0x{1}".format(0x2C, rd_bytes[1]) stri = "IO expander wrote 0x{0:x}, read 0x{1}".format(rw_reg_pll, rd_bytes[1])
print(stri) print(stri)
nof_bytes = 1 nof_bytes = 1
data = (pll_rw << 23) + (nof_bytes << 21) + (reg_address << 8) + wr_data data = (pll_rw << 23) + ((nof_bytes-1) << 21) + (reg_address << 8) + wr_data
bit_array = "{0:{fill}24b}".format(data, fill='0') bit_array = "{0:{fill}24b}".format(data, fill='0')
self.dev_i2c_pll.write_bytes(0x02, 0x02 | (0x1 << APSCT_I2C.CS)) self.dev_i2c_pll.write_bytes(0x02, 0x02 | (0x1 << APSCT_I2C.CS))
for bit in bit_array: for bit in bit_array:
for clk in range(2): for clk in [0, 1, 0]: #range(2):
write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (int(bit) << APSCT_I2C.SDI) write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (int(bit) << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data) self.dev_i2c_pll.write_bytes(0x02, write_data)
for clk in range(2): sleep(sleep_time)
write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK)
self.dev_i2c_pll.write_bytes(0x02, write_data)
for clk in range(2):
write_data = 0x02 | (1 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK)
self.dev_i2c_pll.write_bytes(0x02, write_data)
write_data = 0x02 | (1 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI) write_data = 0x02 | (1 << 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(0x02, write_data)
...@@ -178,24 +201,36 @@ class PllClass: ...@@ -178,24 +201,36 @@ class PllClass:
# Read byte from the PLL # Read byte from the PLL
# #
pll_rw = 0x01 # 0 for write, 1 for read pll_rw = 0x01 # 0 for write, 1 for read
read_bit = ''
self.dev_i2c_pll.write_bytes(0x06, 0x2C) self.dev_i2c_pll.write_bytes(0x06, 0x2C)
data = (pll_rw << 15) + (nof_bytes << 13) + reg_address data = (pll_rw << 15) + ((nof_bytes-1) << 13) + reg_address
bit_array = "{0:{fill}16b}".format(data, fill='0') bit_array = "{0:{fill}16b}".format(data, fill='0')
if DEBUG:
print(f"Write data: {bit_array}")
write_data = 0x02 | (0 << APSCT_I2C.CS) | (0 << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(sleep_time)
for bit in bit_array: for bit in bit_array:
for clk in range(2): for clk in [0,1,0]:
write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (int(bit) << APSCT_I2C.SDI) 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) self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(sleep_time) sleep(sleep_time)
read_bit = '' # 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 cnt in range(8*nof_bytes):
for clk in [0, 1]: # Read after rizing edge for clk in [0, 1]: #[0, 1, 0]: # Read after rizing edge
write_data = 0x02 | (clk << APSCT_I2C.SCLK) | (int(bit_array[-1]) << APSCT_I2C.SDI) write_data = 0x02 | (0 << APSCT_I2C.CS) | (clk << APSCT_I2C.SCLK) | (0 << APSCT_I2C.SDI)
self.dev_i2c_pll.write_bytes(0x02, write_data) self.dev_i2c_pll.write_bytes(0x02, write_data)
sleep(sleep_time)
ret_ack, ret_value = self.dev_i2c_pll.read_bytes(0x00, 1) ret_ack, ret_value = self.dev_i2c_pll.read_bytes(0x00, 1)
if ret_ack: if ret_ack:
read_bit += str((int(ret_value, 16) >> APSCT_I2C.SDO) & 0x01) read_bit += str((int(ret_value, 16) >> APSCT_I2C.SDO) & 0x01)
else: else:
print("ACK nok") print("ACK nok")
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) write_data = 0x02 | (1 << 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(0x02, write_data)
if DEBUG: if DEBUG:
...@@ -212,7 +247,7 @@ class PllClass: ...@@ -212,7 +247,7 @@ class PllClass:
divider_r = 1 divider_r = 1
divider_a = 0 divider_a = 0
divider_p = 2 divider_p = 2
divider_b = (self.frequency * divider_r) / (10 * divider_p) divider_b = int((int(self.frequency[:-3]) * divider_r) / (10 * divider_p))
charge_pump_current = 3 # 0 is low (0.6 mA), 7 is high (4.8 mA) charge_pump_current = 3 # 0 is low (0.6 mA), 7 is high (4.8 mA)
if self.frequency == '160MHz': if self.frequency == '160MHz':
i2c_address = APSCT_I2C.PLL_200M i2c_address = APSCT_I2C.PLL_200M
...@@ -246,7 +281,7 @@ class PllClass: ...@@ -246,7 +281,7 @@ class PllClass:
# #
# Read all registers on the PLL and print on screen # Read all registers on the PLL and print on screen
# #
bytes_to_read = 12 bytes_to_read = 90
ret_value = self.read_byte_pll(0, nof_bytes=bytes_to_read) ret_value = self.read_byte_pll(0, nof_bytes=bytes_to_read)
for cnt in range(bytes_to_read): for cnt in range(bytes_to_read):
start = cnt*8 start = cnt*8
...@@ -263,8 +298,8 @@ class PllClass: ...@@ -263,8 +298,8 @@ class PllClass:
i2_c_io_device = I2C(0x21, BUSNR=I2CBUSNR) i2_c_io_device = I2C(0x21, BUSNR=I2CBUSNR)
i2_c_io_device.write_bytes(0x06, 0x2C) # '0' is output i2_c_io_device.write_bytes(0x06, 0x2C) # '0' is output
i2_c_io_device.write_bytes(0x07, 0x00) # '0' is output i2_c_io_device.write_bytes(0x07, 0x00) # '0' is output
ack, ret_value = i2_c_io_device_b.read_bytes(0x00, 1) ack, ret_value = i2_c_io_device.read_bytes(0x00, 1)
status_pll = ret_value & 0x02 status_pll = int(ret_value) & 0x02
if status_pll == 0x02: if status_pll == 0x02:
self.lock = True self.lock = True
stri = f"PLL {self.frequency} is in lock" stri = f"PLL {self.frequency} is in lock"
...@@ -609,3 +644,23 @@ class ApsctId: ...@@ -609,3 +644,23 @@ class ApsctId:
else: else:
print(f"ERROR : Back ID is 0x{self.id:02X} expected 0x{63:2X}") print(f"ERROR : Back ID is 0x{self.id:02X} expected 0x{63:2X}")
return False return False
def main():
apsct = ApsctClass()
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()
if __name__ == "__main__":
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment