Skip to content
Snippets Groups Projects
Commit 9eb1ba9b authored by Paulus Kruger's avatar Paulus Kruger
Browse files

Pypcc RCU2LQM

parent 19737ee4
Branches
Tags
1 merge request!13Pypcc RCU2LQM
version: "1.0"
description: "1234"
drivers:
- name: I2C1 #TCA9548
type: i2c_switch
devreg: [0x70] #0x70 / 0x00=disabled
parameters: [1] #I2C port number
- name: I2C_RCU
type: i2c_array #An array of similar devices connected to an I2C switch
parent: I2C1
parameters: [0,31] #start,number of RCUs
status: RCU_I2C_STATUS
- name: I2Cbb1
type: i2cbitbang1 #I2C bitbang via GPIO expander
devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
parameters: [5,6,6] #pins
parent: I2C_RCU
- name: I2Cbb2
type: i2cbitbang1
devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
parameters: [4,6,6]
parent: I2C_RCU
- name: I2Cbb3
type: i2cbitbang1
devreg: [IO3.GPIO2,IO3.GPIO2,IO3.CONF2]
parameters: [3,6,6]
parent: I2C_RCU
- name: SPIbb1
type: spibitbang1 #SPI bitbang via GPIO expander: CLK, SDIO, SDIOdir,CS
devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
parameters: [1,0,0,0]
parent: I2C_RCU
- name: SPIbb2
type: spibitbang1
devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
parameters: [3,2,2,1]
parent: I2C_RCU
- name: SPIbb3
type: spibitbang1
devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
parameters: [5,4,4,2]
parent: I2C_RCU
#This is the I2C devices in the RCU
device_registers:
- name: IO
dim: 3
description: [IO-Expander for filter selection,IO-Expander for ON/OFF, Band, BUFx2,IO-Expander for ADC control]
address: [0x75,0x76,0x20]
device: [TCA9539,TCA9539,TCA6416]
driver: I2C1
registers:
- name: CONF1
description: Direction of port1
address: 6
store: True
- name: CONF2
description: Direction of port2
address: 7
store: True
- name: GPIO1
description: Input/Ouput port 1
address: [0,2] #Read / Write address different
store: True
- name: GPIO2
description: Input/Ouput port 2
address: [1,3]
store: True
- name: ROM
description: IO-Expander for filter selection
address: 0x50
driver: I2C1
registers:
- name: ID
description: Random
address: 0xfc
- name: Version
description: Set in production
address: 0
- name: AN
description: Monitor ADC on RCU
address: 0x74
device: LTC2495
driver: I2C1
registers:
- name: V_1v8
address: 0xB080
- name: V_2v5
address: 0xB880
- name: V_3v3
address: 0xB180
- name: I_Ant0
address: 0xB980
- name: I_Ant1
address: 0xB280
- name: I_Ant2
address: 0xBA80
- name: V_Ant_I0
address: 0xB380
- name: V_Ant_O0
address: 0xBB80
- name: V_Ant_I1
address: 0xB480
- name: V_Ant_O1
address: 0xBC80
- name: V_Ant_I2
address: 0xB580
- name: V_Ant_O2
address: 0xBD80
- name: Temp
address: 0xA0C0
#This 'special' devices that uses I2C
- name: HB_UC
description: RCU microcontroller
address: 0x40
driver: I2C1
registers:
- name: ID
description: Device ID
address: 0
- name: ADC
dim: 3
description: ADC SPI control
device: AD9683
driver: [SPIbb1,SPIbb2,SPIbb3]
registers:
- name: PLL_stat
description: PLL locked status
address: 0x0A
- name: JESD_control1
description: JESD link control
address: 0x5F
- name: SYNC_control
address: 0x3A
- name: CML_level
description: CML output adjust
address: 0x15
- name: Offset
address: 0x10
- name: Update
description: Global device uptate
address: 0xFF
- name: DTH
dim: 3
description: CW dither source
device: SI4012
driver: [I2Cbb1,I2Cbb1,I2Cbb1]
address: 0x70
registers:
- name: Freq
description: Frequency
address: [0x1240,0x1140]
- name: Property
description: Properties
address: [0x12,0x11]
- name: Start
description: Start CW
address: [0x62,0x62]
- name: Stop
description: Stop CW
address: [0x67,0x67]
- name: Rev
address: 0x10
variables:
- name: Ant_mask
description: Only masked RF chains are updated
driver: I2C_RCU
rw: variable #server RW variable, not linked to IO
dtype: boolean
dim: 96
- name: RCU_mask
description: Only masked RCUs are updated
driver: I2C_RCU
rw: variable #server RW variable, not linked to IO
dtype: boolean
dim: 32
- name: RCU_I2C_STATUS
description: 0=Good, 1=No communication, 2=error
driver: I2C_RCU
rw: ro #server RW variable, not linked to IO
dtype: uint8
mask: RCU_mask
dim: 32
# - name: RCU_state
# description: State of RCUs 0=unknown, 1=ready, 2=busy, 3= wait PPS, 4=error
# driver: I2C_RCU
# rw: ro #server variable, not linked to IO
# dtype: uint8
# dim: 1
- name: RCU_translator_busy
description: False when idle
rw: ro #server variable, not linked to IO
dtype: boolean
dim: 1
- name: RCU_attenuator
description: Attenuator before ADC
driver: I2C_RCU
devreg: [IO1.GPIO1,IO1.GPIO2,IO2.GPIO1]
bitoffset: [0,0,0]
width: 5
rw: rw
dtype: uint8
dim: 96
mask: Ant_mask
- name: RCU_band
description: Band select switch 1=10MHz,2=30MHz
driver: I2C_RCU
devreg: [IO2.GPIO2,IO2.GPIO2,IO2.GPIO2]
bitoffset: [0,2,4]
width: 2
rw: rw
dtype: uint8
dim: 96
mask: Ant_mask
- name: [RCU_IO1_GPIO1,RCU_IO1_GPIO2,RCU_IO2_GPIO1,RCU_IO2_GPIO2,RCU_IO3_GPIO1,RCU_IO3_GPIO2]
driver: I2C_RCU
devreg: [IO1.GPIO1,IO1.GPIO2,IO2.GPIO1,IO2.GPIO2,IO3.GPIO1,IO3.GPIO2]
width: 8
rw: ro
dtype: uint8
dim: 32
mask: RCU_mask
debug: True
- name: RCU_LED0
driver: I2C_RCU
description: LED on RCU
devreg: IO2.GPIO2
bitoffset: 6
width: 1
rw: rw
dtype: boolean
dim: 32
mask: RCU_mask
- name: RCU_LED1
driver: I2C_RCU
description: LED on RCU
devreg: IO2.GPIO2
bitoffset: 7
width: 1
rw: rw
dtype: boolean
dim: 32
mask: RCU_mask
- name: RCU_temperature
description: Temperature sensor on RCU
driver: I2C_RCU
devreg: AN.Temp
width: 23
scale: 3.8265e-3
rw: ro
dtype: double
dim: 32
monitor: true
mask: RCU_I2C_STATUS
- name: RCU_3V3
driver: I2C_RCU
devreg: AN.V_3v3
width: 23
scale: 1.463e-6
rw: ro
dtype: double
dim: 32
# monitor: true
mask: RCU_I2C_STATUS
- name: RCU_1V8
driver: I2C_RCU
devreg: AN.V_1v8
width: 23
scale: 7.1526e-7
rw: ro
dtype: double
dim: 32
# monitor: true
mask: RCU_I2C_STATUS
- name: RCU_2V5
driver: I2C_RCU
devreg: AN.V_2v5
width: 23
scale: 7.1526e-7
rw: ro
dtype: double
dim: 32
# monitor: true
mask: RCU_I2C_STATUS
- name: ANT_Vout
driver: I2C_RCU
devreg: [AN.V_Ant_O0,AN.V_Ant_O1,AN.V_Ant_O2]
width: 23
scale: 2.7895e-6
rw: ro
dtype: double
dim: 96
mask: Ant_mask
- name: ANT_Vin
driver: I2C_RCU
devreg: [AN.V_Ant_I0,AN.V_Ant_I1,AN.V_Ant_I2]
width: 23
scale: 2.7895e-6
rw: ro
dtype: double
dim: 96
mask: Ant_mask
- name: ANT_I
driver: I2C_RCU
devreg: [AN.I_Ant0,AN.I_Ant1,AN.I_Ant2]
width: 23
scale: 7.1526e-8
rw: ro
dtype: double
dim: 96
mask: Ant_mask
- name: RCU_Pwr_dig
description: Enable LDOs
driver: I2C_RCU
devreg: IO2.GPIO1
width: 1
bitoffset: 6
rw: ro
dtype: boolean
dim: 32
mask: RCU_mask
- name: RCU_ID
description: Unique RCU ID
driver: I2C_RCU
devreg: ROM.ID
width: 32
rw: ro
dtype: uint32
dim: 32
mask: RCU_mask
- name: RCU_version
description: RCU version number
driver: I2C_RCU
devreg: ROM.Version
width: 80 #10 characters
rw: ro
dtype: string
dim: 32
mask: RCU_mask
- name: RCU_ADC_lock
description: 0x81=locked
driver: I2C_RCU
devreg: [ADC1.PLL_stat,ADC2.PLL_stat,ADC3.PLL_stat]
width: 8
rw: ro
dtype: uint8
dim: 96
monitor: true
- name: RCU_ADC_sync
driver: I2C_RCU
devreg: [ADC1.SYNC_control,ADC2.SYNC_control,ADC3.SYNC_control]
width: 8
rw: ro
dtype: uint8
dim: 96
debug: true
- name: RCU_ADC_JESD
driver: I2C_RCU
devreg: [ADC1.JESD_control1,ADC2.JESD_control1,ADC3.JESD_control1]
width: 8
rw: ro
dtype: uint8
dim: 96
debug: true
- name: RCU_ADC_CML_level
driver: I2C_RCU
devreg: [ADC1.CML_level,ADC2.CML_level,ADC3.CML_level]
width: 8
rw: ro
dtype: uint8
dim: 96
debug: true
- name: RCU_DTH_freq
driver: I2C_RCU
devreg: [DTH1.Freq,DTH2.Freq,DTH3.Freq]
width: 32
rw: rw
dtype: uint32
dim: 96
mask: Ant_mask
- name: RCU_DTH_Rev
driver: I2C_RCU
devreg: [DTH1.Rev,DTH2.Rev,DTH3.Rev]
width: 88
rw: rw
dtype: uint32
dim: 96
mask: Ant_mask
methods:
- name: RCU_Init #Called after startup to load. Should have all stored registers
driver: I2C_RCU
debug: True
instructions:
- RCU_IO1_GPIO1: Update
- RCU_IO1_GPIO2: Update
- RCU_IO2_GPIO1: Update
- RCU_IO2_GPIO2: Update
- RCU_IO3_GPIO1: Update
- RCU_IO3_GPIO2: Update
# - IO1.GPIO2: Update
# - IO2.GPIO1: Update
# - IO2.GPIO2: Update
# - IO3.GPIO1: Update
# - IO3.GPIO2: Update
- IO3.CONF1: Update
- RCU_update: 0
- name: RCU_SETUP_IO1
driver: I2C_RCU
mask: RCU_mask
rw: hidden
instructions:
- IO2.CONF1: 0 #Set device register, can also specify a register adress direction e.g. OIO2.0: 0
- IO2.GPIO1: 0x4A
- IO2.GPIO2: 0x55
- IO1.GPIO1: 0xCA
- IO1.GPIO2: 0xCA
- IO2.CONF2: 0
- IO1.CONF1: 0
- IO1.CONF2: 0
- name: RCU_on
driver: I2C_RCU
mask: RCU_mask
instructions:
- RCU_I2C_STATUS: 0
- RCU_SETUP_IO1: 0
- IO3.GPIO1: 0x15
- IO3.GPIO2: 0x47
- IO3.CONF1: 0
- IO3.CONF2: 0
# - RCU_GPIO1: Update
# - RCU_GPIO2: Update
# - RCU_attenuator: [10,10,10] #Set OPC-UA variable
- WAIT: 500 #ms to wait
- ADC1_on: 0 #call another opc-ua method
- ADC2_on: 0
- ADC3_on: 0
- WAIT: 500 #ms to wait
- RCU_update: 0
- name: RCU_update
driver: I2C_RCU
mask: RCU_mask
debug: True
instructions:
- RCU_Pwr_dig: Update #Read value and update the OPC-UA variable
- RCU_ID: Update
- RCU_version: Update
- RCU_LED0: Update
- RCU_attenuator: Update
- RCU_band: Update
- RCU_ADC_lock: Update
- RCU_ADC_sync: Update
- name: ADC1_on
driver: I2C_RCU
debug: True
# rw: hidden
instructions:
- ADC1.JESD_control1 : 0x14
- ADC1.SYNC_control: 1 #Setup ADCs
- ADC1.CML_level: 0x7
- ADC1.Update: 1 #Needed to update ADC registers
- name: ADC2_on
driver: I2C_RCU
debug: True
# rw: hidden
instructions:
- ADC2.JESD_control1 : 0x14
- ADC2.SYNC_control: 1 #Setup ADCs
- ADC2.CML_level: 0x7
- ADC2.Update: 1 #Needed to update ADC registers
- name: ADC3_on
driver: I2C_RCU
debug: True
# rw: hidden
instructions:
- ADC3.JESD_control1 : 0x14
- ADC3.SYNC_control: 1 #Setup ADCs
- ADC3.CML_level: 0x7
- ADC3.Update: 1 #Needed to update ADC registers
- name: RCU_off
driver: I2C_RCU
mask: RCU_mask
instructions:
- RCU_I2C_STATUS: 0
- RCU_Pwr_dig: 0 #Switch power off
- IO2.GPIO1: 0
- IO2.GPIO2: 0
- IO3.GPIO1: 0
- IO3.GPIO2: 0
- IO1.GPIO1: 0
- IO1.GPIO2: 0
- RCU_update: 0
#todo, also make all GPIO pins (except power enables) inputs to remove all power from devices.
...@@ -201,7 +201,8 @@ class i2c_array(i2c_dev): ...@@ -201,7 +201,8 @@ class i2c_array(i2c_dev):
# print(width,bitoffset,l1) # print(width,bitoffset,l1)
value2=value value2=value
reg=devreg['register_R'] reg=devreg['register_R']
if reg>255: #This is for the monitor ADC if reg>255: #This is for the monitor ADC (+ DTH)
callback(0,[250],read=3)
if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False; if not(callback(devreg['addr'],int2bytes(reg),read=2)): return False;
callback(0,[250],read=3) callback(0,[250],read=3)
if not(callback(devreg['addr'],value2,read=1)): return False; if not(callback(devreg['addr'],value2,read=1)): return False;
......
...@@ -8,7 +8,7 @@ class i2c_switch(i2c): ...@@ -8,7 +8,7 @@ class i2c_switch(i2c):
i2c.__init__(self,config) i2c.__init__(self,config)
self.SWaddr=config['devreg'][0]['addr'] self.SWaddr=config['devreg'][0]['addr']
self.CurrentChannel=0 self.CurrentChannel=0
self.NoSwitch=False; self.NoSwitch=self.SWaddr==0;
logging.info("i2c switch at address "+str(self.SWaddr)) logging.info("i2c switch at address "+str(self.SWaddr))
if self.NoSwitch: if self.NoSwitch:
logging.warn("i2c switch disabled!") logging.warn("i2c switch disabled!")
......
...@@ -2,146 +2,143 @@ from enum import Enum ...@@ -2,146 +2,143 @@ from enum import Enum
import logging import logging
import numpy as np import numpy as np
from .hwdev import hwdev from .hwdev import hwdev
import time
#This is copy of spibitbang. Need to be updated!! #This is copy of spibitbang. Need to be updated!!
class SPIBB_pins(Enum): class SPIBB_pins(Enum):
CLK = 0 CLK = 0
SDIO = 1 SDA = 1
SDIOdir = 2 SDAdir = 2
CS = 3
class i2cbitbang1(hwdev): class i2cbitbang1(hwdev):
def __init__(self,config): def __init__(self,config):
hwdev.__init__(self,config) hwdev.__init__(self,config)
logging.info("i2cbitbang todo")
def i2csetget(self,addr,data,reg=None,read=0): def i2csetget(self,addr,data,reg=None,read=0):
logging.info("i2cbitbang todo") # print("I2Cbbset",addr,data,reg,read);
if read==0:
if not(reg is None):
if reg>255: data=[reg//256,reg%256]+data;
else: data=[reg]+data;
return self.SetI2Cbb(addr,data)
if read==2: return self.SetI2Cbb(addr,data)
elif read==1:
if not(reg is None):
if reg>255: reg=[reg//256,reg%256];
else: reg=[reg];
self.SetI2Cbb(addr,reg)
return self.GetI2Cbb(addr,data)
elif read==3:
time.sleep(data[0]/1000);
return True
else: logging.warn("Not implemented!")
return False; return False;
def SetSPIbb(SetI2C,RCUi,dev,value): def SetI2Cbb(self,address,value):
ADC_address=dev.Register_W SDAdev=self.conf['devreg'][SPIBB_pins.SDA.value]
CSdev=dev.Addr.devs[SPIBB_pins.CS.value] SDApin=self.conf['parameters'][SPIBB_pins.SDA.value]
CSpin=dev.Addr.pins[SPIBB_pins.CS.value] CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
SDOdev=dev.Addr.devs[SPIBB_pins.SDIO.value] CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
SDOpin=dev.Addr.pins[SPIBB_pins.SDIO.value] DIRdev=self.conf['devreg'][SPIBB_pins.SDAdir.value]
CLKdev=dev.Addr.devs[SPIBB_pins.CLK.value] DIRpin=self.conf['parameters'][SPIBB_pins.SDAdir.value]
CLKpin=dev.Addr.pins[SPIBB_pins.CLK.value] SetI2C=self.conf['parentcls'].SetVarValue
GetI2C=self.conf['parentcls'].GetVarValue
logging.info(str(("SPIbb set",ADC_address,value)))
ADC_bytes = 0x00 # ADC_address=dev.Register_W<<1; #Write
ADC_rw = 0x00 # 0 for write, 1 for read ADC_address=address<<1;#dev.Register_W<<1; #Write
data2 = ( ADC_rw << 23 ) + ( ADC_bytes << 21 ) + ( ADC_address << 8 ) + value[0] logging.info(str(("I2Cbb set",hex(ADC_address),value)))
bit_array = "{0:{fill}24b}".format(data2, fill='0')
# print(bit_array)
SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable
for bit in bit_array:
SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)])
SetI2C(RCUi,CLKdev,1,CLKpin,[1])
SetI2C(RCUi,CLKdev,1,CLKpin,[0])
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable
SetI2C(RCUi,SDOdev,1,SDOpin,[1]) #high when finished
return True;
def GetSPIbb(SetI2C,GetI2C,RCUi,dev,value):
ADC_reg_address=dev.Register_R
CSdev=dev.Addr.devs[Vars.SPIBB_pins.CS.value]
CSpin=dev.Addr.pins[Vars.SPIBB_pins.CS.value]
SDOdev=dev.Addr.devs[Vars.SPIBB_pins.SDIO.value]
SDOpin=dev.Addr.pins[Vars.SPIBB_pins.SDIO.value]
CLKdev=dev.Addr.devs[Vars.SPIBB_pins.CLK.value]
CLKpin=dev.Addr.pins[Vars.SPIBB_pins.CLK.value]
SDIOdirdev=dev.Addr.devs[Vars.SPIBB_pins.SDIOdir.value]
SDIOdirpin=dev.Addr.pins[Vars.SPIBB_pins.SDIOdir.value]
logging.info(str(("SPIbb get",ADC_reg_address)))
ADC_bytes = 0x00
ADC_rw = 0x01 # 0 for write, 1 for read
data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable #start
SetI2C(SDAdev,1,SDApin,[0]) #Output = low
SetI2C(DIRdev,1,DIRpin,[0]) #Output = low
bit_array = "{0:{fill}16b}".format(data, fill='0') SetI2C(CLKdev,1,CLKpin,[0])
for bit in bit_array: ack=[0];
SetI2C(RCUi,SDOdev,1,SDOpin,[int(bit)]) def TXbyte(b):
SetI2C(RCUi,CLKdev,1,CLKpin,[1]) for bit in "{0:{fill}8b}".format(b, fill='0'):
SetI2C(RCUi,CLKdev,1,CLKpin,[0]) SetI2C(DIRdev,1,DIRpin,[int(bit)])
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(DIRdev,1,DIRpin,[1]) #input
# print("read byte") # GetI2C(SDAdev,1,SDApin,ack)
SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[1]) #input # print("Ack=",ack[0]);
SetI2C(RCUi,CSdev,1,CSpin,[0]) #enable SetI2C(CLKdev,1,CLKpin,[1])
a=[0] GetI2C(SDAdev,1,SDApin,ack)
N=len(value) # print("Ack=",ack[0]);
for i in range(N): value[i]=0 SetI2C(CLKdev,1,CLKpin,[0])
for cnt in range(8*(ADC_bytes+1)): return ack[0];
ret_value=GetI2C(RCUi,SDOdev,1,SDOpin) #enable
for i in range(N): value[i]=(value[i]<<1)+ ret_value[i] TXbyte(ADC_address);
SetI2C(RCUi,CLKdev,1,CLKpin,[1]) for v in value:
SetI2C(RCUi,CLKdev,1,CLKpin,[0]) #read after falling edge TXbyte(v);
SetI2C(RCUi,CSdev,1,CSpin,[1]) #disable #stop
SetI2C(RCUi,SDIOdirdev,1,SDIOdirpin,[0]) #output SetI2C(DIRdev,1,DIRpin,[0]) #low
return True; SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
def GetSPIbb2(SetI2C,GetI2C,RCUi,SPIdev,I2Cdev,I2Cpins,value):
#Read 3 SPI devices in parallel from same IOexpander
ADC_reg_address=SPIdev[0].Register_R
Nv=len(SPIdev)
def Setbit(pintype,value):
for i in range(1,Nv):
SetI2C(RCUi,I2Cdev[i][pintype],1,I2Cpins[i][pintype],[value],buffer=True)
SetI2C(RCUi,I2Cdev[0][pintype],1,I2Cpins[0][pintype],[value])
def Getbit(pintype):
print("N=",Nv,len(value))
retvalue=np.zeros_like(value)
retvalue[0::Nv]=GetI2C(RCUi,I2Cdev[0][pintype],1,I2Cpins[0][pintype])
for i in range(1,Nv):
retvalue[i::Nv]=GetI2C(RCUi,I2Cdev[i][pintype],1,I2Cpins[i][pintype],buffer=True)
return retvalue
CLK=0
SDIO=1
SDIOdir=2
CS=3
logging.debug(str(("SPIbb get",ADC_reg_address)))
ADC_bytes = 0x00
ADC_rw = 0x01 # 0 for write, 1 for read
data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address return True;
Setbit(CLK,0)
Setbit(CS,0) #enable
bit_array = "{0:{fill}16b}".format(data, fill='0')
logging.debug(str(("SPI TX",bit_array)))
for bit in bit_array:
Setbit(CLK,0)
Setbit(SDIO,int(bit))
Setbit(CLK,1)
# Setbit(CS,1) #disable def GetI2Cbb(self,reg_address,value):
Setbit(SDIOdir,1) #input SDAdev=self.conf['devreg'][SPIBB_pins.SDA.value]
Setbit(CLK,0) SDApin=self.conf['parameters'][SPIBB_pins.SDA.value]
CLKdev=self.conf['devreg'][SPIBB_pins.CLK.value]
CLKpin=self.conf['parameters'][SPIBB_pins.CLK.value]
DIRdev=self.conf['devreg'][SPIBB_pins.SDAdir.value]
DIRpin=self.conf['parameters'][SPIBB_pins.SDAdir.value]
SetI2C=self.conf['parentcls'].SetVarValue
GetI2C=self.conf['parentcls'].GetVarValue
ADC_address=1+(reg_address<<1); #Read
logging.info(str(("I2Cbb get",hex(ADC_address),value)))
SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
#start
SetI2C(SDAdev,1,SDApin,[0]) #Output = low
SetI2C(DIRdev,1,DIRpin,[0]) #Output = low
SetI2C(CLKdev,1,CLKpin,[0])
ack=[0];
def TXbyte(b):
for bit in "{0:{fill}8b}".format(b, fill='0'):
SetI2C(DIRdev,1,DIRpin,[int(bit)])
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(DIRdev,1,DIRpin,[1]) #input
# GetI2C(SDAdev,1,SDApin,ack)
# print("Ack=",ack[0]);
SetI2C(CLKdev,1,CLKpin,[1])
GetI2C(SDAdev,1,SDApin,ack)
# print("Ack=",ack[0]);
SetI2C(SDAdev,1,SDApin,[0])
SetI2C(CLKdev,1,CLKpin,[0])
return ack[0];
def RXbyte(last=False):
b=0;
for i in range(8):
SetI2C(CLKdev,1,CLKpin,[1])
GetI2C(SDAdev,1,SDApin,ack)
# print(ack[0])
b=(b<<1)+ack[0];
SetI2C(CLKdev,1,CLKpin,[0])
# print("RXbyte",hex(b));
SetI2C(SDAdev,1,SDApin,[0])
SetI2C(DIRdev,1,DIRpin,[1 if last else 0]) #outout = low = ack
SetI2C(CLKdev,1,CLKpin,[1])
SetI2C(CLKdev,1,CLKpin,[0])
SetI2C(DIRdev,1,DIRpin,[1])
return b;
TXbyte(ADC_address);
print("si status:",hex(RXbyte()))#should be 0x80
for i in range(len(value)):
value[i]=RXbyte(last=(i==len(value)-1))
#stop
#SetI2C(DIRdev,1,DIRpin,[0]) #low
SetI2C(CLKdev,1,CLKpin,[1]) #Should be high
SetI2C(DIRdev,1,DIRpin,[1]) #Input = high
# print("read byte")
# Setbit(CS,0) #enable
a=[0]
N=len(value)
for i in range(N): value[i]=0
for cnt in range(8*(ADC_bytes+1)):
ret_value=Getbit(SDIO)
for i in range(N): value[i]=(value[i]<<1)+ ret_value[i]
Setbit(CLK,1)
Setbit(CLK,0) #read after falling edge
Setbit(CS,1) #disable
Setbit(SDIO,1)#High when finished
Setbit(SDIOdir,0) #output
return True; return True;
\ No newline at end of file
ID= ['0x0', '0x81', '0x3a', '0x24']
Frequency set= 150000000
['0x8', '0xf0', '0xd1', '0x80']
si status: 0x80
si status: 0x80
si status: 0x80
Frequency read back= 150000000
['0x8', '0xf0', '0xd1', '0x80', '0x8', '0xf0', '0xd1', '0x80', '0x8', '0xf0', '0xd1', '0x80', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0']
import logging
import argparse
from opcuaserv import opcuaserv
from opcuaserv import i2client
from opcuaserv import yamlreader
#from opcuaserv import pypcc2
from i2cserv import i2cthread
import threading
import time
import sys
import signal
from yamlconfig import Find;
import yamlconfig as yc
logging.basicConfig(level="WARNING",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
RunTimer=True;
#def signal_handler(sig, frame):
# logging.warn('Stop signal received!')
# global RunTimer;
# RunTimer=False
#signal.signal(signal.SIGINT, signal_handler)
#logging.info("Start I2C processes")
#threads=[]
#I2Cclients=[]
name='RCUL'
#RCU_I2C=i2client.i2client(name=name)
conf=yc.yamlconfig(name)
conf.linkdevices()
conf.loaddrivers()
conf.linkdrivers()
def GetVal(name,N=1):
varid=conf.getvarid(name);
var1=conf.getvars()[varid]
drv=var1.get('drivercls');
mask=[True]*N+[False]*((32-1)*N);
data=drv.OPCUAReadVariable(varid,var1,mask)
return data[0].data,var1
data,var1=GetVal('RCU_ID');
print("ID=",[hex(d) for d in data[:4]]);
if False:
data,var1=GetVal('RCU_temperature');
D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
print("Temp=",D,"K")
if (D<290) or (D>350): exit()
data,var1=GetVal('RCU_3V3');
D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
print("3V3=",D,"V")
if (D<3.2) or (D>3.4): exit()
#print("data=",[hex(d) for d in data[:3]]);
def SetRegister(regname,value):
methodid=conf.getmethodid("RCU_on");
var1=conf.getmethod(methodid)
drv=var1.get('drivercls');
v1=conf.getdevreg(regname)
drv2=v1.get('drivercls')
mask=[True]+[False]*31;
if drv: drv.Setdevreg(v1,value,mask)
elif drv2: drv2.Setdevreg(v1,value,mask)
else: logging.warn("Driver not specified for instruction"+key)
if False:
SetRegister("IO1.GPIO1",[0])
SetRegister("IO1.GPIO2",[0x80]) #Analog power on
SetRegister("IO2.GPIO1",[0x40]) #Digital power on
SetRegister("IO2.GPIO2",[0])
SetRegister("IO1.CONF1",[0])
SetRegister("IO1.CONF2",[0])
SetRegister("IO2.CONF1",[0x80]) #Pgood on P07
SetRegister("IO2.CONF2",[0])
print("IO expander status:");
data,var=GetVal('RCU_IO1_GPIO1');print("IO1_1",hex(data[0]))
data,var=GetVal('RCU_IO1_GPIO2');print("IO1_2",hex(data[0]))
data,var=GetVal('RCU_IO2_GPIO1');print("IO2_1",hex(data[0]))
data,var=GetVal('RCU_IO2_GPIO2');print("IO2_2",hex(data[0]))
if False:
data,var1=GetVal('RCU_1V8');
D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
print("1V8=",D,"")
data,var1=GetVal('RCU_2V5');
D=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
print("2V5=",D,"")
if False:
data,var1=GetVal('ANT_Vin');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Vant_in=",D0,D1,D2)
# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
data,var1=GetVal('ANT_Vout');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Vant_out=",D0,D1,D2)
data,var1=GetVal('ANT_I');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Iant=",D0,D1,D2)
if False:
SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low, DTH_EN=low
SetRegister("IO3.GPIO2",[0x47]) #ADC SC=high, DTH_SDA=high
SetRegister("IO3.CONF1",[0]) #All output
SetRegister("IO3.CONF2",[0])
data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[0]))
data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[0]))
if False:
#Test reading register from ADCs
data,var=GetVal('RCU_ADC_JESD');print("ADC JESD",[hex(d) for d in data[:3]])
#Test writing ADC register
SetRegister("ADC1.SYNC_control",[1])
SetRegister("ADC1.Update",[1])
data,var=GetVal('RCU_ADC_sync');print("ADC sync",[hex(d) for d in data[:3]])
#Need to update I2c bitbang....
if True:
SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low, DTH_SDN=low
SetRegister("IO3.GPIO2",[0x3F]) #ADC SC=high, DTH_SDA=low, DTH_CLK=high
SetRegister("IO3.CONF1",[0]) #All output
SetRegister("IO3.CONF2",[0x40]) #DTH_SDA=input
# data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[0]))
# data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[0]))
f=int(150e6)
print("Frequency set=",f)
d=[0]*4;
for i in range(4):
d[3-i]=f%256;f//=256
# print([hex(h) for h in d])
SetRegister("DTH1.Freq",d) #DTH_SDA=input
data,var1=GetVal("RCU_DTH_freq")
# data,var1=GetVal("RCU_DTH_Rev")
f=0;
for i in range(4):
f=f*256+data[i];
print("Frequency read back=",f)
# print([hex(h) for h in data[:30]])
#print(data)
#scale=float(scale)
#data2=[(d*scale) for d in data2]
#print("ID=",[hex(d) for d in data[:4]]);
import logging
import argparse
from opcuaserv import opcuaserv
from opcuaserv import i2client
from opcuaserv import yamlreader
#from opcuaserv import pypcc2
from i2cserv import i2cthread
import threading
import time
import sys
import signal
from yamlconfig import Find;
import yamlconfig as yc
logging.basicConfig(level="WARNING",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
RCU=5
#Gain=0; #15dB
#Gain=0x0a; #5dB
#Gain=0xf; #0dB
#Gain=0x15; #-6dB
#Gain=[0x00,0xf,0x00]
Gain=[0x15,0x15,0x15]
print("Power on RCU=",RCU);
RunTimer=True;
#def signal_handler(sig, frame):
# logging.warn('Stop signal received!')
# global RunTimer;
# RunTimer=False
#signal.signal(signal.SIGINT, signal_handler)
#logging.info("Start I2C processes")
#threads=[]
#I2Cclients=[]
name='RCUL'
#RCU_I2C=i2client.i2client(name=name)
conf=yc.yamlconfig(name)
conf.linkdevices()
conf.loaddrivers()
conf.linkdrivers()
def GetVal(name,N=1):
varid=conf.getvarid(name);
var1=conf.getvars()[varid]
drv=var1.get('drivercls');
mask=[False]*((32)*N);
mask[RCU]=True;
data=drv.OPCUAReadVariable(varid,var1,mask)
return data[0].data,var1
data,var1=GetVal('RCU_ID');
#print(data);
i=RCU*4;
print("ID=",[hex(d) for d in data[i:i+4]]);
if True:
data,var1=GetVal('RCU_temperature');
# print(data);
i=RCU*3;
D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
print("Temp=",D,"K")
if (D<290) or (D>350): exit()
data,var1=GetVal('RCU_3V3');
D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
print("3V3=",D,"V")
if (D<3.2) or (D>3.4): exit()
#print("data=",[hex(d) for d in data[:3]]);
def SetRegister(regname,value):
methodid=conf.getmethodid("RCU_on");
var1=conf.getmethod(methodid)
drv=var1.get('drivercls');
v1=conf.getdevreg(regname)
drv2=v1.get('drivercls')
mask=[False]*32;
mask[RCU]=True;
if drv: drv.Setdevreg(v1,value,mask)
elif drv2: drv2.Setdevreg(v1,value,mask)
else: logging.warn("Driver not specified for instruction"+key)
if True:
# AntPower=0xC0
SetRegister("IO1.GPIO1",[Gain[0]])
SetRegister("IO1.GPIO2",[0x80+Gain[1]]) #Analog power on
# SetRegister("IO1.GPIO1",[0xC0+Gain])
# SetRegister("IO1.GPIO2",[0xC0+Gain]) #Analog power on
SetRegister("IO2.GPIO1",[0x40+Gain[2]]) #Digital power on
# SetRegister("IO1.GPIO2",[0x00]) #Analog power off
# SetRegister("IO2.GPIO1",[0x00]) #Digital power off
SetRegister("IO2.GPIO2",[0x15]) #Band select all band0, leds on (low) 10MHz
# SetRegister("IO2.GPIO2",[0x2a]) #Band select all band1, leds on (low) 30MHz
# SetRegister("IO2.GPIO2",[0x00]) #
SetRegister("IO1.CONF1",[0])
SetRegister("IO1.CONF2",[0])
SetRegister("IO2.CONF1",[0x80]) #Pgood on P07
SetRegister("IO2.CONF2",[0])
print("IO expander status:");
data,var=GetVal('RCU_IO1_GPIO1');print("IO1_1",hex(data[RCU]))
data,var=GetVal('RCU_IO1_GPIO2');print("IO1_2",hex(data[RCU]))
data,var=GetVal('RCU_IO2_GPIO1');print("IO2_1",hex(data[RCU]))
data,var=GetVal('RCU_IO2_GPIO2');print("IO2_2",hex(data[RCU]))
if True:
i=RCU*3;
data,var1=GetVal('RCU_1V8');
D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
print("1V8=",D,"")
if (D<1.6) or (D>2.0): exit()
data,var1=GetVal('RCU_2V5');
D=((data[i]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
print("2V5=",D,"")
#exit()
if False:
data,var1=GetVal('ANT_Vin');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Vant_in=",D0,D1,D2)
# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
data,var1=GetVal('ANT_Vout');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Vant_out=",D0,D1,D2)
data,var1=GetVal('ANT_I');
D0=((data[0]*256+data[1])*256+data[2])*var1.get('scale',1.)
D1=((data[3]*256+data[4])*256+data[5])*var1.get('scale',1.)
D2=((data[6]*256+data[7])*256+data[8])*var1.get('scale',1.)
print("Iant=",D0,D1,D2)
print("Setup ADC")
if True:
SetRegister("IO3.GPIO1",[0x15]) #ADC_SDIO=high, clk=low, DTH_EN=low
SetRegister("IO3.GPIO2",[0x47]) #ADC SC=high, DTH_SDA=high
SetRegister("IO3.CONF1",[0]) #All output
SetRegister("IO3.CONF2",[0])
data,var=GetVal('RCU_IO3_GPIO1');print("IO3_1",hex(data[RCU]))
data,var=GetVal('RCU_IO3_GPIO2');print("IO3_2",hex(data[RCU]))
# data,var=GetVal('RCU_ADC_sync');print("ADC sync",[hex(d) for d in data[RCU*3:RCU*3+3]])
if True:
#Test writing ADC register
SetRegister("ADC1.SYNC_control",[1])
SetRegister("ADC1.JESD_control1",[0x14])
SetRegister("ADC1.CML_level",[0x7])
# SetRegister("ADC1.Offset",[0x0])
SetRegister("ADC1.Update",[1])
SetRegister("ADC2.SYNC_control",[1])
SetRegister("ADC2.JESD_control1",[0x14])
SetRegister("ADC2.CML_level",[0x7])
# SetRegister("ADC2.Offset",[0x0])
SetRegister("ADC2.Update",[1])
SetRegister("ADC3.SYNC_control",[1])
SetRegister("ADC3.JESD_control1",[0x14])
SetRegister("ADC3.CML_level",[0x7])
# SetRegister("ADC3.Offset",[0x0])
SetRegister("ADC3.Update",[1])
if True:
data,var=GetVal('RCU_ADC_sync'); print("ADC sync",[hex(d) for d in data[RCU*3:RCU*3+3]])
data,var1=GetVal("RCU_ADC_lock");print("ADC lock",[hex(d) for d in data[RCU*3:RCU*3+3]])
data,var1=GetVal("RCU_ADC_CML_level");print("CML level",[hex(d) for d in data[RCU*3:RCU*3+3]])
if True:
print("Switch antenna voltages on")
# SetRegister("IO1.GPIO1",[0xC0]) #Antenna power on
# SetRegister("IO1.GPIO2",[0xC0]) #Analog power on
SetRegister("IO1.GPIO1",[0xC0+Gain[0]])
SetRegister("IO1.GPIO2",[0xC0+Gain[1]]) #Analog power on
data,var1=GetVal('ANT_Vin');
i=RCU*9;
D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
print("Vant_in=",D0,D1,D2)
data,var1=GetVal('ANT_Vout');
D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
print("Vant_out=",D0,D1,D2)
data,var1=GetVal('ANT_I');
D0=((data[i+0]*256+data[i+1])*256+data[i+2])*var1.get('scale',1.)
D1=((data[i+3]*256+data[i+4])*256+data[i+5])*var1.get('scale',1.)
D2=((data[i+6]*256+data[i+7])*256+data[i+8])*var1.get('scale',1.)
print("Iant=",D0,D1,D2)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment