diff --git a/APSPU_I2C.py b/APSPU_I2C.py index 7d3584dea5e1b107bf10cb281de6694f7b0722f8..ca6f97e258fae7fc30adf186a1893b04c53ac4b5 100644 --- a/APSPU_I2C.py +++ b/APSPU_I2C.py @@ -37,9 +37,9 @@ VOUT_POLS = {"CTR_LBA": 8.0, "CTR_RCU2_A": 5.60009765625, "CTR_RCU2_D": 3.2998046875} -IOUT_POLS = {"CTR_LBA": 0.45, - "CTR_RCU2_A": 0.7, - "CTR_RCU2_D": 0.3} +IOUT_POLS = {"CTR_LBA": 0.2, + "CTR_RCU2_A": 0.6, + "CTR_RCU2_D": 0.2} LP_VIN = 0x88 LP_VOUT_MODE = 0x20 @@ -56,7 +56,8 @@ LP_VOUT_UV_LIMIT = 0x44 LP_STORE_USER_ALL = 0x15 LP_ON_OFF_CONFIG = 0x02 LP_OPERATION = 0x01 - +LP_WRITE_PROTECT = 0x10 +LP_STORE_DEFAULT_ALL = 0x12 # # Central I2C Devices # diff --git a/I2C_serial_pi.py b/I2C_serial_pi.py index 7d22124fd1e224f856ba29d290ad8fe59f104b89..d4cc4cccb0550528e753cc89ef9c46d8d9fa1f1b 100644 --- a/I2C_serial_pi.py +++ b/I2C_serial_pi.py @@ -51,7 +51,7 @@ class I2C: ret_ack = 0 ret_value = 'ffff' if DEBUG: - print("Reading error") + print("Reading IO-error") return ret_ack, ret_value @@ -81,8 +81,10 @@ class I2C: def write_bytes(self, register, data): bus = smbus.SMBus(self.bus_nr) + if type(data) is not list: + data = [data] try: - bus.write_i2c_block_data(self.I2C_Address, register, [data]) + bus.write_i2c_block_data(self.I2C_Address, register, data) ret_ack = 1 if SLOW: sleep(0.3) @@ -95,7 +97,7 @@ class I2C: ret_ack = 0 ret_value = 0 if DEBUG: - print("Write error") + print("Write IO-error") return ret_ack def write_register(self, register): @@ -114,7 +116,7 @@ class I2C: ret_ack = 0 ret_value = 0 if DEBUG: - print("Write error") + print("Write IO-error") return ret_ack def write_pointer(self, register): @@ -133,7 +135,7 @@ class I2C: ret_ack = 0 ret_value = 0 if DEBUG: - print("Write error") + print("Write IO-error") return ret_ack def ack_check(self): @@ -153,7 +155,7 @@ class I2C: ret_ack = 0 ret_value = 0 if DEBUG: - print("No ACK") + print("No ACK IO-Error") return ret_ack if __name__ == "__main__": diff --git a/I2C_serial_pi2.py b/I2C_serial_pi2.py index 5ae5af3976e9d28807f0eaa4b0f894a72ff1b8ec..4da3bf406cf0a3e554eeb2dc3232ff5b96b915d3 100644 --- a/I2C_serial_pi2.py +++ b/I2C_serial_pi2.py @@ -97,7 +97,8 @@ class I2C: def write_pointer(self, register): bus = pi.i2c_open(self.bus_nr, self.I2C_Address) try: - pi.i2c_read_device(bus, 1) +# pi.i2c_read_device(bus, 1) + pi.i2c_read_device(bus, register) ret_ack = 1 if SLOW: sleep(0.3) @@ -109,6 +110,20 @@ class I2C: pi.i2c_close(bus) return ret_ack + def write_register(self, register): + bus = pi.i2c_open(self.bus_nr, self.I2C_Address) + try: + ret_value = pi.i2c_write_device(bus, [register]) + ret_ack = 1 + if SLOW: + sleep(0.3) + except IOError: + ret_ack = 0 + ret_value = 0 + if DEBUG: + print("No ACK") + return ret_ack + def ack_check(self): bus = smbus.SMBus(self.bus_nr) try: diff --git a/I2C_serial_pi3.py b/I2C_serial_pi3.py new file mode 100644 index 0000000000000000000000000000000000000000..adfa428918bf52094dd9ea55c851782bc7ad8668 --- /dev/null +++ b/I2C_serial_pi3.py @@ -0,0 +1,146 @@ +''' +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. + +I2C_serial_Pi +Started by Gijs + +Class for using the I2C bus of the I2C. This class is used for the +basic I2C scripts to read and write the RCU2, PCC etc. + +''' +import smbus2 +import sys +from time import * + +DEBUG = False #True +SLOW = False + + +class I2C: + + def __init__(self, ADDRESS='040',BUSNR=3): + self.I2C_Address = ADDRESS + self.bus_nr = BUSNR + + def close(self): + bus = smbus2.SMBus(self.bus_nr) + bus.close() + return True + + def open(self): + bus = smbus2.SMBus(self.bus_nr) + bus.open(self.bus_nr) + return True + + def read_bytes(self, register, bytes_to_read=2): + bus = smbus2.SMBus(self.bus_nr) + try: + rd_value = bus.read_i2c_block_data(self.I2C_Address, register, bytes_to_read) + ret_value = '' + for cnt in range(bytes_to_read): + ret_value += (hex(rd_value[cnt])[2:]) + ret_ack = 1 + if SLOW: + sleep(0.2) + except IOError: + ret_ack = 0 + ret_value = 'ffff' + if DEBUG: + print("Reading IO-error") + return ret_ack, ret_value + + + def read_last_reg(self, bytes_to_read): + bus = smbus2.SMBus(self.bus_nr) + rd_value = [] + ret_value = '' + for cnt in range(bytes_to_read): + try: + rd_value.append(bus.read_byte(self.I2C_Address)) + ret_ack = 1 + if SLOW: + sleep(0.2) + except IOError: + ret_ack = 0 + rd_value.append(0) + if DEBUG: + print("IO-Reading error") + for cnt in range(bytes_to_read): + ret_value += (hex(rd_value[cnt])[2:]) + return ret_ack,ret_value + + def write_bytes(self, register, data): + bus = smbus2.SMBus(self.bus_nr) + if type(data) is not list: + data = [data] + try: + bus.write_i2c_block_data(self.I2C_Address, register, data) + ret_ack = 1 + if SLOW: + sleep(0.3) + except IOError: + ret_ack = 0 + ret_value = 0 + if DEBUG: + print("Write IO-error") + return ret_ack + + def write_register(self, register): + bus = smbus2.SMBus(self.bus_nr) + try: + bus.write_byte(self.I2C_Address, register) +# print(f"Wrote {register:x}") + ret_ack = 1 + if SLOW: + sleep(0.3) + except IOError: + ret_ack = 0 + ret_value = 0 +# if DEBUG: + print("Write IO-error") + return ret_ack + + def write_pointer(self, register): + bus = smbus2.SMBus(self.bus_nr) + try: + ret_value = bus.read_i2c_block_data(self.I2C_Address, register, 1) + ret_ack = 1 + if SLOW: + sleep(0.3) + except IOError: + ret_ack = 0 + ret_value = 0 + if DEBUG: + print("Write IO-error") + return ret_ack + + def ack_check(self): + bus = smbus2.SMBus(self.bus_nr) + try: + print("check ACK") + ret_value = bus.write_quick(self.I2C_Address) + ret_ack = 1 + if SLOW: + sleep(0.3) + except IOError: + ret_ack = 0 + ret_value = 0 + if DEBUG: + print("No ACK IO-Error") + return ret_ack + +if __name__ == "__main__": + I2C_Device = I2C(0x40) + I2C_Device.write_bytes(0x00, 0x00) + ret_ack, ret_value = I2C_Device.read_bytes(0x8C, 2) + print(ret_value) diff --git a/apspu_lib.py b/apspu_lib.py index 4cb45a8d5f7e0a2d38a0112e5440a46fe04bb973..be387ca6acb956d38e17198ba0911ad2e271b97a 100644 --- a/apspu_lib.py +++ b/apspu_lib.py @@ -25,13 +25,13 @@ from APSPU_I2C import * if os.name == "posix": - from I2C_serial_pi2 import * + from I2C_serial_pi3 import * else: from I2C_serial import * I2CBUSNR = 1 # Bus used on the Pi DEBUG = False # Set True to print debug information on the screen - +I_OK_MARGIN = 0.5 # I_error in Amps class ApspuClass: # @@ -84,6 +84,7 @@ class ApspuClass: f"set {1.2*VOUT_POLS[pol.name]} read back {ov_out}") exit() pol.set_on_off_config() + pol.on_off(True) pol.write_to_nvm() print("Done") @@ -269,6 +270,7 @@ class PolClass: # ret_ack = False if self.status: + ret_ack = self.pol_dev.write_bytes(LP_WRITE_PROTECT, [0]) set_value = int(value * (2**11)) hex_set_value = hex(set_value) wr_value = (hex_set_value[4:6] + hex_set_value[2:4]) @@ -306,7 +308,16 @@ class PolClass: # # return is always True # - ret_ack = self.pol_dev.write_bytes(LP_STORE_USER_ALL, 0) + print(f"Store to NVM for POL {self.name}") + if False: + ret_ack = self.pol_dev.write_register(0x15) + sleep(1) + else: + self.pol_dev.close() + command = f"i2cset -y 1 0x{CTR_POLS[self.name]:02X} 0x15 cp" + os.system(command) + os.system(command) + self.pol_dev.open() return True def read_vin(self): @@ -460,8 +471,8 @@ class PolClass: check_ok = False print(f"POL {self.name:10} TEMP not OK, expected {temp_low} C - {temp_high} C, measured {self.temp} C ") return check_ok - i_low = 0.75*IOUT_POLS[self.name] - i_high = 1.25*IOUT_POLS[self.name] + i_low = (1-I_OK_MARGIN)*IOUT_POLS[self.name] + i_high = (1+I_OK_MARGIN)*IOUT_POLS[self.name] if i_low < self.iout < i_high: check_ok = True else: