From 3c501ce83461fa306593b1ce8e6673582b83dfcc Mon Sep 17 00:00:00 2001 From: kruger <kruger@astron.nl> Date: Wed, 4 Dec 2024 07:34:08 +0000 Subject: [PATCH] I2C using SMBUS2 (solving memory leak) --- pypcc/config/APSCTTR.yaml | 2 +- pypcc/i2cserv/i2c_smbus2.py | 53 +++++++++++++++++++++++++++++++++++++ pypcc/i2cserv/i2c_switch.py | 3 ++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 pypcc/i2cserv/i2c_smbus2.py diff --git a/pypcc/config/APSCTTR.yaml b/pypcc/config/APSCTTR.yaml index 9c5f7c4..85a8a0d 100644 --- a/pypcc/config/APSCTTR.yaml +++ b/pypcc/config/APSCTTR.yaml @@ -3,7 +3,7 @@ description: "1234" drivers: - name: I2C - type: i2c + type: i2c_smbus2 parameters: [5] #I2C port number - name: I2C_CLK type: i2c_dev #I2C devices diff --git a/pypcc/i2cserv/i2c_smbus2.py b/pypcc/i2cserv/i2c_smbus2.py new file mode 100644 index 0000000..962255f --- /dev/null +++ b/pypcc/i2cserv/i2c_smbus2.py @@ -0,0 +1,53 @@ +import os +from smbus2 import SMBus,i2c_msg +import time +import logging +#read=0: write to register +#read=1: read from register +#read=2: write to register (common in group) +#read=3: wait ms second +from .hwdev import hwdev; + +class i2c_smbus2(hwdev): + def __init__(self,config): + hwdev.__init__(self,config); + self.bus_nr=config['parameters'][0] + logging.info("smbus2 driver on bus "+str(self.bus_nr)) + self.bus = SMBus(self.bus_nr) + self.I2Ccounter=0 + + + def i2csetget(self,addr,data,reg=None,read=0): +# logging.debug(str(("I2C",addr,reg,data,read))) + try: +# if True: + if read==3: + time.sleep(data[0]/1000.) + return True + + if read==1: + if not(reg is None): + data[:]=self.bus.read_i2c_block_data(addr, reg, len(data)) + else: + msg=i2c_msg.read(addr,len(data)) + self.bus.i2c_rdwr(msg) + if len(msg)!=len(data): + logging.debug(str(("I2C get failed",addr,reg,data,read))) + data[0]=0; + return False + + data[:]=list(msg) + logging.debug(str(("I2C get",addr,reg,data,read))) + else: + if not(reg is None): + self.bus.write_i2c_block_data(addr, reg, data) + else: + msg=i2c_msg.write(addr,data) + self.bus.i2c_rdwr(msg) + return True; + except: +# else: + logging.debug("I2C failed!") + if len(data)>0: data[0]=0 + return False; + diff --git a/pypcc/i2cserv/i2c_switch.py b/pypcc/i2cserv/i2c_switch.py index 7934f2b..dadae41 100644 --- a/pypcc/i2cserv/i2c_switch.py +++ b/pypcc/i2cserv/i2c_switch.py @@ -1,5 +1,6 @@ import logging -from .i2c import i2c +#from .i2c import i2c +from .i2c_smbus2 import i2c_smbus2 as i2c #import HWconf #SWaddr=0x70 -- GitLab