diff --git a/clk/CLK.py b/clk/CLK.py index a7dee31b6e9fe9ff0a80860d2d55ce7195d057eb..decd383dccc925bc7536d7c8c253c977b42d5d3e 100644 --- a/clk/CLK.py +++ b/clk/CLK.py @@ -1,7 +1,7 @@ from . import Vars import numpy as np import logging -#from .spibitbang1 import * +from .spibitbang2 import * import threading @@ -30,17 +30,31 @@ def int2bytes(i): i>>=8; return [i]+b; +def strs2bytes(var): +# print("str2bytes",var) + if len(var)==0: return var; + if isinstance(var[0],str): #make string a byte array +# return [ord(c.encode('utf-8')[0]) for s in var for c in s] + return [c.encode('utf-8')[0] for s in var for c in s] + return var + +def bytes2strs(var,step,dtype): + if not(dtype==Vars.datatype.dstring): return var + cnt=int(len(var)/step) + print(var) + return [(bytearray(var[i*step:(i+1)*step]).decode("utf-8")) for i in range(cnt)] + class RCU1(): def __init__(self,number,I2Ccallback,Switchcallback): self.N=number; self.I2Ccallback=I2Ccallback self.SWcallback=Switchcallback - self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int') + self.previous =np.zeros([number,Vars.RCU_storeReg],dtype='int') + self.previousHBA=np.zeros([number,3,32],dtype='int') def load(self): Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[]) #Read the current status of GPIO IOs self.SetVar(Inst1) - #Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0] #Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0] @@ -61,59 +75,72 @@ class RCU1(): #print(Vars.RCU) - def SetVar(self,Instr): + def SetVar(self,Instr,Mask=[]): +# Instr.value=strs2bytes(Instr.value) #Alwast be an array of bytes + if (self.N==1): Mask=[True] if Instr.type==Vars.DevType.Instr: #Execute instructions Iset=Instr.dev; + if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_value() for i in Iset.instr: logging.debug(str(("Inst",i))) - self.SetVar(i) + self.SetVar(i,Mask=Mask) return; if Instr.type in [Vars.DevType.I2C,Vars.DevType.SPIbb,Vars.DevType.I2Cbb]: + if len(Mask)==0: Mask=Vars.RCU_mask.OPCW.get_value() + mask=0; RCU0=-1; - mask=0 for RCUi in range(self.N): + if (Mask[RCUi]): mask|=1<<Vars.RCU_MPaddr.Switch[RCUi] if RCU0<0: RCU0=RCUi; if RCU0<0: return; #Mask all zero self.SWcallback(mask) if Instr.type==Vars.DevType.I2C: logging.info(str(('** Set I2C:',Instr.dev,Instr.value))) - self.SetI2C(RCU0,Instr.dev,8,0,Instr.value) + self.SetI2C(RCU0,Instr.dev,8,0,strs2bytes(Instr.value)) return; elif Instr.type==Vars.DevType.SPIbb: logging.debug(str(('** Set SPIbb:',Instr.dev,Instr.value))) - SetSPIbb(self.SetI2C,RCU0,Instr.dev,Instr.value) + SetSPIbb(self.SetI2C,RCU0,Instr.dev,strs2bytes(Instr.value)) return; elif Instr.type==Vars.DevType.I2Cbb: logging.info(str(('** Set I2Cbb:',Instr.dev,Instr.value))) -# self.SetI2C(RCUi,Instr.dev,8,0,Instr.value) +# self.SetI2C(RCUi,Instr.dev,8,0,strs2bytes(Instr.value)) return; V1=Instr.dev - if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.nVars*self.N): + if not((Instr.nvalue==V1.nVars) and (Instr.type==Vars.DevType.VarUpdate)) and not(Instr.nvalue==V1.size*self.N): logging.error("Wrong size of value") return False if V1.Vars[0].type==Vars.DevType.Internal: - Instr.dev.OPCW.get_data_value().Value.Value=Instr.value + Instr.dev.OPCW.set_value(Instr.value) logging.debug("Update internal variable") return # if V1.Vars[0].type==Vars.DevType.Internal: return; Step=V1.nVars - value1=Instr.value if V1.OPCR is None else V1.OPCR.get_data_value().Value.Value + Step2=int(V1.size/V1.nVars) + if (self.N>1): + Mask=(Vars.RCU_mask if Step==1 else Vars.Ant_mask) + Mask=Mask.OPCW.get_value() + value1=strs2bytes(Instr.value) if V1.OPCR is None else strs2bytes(V1.OPCR.get_value()) if (len(value1)==V1.nVars) and (self.N>1): value1=(value1*self.N); - if Instr.type==Vars.DevType.Var: + if (Instr.type==Vars.DevType.Var) or ((self.N==1) and (Instr.type==Vars.DevType.VarUpdate)): logging.info(str(('** Set Var:',V1.name,value1))) for RCUi in range(self.N): for Vari in range(Step): - self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[RCUi*Step+Vari:RCUi*Step+Vari+1]) - value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1] + if not(Mask[RCUi*Step+Vari]): continue + i0=(RCUi*Step+ Vari)*Step2 + i1=(RCUi*Step+(Vari+1))*Step2 + self.SetVarValue(RCUi,V1.Vars[Vari],Instr.value[i0:i1]) + value2=value1[i0:i1] self.GetVarValue(RCUi,V1.Vars[Vari],value2) - value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2 - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1 + value1[i0:i1]=value2 + if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type)) elif Instr.type==Vars.DevType.VarUpdate: self.GetVarValueAll(V1,value1) - if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=value1 +# if not(V1.OPCR is None): V1.OPCR.get_data_value().Value.Value=bytes2strs(value1,Step2,V1.type) + if not(V1.OPCR is None): V1.OPCR.set_value(bytes2strs(value1,Step2,V1.type)) # V1.OPCR.get_data_value().Value.Value=value1 logging.info(str(('** Readback:',V1.name,value1))) @@ -123,10 +150,14 @@ class RCU1(): if var.type==Vars.DevType.I2C: self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.GetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.HBA1: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") elif var.type==Vars.DevType.SPIbb: - logging.error("SPIbb Implemented") + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + GetSPIbb(self.SetI2C,self.GetI2C,RCUi,var.devreg,value) else: logging.error("Not Implemented") @@ -135,6 +166,7 @@ class RCU1(): for RCUi in range(self.N): mask|=1<<Vars.RCU_MPaddr.Switch[RCUi] Step=V1.nVars + Step2=int(V1.size/V1.nVars) if V1.Vars[0].type==Vars.DevType.I2C: for Vari in range(Step): DevReg=V1.Vars[Vari].devreg @@ -143,16 +175,37 @@ class RCU1(): if DevReg.Register_R>255: self.I2Ccallback(DevReg.Addr,[250],read=3) #Wait for ADC for RCUi in range(self.N): self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) - value2=value1[RCUi*Step+Vari:RCUi*Step+Vari+1] + i0=(RCUi*Step+ Vari)*Step2 + i1=(RCUi*Step+(Vari+1))*Step2 + value2=value1[i0:i1] var=V1.Vars[Vari] +# print(Step,Step2,i0,i1,value2,len(value1)) self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) +# print(value2) if (var.Scale!=0): value2[0]*=var.Scale; - value1[RCUi*Step+Vari:RCUi*Step+Vari+1]=value2 + value1[i0:i1]=value2 elif V1.Vars[0].type==Vars.DevType.SPIbb: self.GetBBValueAll(V1,value1,mask) # logging.info("SPIbb all not implemented yet") + elif V1.Vars[0].type==Vars.DevType.HBA1: + for Vari in range(Step): + var=V1.Vars[Vari] + for RCUi in range(self.N): + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) +# print(Step,Step2,len(value1),V1.size) + i0=(RCUi*Step+ Vari)*Step2 + i1=(RCUi*Step+(Vari+1))*Step2 + value2=value1[i0:i1] + self.GetI2CHBA1(RCUi,var.devreg,var.width,var.bitoffset,value2) + value1[i0:i1]=value2 +# i0=(RCUi*Step+ Vari)*Step2+16 +# i1=(RCUi*Step+(Vari+1))*Step2 +# value2=value1[i0:i1] +# self.GetI2Cnoreg(RCUi,var.devreg,var.width,var.bitoffset,value2) +# value1[i0:i1]=value2 else: logging.error("Type not implemented") +# print(value1) def GetBBValueAll(self,V1,value1,mask): def SetBit(RCUi,dev,width,bitoffset,value,buffer=False): if not(buffer): self.SWcallback(mask) @@ -169,6 +222,8 @@ class RCU1(): self.SetI2CAddr(self,dev) for RCUi in range(self.N): self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + #for i in range(len(value2)): value2[i]*=0; + value2[0]=0 self.GetI2Cnoreg(RCUi,dev,width,bitoffset,value2) value[RCUi]=value2[0] return value; @@ -182,6 +237,10 @@ class RCU1(): if var.type==Vars.DevType.I2C: self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) self.SetI2C(RCUi,var.devreg,var.width,var.bitoffset,value) + elif var.type==Vars.DevType.HBA1: + self.SWcallback(1<<Vars.RCU_MPaddr.Switch[RCUi]) + self.SetHBA1I2C(RCUi,var.devreg,var.width,var.bitoffset,value) +# print("RCU1 Set",RCUi,var,value) elif var.type==Vars.DevType.I2Cbb: logging.error("I2Cbb Implemented") elif var.type==Vars.DevType.SPIbb: @@ -199,13 +258,28 @@ class RCU1(): if buffer: return True; return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W) + def SetHBA1I2C(self,RCUi,dev,width,bitoffset,value,buffer=False): +# if dev.store>0: + previous=self.previousHBA[RCUi,dev.store-1]; + L=len(value) + for i in range(L): + value[i]=ApplyMask(value[i],width,bitoffset,previous[i]); + self.previousHBA[RCUi,dev.store-1]=value +# if buffer: return True; + self.I2Ccallback(dev.Addr,value[:16],reg=dev.Register_W) + if L>16: self.I2Ccallback(dev.Addr,value[16:],reg=dev.Register_W+16) + self.I2Ccallback(dev.Addr,[500],reg=dev.Register_W,read=3) #Wait 500ms + return True +# return self.I2Ccallback(dev.Addr,value,reg=dev.Register_W) + def GetI2Cbuffer(self,RCUi,dev,width,bitoffset,value): if not(dev.store>0): return False; value[0]=self.previous[RCUi,dev.store-1]; # logging.debug(str(("GetI2Cbuffer",RCUi,dev.store,value))) l1=int(np.floor((width+bitoffset+7)/8)) if (width!=l1*8) or (bitoffset>0): - value[0]=UnMask(value[0],width,bitoffset) + for i in range(len(value)): + value[i]=UnMask(value[i],width,bitoffset) return True def GetI2C(self,RCUi,dev,width,bitoffset,value): @@ -231,7 +305,8 @@ class RCU1(): self.previous[RCUi,dev.store-1]=value[0] # logging.debug(str(("Store buffer",RCUi,dev.store,value[0]))) if (width!=l1*8) or (bitoffset>0): - value[0]=UnMask(value[0],width,bitoffset) + for i in range(len(value)): + value[i]=UnMask(value[i],width,bitoffset) else: value[0]=value2[0] return True; def GetI2Cbit(self,RCUi,dev,pin): @@ -246,6 +321,7 @@ class RCU1(): def GetI2Cnoreg(self,RCUi,dev,width,bitoffset,value): + #print(width,len(value)) l1=int(np.floor((width+bitoffset+7)/8)) makesinglevalue=((len(value)==1) and (l1>1)); if makesinglevalue: value2=[0 for x in range(l1)] @@ -258,11 +334,29 @@ class RCU1(): if dev.store>0: self.previous[RCUi,dev.store-1]=value[0] # logging.debug(str(("Store buffer",RCUi,dev.store,value[0]))) - if (width!=l1*8) or (bitoffset>0): - value[0]=UnMask(value[0],width,bitoffset) +# if width<8: + if (width!=l1*8) or (bitoffset>0): + for i in range(len(value)): + value[i]=UnMask(value[i],width,bitoffset) +# value[0]=UnMask(value[0],width,bitoffset) #else: value[0]=value2[0] + #if (len(value)>1) and (width<8): print value + return True; + + def GetI2CHBA1(self,RCUi,dev,width,bitoffset,value): + #print(width,len(value)) + value2=value + reg=dev.Register_R + if not(self.I2Ccallback(dev.Addr,value2,read=1)): return False; + if value2[0] is None: return False + value[:]=value2[:]; + if dev.store>0: + self.previousHBA[RCUi,dev.store-1]=value + for i in range(len(value)): + value[i]=UnMask(value[i],width,bitoffset) return True; + def start(self,Q1): def RCUthread(Q1): while True: @@ -276,21 +370,29 @@ class RCU1(): return RCUthread1 -# def Queue_Monitor(self,Q1): -# Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32) -# Q1.put(Inst1) + def Queue_Monitor(self,Q1,NRCU): +# Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,NRCU,[0]*NRCU) +# Q1.put(Inst1) # Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96) # Q1.put(Inst1) - - + return def AddVars(self,Q1,AddVarR,AddVarW): for v in Vars.OPC_devvars: - dim=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars - varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0]) + dim1=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.nVars + dim2=Vars.RCU_MPaddr.nI2C*Vars.RCU_MPaddr.nSwitch*v.size + dim3=int(v.size/v.nVars) + #print(v.name,dim) + varvalue2=0 + if v.type==Vars.datatype.dInt: varvalue2=dim2*[0] + elif v.type==Vars.datatype.dbool: varvalue2=dim2*[False] + elif v.type==Vars.datatype.dfloat: varvalue2=dim2*[0.0] + elif v.type==Vars.datatype.dstring: varvalue2=dim1*[" "*dim3] + print(len(varvalue2),varvalue2) if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]: var1=AddVarR(v.name+"_R",varvalue2,v) +# print(len(varvalue1),len(varvalue2),v.size,dim2) v.OPCR=var1 - Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim,varvalue2) + Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim2,varvalue2) Q1.put(Inst) if v.RW in [Vars.RW.WriteOnly,Vars.RW.ReadWrite]: diff --git a/clk/HWconf.py b/clk/HWconf.py index 95060df28f62ae6bded8f6af65a5f839014ae14d..36f14375ea723d11bb5ac124e893176503a0b13d 100644 --- a/clk/HWconf.py +++ b/clk/HWconf.py @@ -11,3 +11,9 @@ CLK_IO3_CONF1=DevReg(0x20,6,6,3) CLK_IO3_CONF2=DevReg(0x20,7,7,4) RCU_storeReg=4; #Number of stored registers + + + +SPIBB_PLL=BBdev(4,[CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT1,CLK_IO3_OUT2],[4,7,5,6],0) #CLK,SDI,SDO,CS + +CLK_PLL_lock =DevReg(SPIBB_PLL,0X00,0X00,0) # PLL locked status diff --git a/clk/Vars.py b/clk/Vars.py index 4127783f96e4d23dc5ca8fe9d2bb7f88a1c2bdcc..20c67abf5ded629feca9327cac797dc80d689ba6 100644 --- a/clk/Vars.py +++ b/clk/Vars.py @@ -1,10 +1,15 @@ from .HWconf import * -CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,6,1)],RW.ReadOnly,datatype.dInt,1,None,None) -CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,7,1)],RW.ReadOnly,datatype.dInt,1,None,None) -CLK_Stat1 = VarArray("CLK_Stat" ,1,[Var2dev("",I2Cmodules.CLK,DevType.I2C,CLK_IO3_OUT1,1 ,4,1)],RW.ReadOnly,datatype.dInt,1,None,None) +CLKmod=I2Cmodules.CLK -OPC_devvars=[CLK_IGNORE_PPS,CLK_Enable_PWR,CLK_Stat1] + +CLK_IGNORE_PPS= VarArray("CLK_Ignore_PPS",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,6,1)],RW.ReadOnly,datatype.dInt,1,None,None) +CLK_Enable_PWR= VarArray("CLK_Enable_PWR",1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,7,1)],RW.ReadOnly,datatype.dInt,1,None,None) +CLK_Stat1 = VarArray("CLK_Stat" ,1,[Var2dev("",CLKmod,DevType.I2C,CLK_IO3_OUT1,1 ,4,1)],RW.ReadOnly,datatype.dInt,1,None,None) +CLK_lock1 = VarArray("CLK_Lock" ,1,[Var2dev("",CLKmod,DevType.SPIbb,CLK_PLL_lock,8 ,0,1)],RW.ReadOnly,datatype.dInt,1,None,None) + + +OPC_devvars=[CLK_IGNORE_PPS,CLK_Enable_PWR,CLK_Stat1,CLK_lock1] RCU_init=Instrs("ReadRegisters",2,[ Instr(DevType.VarUpdate,CLK_IGNORE_PPS,1,[0]), @@ -21,4 +26,22 @@ CLK_off=Instrs("CLK_off",2,[ Instr(DevType.I2C,CLK_IO3_OUT1 ,1,[0x40]), ]) -OPC_methods=[CLK_on] +def SPIinst(reg,value): + return Instr(DevType.SPIbb,DevReg(SPIBB_PLL,0,reg,0),1,[value]), +CLK_PLL_setup=Instrs("CLK_PLL_setup",2,[ + SPIinst(0x03,0x08), + SPIinst(0x05,0x97), + SPIinst(0x06,0x10), + SPIinst(0x07,0x04), + SPIinst(0x08,0x01), + SPIinst(0x07,0x00), + SPIinst(0x09,0x10), + SPIinst(0x0A,0x14), + SPIinst(0x09,0x00), + SPIinst(0x0D,0x01),#was 2 + SPIinst(0x0F,0x01), + SPIinst(0x11,0x01), + SPIinst(0x13,0x01) +]) + +OPC_methods=[CLK_on,CLK_off,CLK_PLL_setup] diff --git a/clk/spibitbang2.py b/clk/spibitbang2.py new file mode 100644 index 0000000000000000000000000000000000000000..d7d6be041507d88a6ffd8889cbf8c11a09885c75 --- /dev/null +++ b/clk/spibitbang2.py @@ -0,0 +1,79 @@ +from enum import Enum +import logging +import numpy as np + +class SPIBB_pins(Enum): + CLK = 0 + SDI = 1 + SDO = 2 + CS = 3 + +def SetSPIbb(SetI2C,RCUi,dev,value): + ADC_address=dev.Register_W + CSdev=dev.Addr.devs[SPIBB_pins.CS.value] + CSpin=dev.Addr.pins[SPIBB_pins.CS.value] + SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value] + SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value] + SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value] + SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value] + CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] + CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] + + logging.info(str(("SPIbb set",ADC_address,value))) + +# dev_rw = 0x00 # 0 for write, 1 for read +# data2 = ( reg_address << 9 ) + ( dev_rw << 8 ) + value[0] + data2 = ( ADC_address << 9 ) + value[0] + + bit_array = "{0:{fill}16b}".format(data2, fill='0') + # print(bit_array) + SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable + for bit in bit_array: + SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) + SetI2C(RCUi,CLKdev,1,CLKpin,[1]) + SetI2C(RCUi,CLKdev,1,CLKpin,[0]) + SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable + # SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished + return True; + +def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value): + ADC_reg_address=dev.Register_R + CSdev=dev.Addr.devs[SPIBB_pins.CS.value] + CSpin=dev.Addr.pins[SPIBB_pins.CS.value] + SDOdev=dev.Addr.devs[SPIBB_pins.SDO.value] + SDOpin=dev.Addr.pins[SPIBB_pins.SDO.value] + SDIdev=dev.Addr.devs[SPIBB_pins.SDI.value] + SDIpin=dev.Addr.pins[SPIBB_pins.SDI.value] + CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] + CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] + + logging.info(str(("SPIbb get",ADC_reg_address))) + ADC_bytes = 0x00 + # ADC_rw = 0x01 # 0 for write, 1 for read + data = (ADC_reg_address << 1) + 1 #was 7?? + + SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable + + + bit_array = "{0:{fill}8b}".format(data, fill='0') + for bit in bit_array: + SetI2C(RCUi,SDIdev,1,SDIpin,[int(bit)]) + SetI2C(RCUi,CLKdev,1,CLKpin,[1]) + SetI2C(RCUi,CLKdev,1,CLKpin,[0]) + + # SetI2C(RCUi,SDIdev,1,SDIpin,[1]) #high when finished + + # print("read byte") + a=[0] + N=1 #len(value) + ret_value=[0] + for i in range(N): value[i]=0 + for cnt in range(8*(ADC_bytes+1)): + GetI2C(RCUi,SDOdev,1,SDOpin,ret_value) + for i in range(N): value[i]=(value[i]<<1)+ ret_value[i] + SetI2C(RCUi,CLKdev,1,CLKpin,[1]) + SetI2C(RCUi,CLKdev,1,CLKpin,[0]) #read after falling edge + SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable + return True; + + diff --git a/i2c/I2C.py b/i2c/I2C.py index 301eda80276f841c937b9b081463a40b119113b2..7d5b61964c1ca31d9a0fdc8622d57cc81b914008 100644 --- a/i2c/I2C.py +++ b/i2c/I2C.py @@ -36,3 +36,31 @@ def I2C1server(addr,data,reg=None,read=0): # data[0]=0xff return False; +def I2C2server(addr,data,reg=None,read=0): + try: + if read==3: + time.sleep(data[0]/1000.) + return True + logging.debug(str(("I2C",addr,reg,data,read))) + +# print("I2C",addr,reg,data,read) +# return True; + bus=pylibi2c.I2CDevice('/dev/i2c-1',addr) + if read==1: + length=len(data) + bus.iaddr_bytes=0 + if not(reg is None): + bus.ioctl_write(0,str(bytearray([reg]))) + data[:]=[int(x) for x in bus.ioctl_read(0,length)] + else: + if reg is None: + bus.iaddr_bytes=0 + reg=0; + bus.ioctl_write(reg,str(bytearray(data))) + bus.close() + return True; + except: + if bus: bus.close() +# data[0]=0xff + return False; + diff --git a/i2c/I2C_dummy.py b/i2c/I2C_dummy.py index 63000d09c6f1c0a5b9ad3c49bbadb58da5d64833..d6351b08d07e2271ddae4ff7d15c527bf8ac1649 100644 --- a/i2c/I2C_dummy.py +++ b/i2c/I2C_dummy.py @@ -19,3 +19,16 @@ def I2C1server(addr,data,reg=None,read=0): I2Ccounter+=len(data) # logging.debug(str(("I2C",addr,reg,data,read))) return True + +def I2C2server(addr,data,reg=None,read=0): + global I2Ccounter; + logging.debug(str(("I2C2",addr,reg,data,read))) + if read==3: + time.sleep(data[0]/1000.) + return True + if read==1: + data[0]=0 + if reg: I2Ccounter+=1; + I2Ccounter+=len(data) +# logging.debug(str(("I2C",addr,reg,data,read))) + return True diff --git a/i2c/I2Cswitch1.py b/i2c/I2Cswitch1.py index 87382d058750dae14f50100d0fca3a1f1e55458a..187456b1d6cc9eb2d15330d216ff89e72fe42a18 100644 --- a/i2c/I2Cswitch1.py +++ b/i2c/I2Cswitch1.py @@ -16,3 +16,12 @@ class I2Cswitch1(): def I2Ccallback(self,RCU,addr,data,reg=None,read=0): self.callback1(addr,data,reg,read) +class I2Cswitch0(): + def __init__(self,callback1): + return + + def SetChannel(self,channel): + return True + + def I2Ccallback(self,RCU,addr,data,reg=None,read=0): + return \ No newline at end of file diff --git a/pypcc2.py b/pypcc2.py index 2774dfb80a6ef6a5208f7908fee785a4f5be74a0..719eef930ea8aaed9aeb35a3ce57f268a5d98873 100644 --- a/pypcc2.py +++ b/pypcc2.py @@ -43,13 +43,14 @@ opcuaserv.InitServer(port=args.port) logging.info("OPC-UA Server started") SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server) +SW0=I2Cswitch1.I2Cswitch0(I2C.I2C2server) #Dummy switch as their is no switch on LTS RCU=RCU.RCU1(NRCU,I2C.I2C1server,SW1.SetChannel) RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW) RCU.AddMethod(Q1,opcuaserv.Addmethod) RCU.load() #Load current register values from HW -#CLK=CLK.RCU1(1,I2C.I2C1server,SW1.SetChannel) +#CLK=CLK.RCU1(1,I2C.I2C2server,SW0.SetChannel) #CLK.AddVars(Q2,opcuaserv.AddVarR,opcuaserv.AddVarW) #CLK.AddMethod(Q2,opcuaserv.Addmethod) #CLK.load() #Load current register values from HW