diff --git a/APSCT_CLK_I2C.py b/APSCT_CLK_I2C.py index a89d11f0d5111821c290eb6b7d6e1ef9b8ccff92..1465aa7f3f0f03d773174fb7496fdf19b0292ef1 100644 --- a/APSCT_CLK_I2C.py +++ b/APSCT_CLK_I2C.py @@ -26,12 +26,12 @@ else: DEBUG = False I2CBUSNR=5 sleep_time = 0.15 -SET_PLL = True -READ_LOCK = False #True -READ_ALL = True #False +SET_PLL = False #True +READ_LOCK = True +READ_ALL = False CHECK_EEPROM = False -PWR_RST = True #False -READ_SENSOR = True +PWR_RST = False #True #False +READ_SENSOR = False #True READ_REGS = False #True CLK_FREQ = '200MHz' @@ -151,13 +151,16 @@ def setup_pll(pll_frequency='200MHz') : if pll_frequency == '160MHz': print("Set PLL to 160 MHz mode") pll_address = PLL_160M - I2C_device.write_bytes(0x03, 0x0F) + I2C_device.write_bytes(0x03, 0x08) else: print("Set PLL to 200 MHz mode") pll_address=PLL_200M - I2C_device.write_bytes(0x03, 0xFF) + I2C_device.write_bytes(0x03, 0x28) + Write_byte_PLL(0x03, 0x0C, pll_address) + sleep(0.5) + Write_byte_PLL(0x03, 0x08, pll_address) Write_byte_PLL(0x03, 0x08, pll_address) - Write_byte_PLL(0x04, 0x00, pll_address) # CF disable not used outputs, 00 enable all + Write_byte_PLL(0x04, 0xCF, pll_address) # CF disable not used outputs, 00 enable all Write_byte_PLL(0x05, 0x97, pll_address) Write_byte_PLL(0x06, 0x10, pll_address) # cp inv = 0xF4 other 0xE4 Write_byte_PLL(0x07, 0x04, pll_address) # Divider R = 1 dec @@ -169,11 +172,11 @@ def setup_pll(pll_frequency='200MHz') : else: Write_byte_PLL(0x0A, 0x14, pll_address) Write_byte_PLL(0x09, 0x00, pll_address) - Write_byte_PLL(0x0C, 0x80, pll_address) - Write_byte_PLL(0x0D, 0x01, pll_address) # Dig CLK = 200/1 = 200 MHz - Write_byte_PLL(0x0F, 0x01, pll_address) # RCU CLK = 200/1 = 200 MHz - Write_byte_PLL(0x11, 0x01, pll_address) # PPS ref CLK = 200/1 = 200 MHz - Write_byte_PLL(0x13, 0x01, pll_address) # T.P. CLK = 200/1 = 200 MHz + Write_byte_PLL(0x0C, 0x8F, pll_address) + Write_byte_PLL(0x0D, 0x88, pll_address) # Dig CLK = 200/1 = 200 MHz + Write_byte_PLL(0x0F, 0x08, pll_address) # RCU CLK = 200/1 = 200 MHz + Write_byte_PLL(0x11, 0x08, pll_address) # PPS ref CLK = 200/1 = 200 MHz + Write_byte_PLL(0x13, 0x88, pll_address) # T.P. CLK = 200/1 = 200 MHz def power(state): @@ -274,9 +277,9 @@ def read_temp(): one_step = Vref/(2**(16)) I2C_device = I2C(addr, BUSNR=I2CBUSNR) temp_slope = 93.5E-6 * 2**(16+1) / Vref - sleep(0.5) + sleep(1.0) I2C_device.write_bytes(0xA0, 0xC0) - sleep(0.5) + sleep(1.0) ret_ack, ret_value = I2C_device.read_last_reg(3) if ret_ack: raw_value = (int(ret_value, 16) & 0x1FFFFF) >> 6 @@ -287,9 +290,36 @@ def read_temp(): else: print("Error reading tempeature") + +def read_lol(pll_frequency='200MHz'): + I2C_IO_device_A = I2C(0x20, BUSNR=I2CBUSNR) + I2C_IO_device_A.write_bytes(0x06, 0x2C) # '0' is output + I2C_IO_device_A.write_bytes(0x07, 0x00) # '0' is output + I2C_IO_device_B = I2C(0x21, BUSNR=I2CBUSNR) + I2C_IO_device_B.write_bytes(0x06, 0x2C) # '0' is output + I2C_IO_device_B.write_bytes(0x07, 0xFF) # '0' is output + + ack, ret_value = I2C_IO_device_B.read_bytes(0x01, 1) + status_reg = int(ret_value,16) + if (pll_frequency=='200MHz') & ((status_reg & 0x10) > 0): + print("lost lock 200MHz") + if ((status_reg & 0x20) > 0) & (pll_frequency=='160MHz'): + print("lost lock 160MHz") + ack, ret_value = I2C_IO_device_A.read_bytes(0x01, 1) + old_reg = int(ret_value,16) + I2C_IO_device_A.write_bytes(0x03, (old_reg | 0x10)) # '0' is output + sleep(1) + I2C_IO_device_A.write_bytes(0x03, (old_reg & 0xEF)) # '0' is output + + + + + #if READ_REGS: # read_all_regs_pll(CLK_FREQ) +read_temp() + if CHECK_EEPROM : wr_rd_eeprom() @@ -324,3 +354,4 @@ if READ_ALL: if READ_SENSOR: apsct_sensors() +read_lol(CLK_FREQ) diff --git a/CCD_I2C.py b/CCD_I2C.py deleted file mode 100644 index ce96136a08f66a36c70a5976eb6c0a6014f4dfd4..0000000000000000000000000000000000000000 --- a/CCD_I2C.py +++ /dev/null @@ -1,364 +0,0 @@ -''' -Copyright 2021 Stichting Nederlandse Wetenschappelijk Onderzoek Instituten, -ASTRON Netherlands Institute for Radio Astronomy -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Set CCD - -''' -import sys -import time -import math -sys.path.insert(0,'.') -import os -if os.name =="posix": - from I2C_serial_pi2 import * -else: - from I2C_serial import * - -DEBUG = False -I2CBUSNR=1 -sleep_time = 0.05 -SET_PLL = True -READ_LOCK = True -READ_ALL = True #False -CHECK_EEPROM = False #True -PWR_RST = False -READ_SENSOR = False -READ_SET_FAN = True -CLK_FREQ = '200MHz' -dev_i2c_eeprom = I2C(0x50) -dev_i2c_eeprom.bus_nr = I2CBUSNR - -CS = 6 -SCLK = 4 -SDO = 5 -SDI = 7 -PLL_addr = 0x20 - - -def Write_byte_PLL(reg_address, wr_data, ADDRESS=0x20): - # - # Write Byte to the ADC - # - I2C_device = I2C(ADDRESS, BUSNR=I2CBUSNR) - PLL_rw = 0x00 # 0 for write, 1 for read - stri = "Write : 0x{0:{fill}2x} to Address : 0x{1:{fill}2x}".format(wr_data, reg_address, fill='0') - print(stri) - I2C_device.write_bytes(0x06, 0x2C) - if DEBUG: - rd_bytes = I2C_device.read_bytes(0x06, 1) - stri = "IO expander wrote 0x{0:x}, read 0x{1}".format(0x2C, rd_bytes[1]) - print(stri) - data = (reg_address << 9) + (PLL_rw << 8) + wr_data - bit_array = "{0:{fill}16b}".format(data, fill='0') - I2C_device.write_bytes(0x02, 0x02 | (0x1 << CS)) - for bit in bit_array: - for clk in range(2): - Write_data = 0x02 | (0 << CS) | (clk << SCLK) | (int(bit) << SDI) - I2C_device.write_bytes(0x02, Write_data) - for clk in range(2): - Write_data = 0x02 | (0 << CS) | (clk << SCLK) - I2C_device.write_bytes(0x02, Write_data) - for clk in range(2): - Write_data = 0x02 | (1 << CS) | (clk << SCLK) - I2C_device.write_bytes(0x02, Write_data) - - Write_data = 0x02 | (1 << CS) | (0 << SCLK) | (0 << SDI) - I2C_device.write_bytes(0x02, Write_data) - if DEBUG: - read_bits = Read_byte_PLL(reg_address, nof_bytes=1, ADDRESS=ADDRESS) -# stri = "Bits written 0x{0:x} to register 0x{1:x} read from PLL are {2}".format(wr_data, reg_address, read_bits) -# print(stri) - - -def Read_byte_PLL(reg_address, nof_bytes=1, ADDRESS=0x20 ): - # - # Read Byte from the ADC - # - I2C_device = I2C(ADDRESS, BUSNR=I2CBUSNR) - PLL_rw = 0x01 # 0 for write, 1 for read - - I2C_device.write_bytes(0x06, 0x2C) - data = ( reg_address << 7 ) + PLL_rw - - - bit_array = "{0:{fill}8b}".format(data, fill='0') - for bit in bit_array: - for clk in range(2): - Write_data = 0x02 | (0 << CS) | (clk << SCLK) | ( int(bit) << SDI) - I2C_device.write_bytes(0x02, Write_data) -# sleep(sleep_time) - -# print("read byte") - read_bit = '' - for cnt in range(8*nof_bytes): - for clk in [0, 1]: # Read after rizing edge - Write_data = 0x02 | (clk << SCLK) | ( int(bit) << SDI ) - I2C_device.write_bytes(0x02, Write_data) - ret_ack, ret_value = I2C_device.read_bytes(0x00, 1) -# stri= "ret_value = {}".format(int(ret_value,16)) -# print(stri) - if ret_ack: - read_bit += str((int(ret_value, 16) >> SDO) & 0x01) - else: - print("ACK nok") - Write_data = 0x02 | (1 << CS) | (0 << SCLK) | (0 << SDI) - I2C_device.write_bytes(0x02, Write_data) - 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; - - -def setup_pll() : - I2C_device = I2C(0x20, BUSNR=I2CBUSNR) #clock selection - I2C_device.write_bytes(0x07, 0x00) - Write_byte_PLL(0x03, 0x08, PLL_addr) - Write_byte_PLL(0x04, 0xFF, PLL_addr) # CF disable not used outputs, 00 enable all - Write_byte_PLL(0x05, 0xD7, PLL_addr) - Write_byte_PLL(0x06, 0xE0, PLL_addr) # cp inv = 0xF4 other 0xE4 - Write_byte_PLL(0x07, 0x04, PLL_addr) # Divider R = 1 dec - Write_byte_PLL(0x08, 0x01, PLL_addr) - Write_byte_PLL(0x07, 0x00, PLL_addr) - Write_byte_PLL(0x09, 0x10, PLL_addr) - Write_byte_PLL(0x0A, 0x01, PLL_addr) - Write_byte_PLL(0x09, 0x00, PLL_addr) - Write_byte_PLL(0x0B, 0x00, PLL_addr) - Write_byte_PLL(0x0D, 0x01, PLL_addr) - Write_byte_PLL(0x0E, 0x00, PLL_addr) - Write_byte_PLL(0x0F, 0x01, PLL_addr) - Write_byte_PLL(0x10, 0x00, PLL_addr) - Write_byte_PLL(0x11, 0x01, PLL_addr) - Write_byte_PLL(0x12, 0x00, PLL_addr) - Write_byte_PLL(0x13, 0x01, PLL_addr) - Write_byte_PLL(0x14, 0x01, PLL_addr) - - - -def power(state): - I2C_IO_device_A = I2C(0x20, BUSNR=I2CBUSNR) - I2C_IO_device_A.write_bytes(0x06, 0x2C) # '0' is output - I2C_IO_device_A.write_bytes(0x07, 0x00) # '0' is output - I2C_IO_device_B = I2C(0x21, BUSNR=I2CBUSNR) - I2C_IO_device_B.write_bytes(0x06, 0x2C) # '0' is output - if state: - bits_to_set_A1 = 0x02 | (1 << CS) | (0 << SCLK) | (0 << SDI) - bits_to_set_A2 = 0x04 - bits_to_set_B1 = 0x02 | (1 << CS) | (0 << SCLK) | (0 << SDI) - else: - bits_to_set_A1 = 0x00 | (1 << CS) | (0 << SCLK) | (0 << SDI) - bits_to_set_A2 = 0x00 - bits_to_set_B1 = 0x00 | (1 << CS) | (0 << SCLK) | (0 << 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(0x03, bits_to_set_A2) - I2C_IO_device_B.write_bytes(0x02, bits_to_set_B1) - -def write_eeprom( data=0x01): - # - # Write the EEPROM with the serial number etc. - # - ret_ack, ret_value = dev_i2c_eeprom.read_bytes(0) - if ret_ack < 1: - print("EEPROM not found during write") - return False - else: - dev_i2c_eeprom.write_bytes(0x00, data) - sleep(0.1) - return True - -def read_eeprom(): - # - # Read the EEPROM with the serial number etc. - # - ret_ack, ret_value = dev_i2c_eeprom.read_last_reg(1) - if ret_ack < 1: - print("no EEPROM found during read") - return False - else: - ret_ack, ret_value = dev_i2c_eeprom.read_bytes(0x00, 1) - return ret_value - -def wr_rd_eeprom(value=0x34): - # - # Write and Read the EEPROM to check functionality - # - if write_eeprom(value): - ret_value = read_eeprom() - stri = "Wrote to EEPROM: 0x{0:X}, Read from EEPROM: 0x{1} ".format(value, ret_value) - print(stri) - return True - -def ccd_sensors(): - for sens_line in range(7): - read_voltage(sens_line) - read_temp() - -def read_voltage(input_channel=0): - addr = 0x74 - Vref = 3.0 - one_step = Vref/(2**(16)) - I2C_device = I2C(addr, BUSNR=I2CBUSNR) - channel_select_word = 0xB0 | ((input_channel%2) << 3) | ((input_channel >> 1) & 0x7) - if DEBUG: - stri = "Word to select sens input is 0x{0:x}".format(channel_select_word) - print(stri) - sleep(0.1) - I2C_device.write_bytes(channel_select_word, 0xB8) - sleep(0.1) - ret_ack, ret_value = I2C_device.read_last_reg(3) - while len(ret_value) < 5: - sleep(0.1) - ret_ack, ret_value = I2C_device.read_last_reg(3) - - if ret_ack: - if DEBUG: - stri = "Return value input 0 : 0x{0} ".format(ret_value) - print(stri) - if int(ret_value, 16) >= 0xC00000: - print("over range") - else: - steps = (int(ret_value, 16) & 0x1FFFFF) >> 6 - voltage = one_step * steps - voltage = ((4.7+2.2)/2.2)*2*voltage - string = "Voltage sens line {1} is {0:.4f} V".format(voltage, input_channel) - print(string) - else: - stri = " No ACK on device 0x{0:x} ".format(addr) - print(stri) - -def read_temp(): - Vref = 3.0 - addr = 0x74 - one_step = Vref/(2**(16)) - I2C_device = I2C(addr, BUSNR=I2CBUSNR) - temp_slope = 93.5E-6 * 2**(16+1) / Vref - sleep(0.5) - I2C_device.write_bytes(0xA0, 0xC0) - sleep(0.5) - ret_ack, ret_value = I2C_device.read_last_reg(3) - sleep(0.5) - if ret_ack: - raw_value = (int(ret_value, 16) & 0x1FFFFF) >> 6 - temperature_K = (raw_value/temp_slope) - temperature = temperature_K-273 - stri = "Temperature : {0:.2f} gr. C".format(temperature) - print(stri) - else: - print("Error reading tempeature") - -def set_fan_off(): - # - # Switch CCD fan off - # - print("Switch fan off") - MAX6620 = 0x29 - fanmonitor_dev = I2C(MAX6620) - fanmonitor_dev.bus_nr = 1 # 3 - fanmonitor_dev.write_bytes(0x00, 0x10) - fanmonitor_dev.write_bytes(0x02, 0x08) - fanmonitor_dev.write_bytes(0x28, 0x00) - fanmonitor_dev.write_bytes(0x29, 0x00) - sleep(1) - -def set_fan_speed(speed): - # - # Set control voltage of fan PNP - # - stri = "Set fan to {} %".format(speed) - print(stri) - MAX6620 = 0x29 - reg_a = int((speed/100)*127) + 100 - fanmonitor_dev = I2C(MAX6620) - fanmonitor_dev.bus_nr = 1 - fanmonitor_dev.write_bytes(0x00, 0x00) - fanmonitor_dev.write_bytes(0x02, 0x08) - fanmonitor_dev.write_bytes(0x01, 0x0F) - fanmonitor_dev.write_bytes(0x06, 0x60) - fanmonitor_dev.write_bytes(0x28, reg_a) - fanmonitor_dev.write_bytes(0x29, 0x80) - sleep(1) - -def read_tacho(): - # - # Read the fan speed - # - MAX6620 = 0x29 - REG_TACH_MSP_REGS = [ 0x10, 0x12, 0x14] - REG_TACH_LSP_REGS = [ 0x11, 0x13, 0x15] - TACH_PERIODS = 16 - TACH_COUNT_FREQ = 8192 - FAN_TACHS = 1 - DEBUG=1 - fanmonitor_dev = I2C(MAX6620) - fanmonitor_dev.bus_nr = 1 #3 - fan_nr=0 - ret_ack, ret_value = fanmonitor_dev.read_bytes(1) - if ret_ack < 1: - stri = " Device {0} at address 0x{1:X} not found".format("MAX6620", MAX6620) - print(stri) - status = False - ret_ack, tach_msb = fanmonitor_dev.read_bytes(REG_TACH_MSP_REGS[0], 1) - tach_msb = int(tach_msb, 16) & 0xFF - if tach_msb > 254: - if DEBUG : - tach_lsb = 255 - tach = 99999 - rpm = 0 - else: - ret_ack, tach_lsb = fanmonitor_dev.read_bytes(REG_TACH_LSP_REGS[0], 1) - tach_lsb = int(tach_lsb, 16) & 0xE0 - tach = tach_msb*16 + tach_lsb/8 - rpm = float((TACH_COUNT_FREQ*TACH_PERIODS*60))/(FAN_TACHS*tach) - if DEBUG: - stri = "MSB: {0}, LSB: {1}, TACH : {2}, RPM : {3:6.2f}".format(tach_msb, tach_lsb, tach, rpm) - print(stri) - -if CHECK_EEPROM : - wr_rd_eeprom() - -if PWR_RST : - power(False) - sleep(10) - power(True) - -if SET_PLL : - setup_pll() - -if READ_LOCK: - ret_value = Read_byte_PLL(0x00, nof_bytes = 1, ADDRESS=PLL_addr) - status_pll = int(ret_value,2) - if status_pll == 0x04: - print("PLL in lock") - elif (status_pll & 0x10) > 0: - print("Not Locked --> No 10 MHz ref") - else: - print("Not locked --> PLL Error") -if READ_SET_FAN : - read_tacho() - set_fan_off() - read_tacho() - sleep(5) - set_fan_speed(50) - sleep(5) - read_tacho() - set_fan_speed(100) - sleep(5) - read_tacho() - read_temp() - ccd_sensors() - -if READ_SENSOR: - read_tacho() - read_temp() - ccd_sensors() diff --git a/check_UNB_sens.py b/check_UNB_sens.py new file mode 100644 index 0000000000000000000000000000000000000000..07925a3ca91b6f30a2961faf28e77b8bcfe62eec --- /dev/null +++ b/check_UNB_sens.py @@ -0,0 +1,26 @@ +""" Script for testing I2C monitor sensors + +""" + +from test_common import * +from time import sleep +connect("opc.tcp://10.87.6.89:4841/") + +#POLS=["UNB2_POL_SWITCH_PHY","UNB2_POL_SWITCH_1V2", "UNB2_FPGA_POL_CORE"] +POLS=["UNB2_FPGA_POL_CORE", "UNB2_FPGA_POL_ERAM", "UNB2_FPGA_POL_RXGXB", "UNB2_FPGA_POL_TXGXB" , "UNB2_FPGA_POL_HGXB", "UNB2_FPGA_POL_PGM", "UNB2_DC_DC_48V_12V", "UNB2_POL_QSFP_N01", "UNB2_POL_QSFP_N23", "UNB2_POL_SWITCH_1V2", "UNB2_POL_SWITCH_PHY" , "UNB2_POL_CLOCK"] +POINTS = ["VOUT", "IOUT", "TEMP"] + +def check_values(values_array, atteribute_to_get): + for check_value in values_array : + if check_value > 50: + stri = "Error in {} {}".format(atteribute_to_get, check_value) + print(stri) + +for loops in range(350): + print(loops) + for sens_cnt in range(len(POLS)*len(POINTS)): + atteribute_to_get = POLS[int(sens_cnt/3)] + "_" + POINTS[sens_cnt%3] + "_R" + ret_value = get_value(atteribute_to_get) + check_values(ret_value, atteribute_to_get) + sleep(5) +print("done") diff --git a/spi_switch_Unb2c.py b/spi_switch_Unb2c.py index 9ddd737031091e3ed68a3ade7f1daf3a1f2b5ea6..713e7ea4fe37769fb8b2058bcf3d343177802139 100644 --- a/spi_switch_Unb2c.py +++ b/spi_switch_Unb2c.py @@ -31,6 +31,7 @@ import sys import spidev DEBUG=False +CRC = False #True # CRC or packet counter # We only have SPI bus 0 available to us on the Pi bus = 0 @@ -136,7 +137,7 @@ def read_link_status(): stri = "| " for cnt_port in range(16): if ret[3] & (0x8000 >> cnt_port) : - stri += "U | " + stri += "P | " else: stri += " | " print(stri) @@ -166,6 +167,9 @@ def read_link_status(): stri += "Rx: Er " if ret[2] & 0x40: stri += "Rx FIFO Er " +# ret_err = read_switch(0x10+cnt,0x2E, pr_stri = False) +# stri += f"CRC errs: 0x{ret_err[1]:2x}" +# rest = write_switch_bytes(0x01,0x23, [0x40], pr_stri = False) else: stri += "link down " print(stri) @@ -208,7 +212,7 @@ def read_link_status(): read_switch(0x10+cnt,0x2e) if 1: # alternative status read out, works better for SerDes lines. - for prt_cnt in [9, 10, 11,12, 13,14, 15]: + for prt_cnt in [8, 9, 10, 11,12, 13,14, 15]: ret = read_switch(0x10+prt_cnt,0x28, pr_stri = False) stri = "Port status of " + str(prt_cnt) + " " if ret[1] & 0x02: @@ -235,6 +239,19 @@ def read_link_status(): stri += "Rx Fifo Err " if ret[2] & 0x80: stri += "Tx Fifo Err " + ret = read_switch(0x10+prt_cnt,0x2E, pr_stri = False) + if CRC: + rest = write_switch_bytes(0x10+prt_cnt,0x34, [0x20, 0x10], pr_stri = False) + rest = write_switch_bytes(0x10+prt_cnt,0x3e, [0x00, 0x00], pr_stri = False) + rest = write_switch_bytes(0x10+prt_cnt,0x20, [0xD0, 0x01], pr_stri = False) + stri += f"CRC err: {ret[0]} " + else: + rest = write_switch_bytes(0x10+prt_cnt,0x3e, [0x00, 0x00], pr_stri = False) + rest = write_switch_bytes(0x10+prt_cnt,0x20, [0xD0, 0x09], pr_stri = False) + stri += f"Rx packet count: {ret[0]} " + rest = write_switch_bytes(0x10+prt_cnt,0x22, [0x41, 0x41], pr_stri = False) + rest = write_switch_bytes(0x10+prt_cnt,0x3e, [0x00, 0x00], pr_stri = False) + rest = write_switch_bytes(0x10+prt_cnt,0x2E, [0x00, 0x00], pr_stri = False) else: stri += "Down " print(stri)