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

Merge branch 'master' into 'apsct_production'

# Conflicts:
#   I2C_serial_pi.py
parents e8627ae5 9d5dc319
Branches
No related tags found
1 merge request!3Apsct production
......@@ -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
#
......
......@@ -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__":
......
......@@ -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:
......
'''
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)
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment