Skip to content
Snippets Groups Projects

Pypcc2

Merged Thomas Juerges requested to merge pypcc2 into master
42 files
+ 1471
2089
Compare changes
  • Side-by-side
  • Inline
Files
42
+ 0
134
from I2Cdevices import *;
import numpy as np
import logging
class I2Cbitbang(I2Cdevices):
def I2CSet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
# def I2Cset(self,D,name,reg,data,I2Ccallback,dev_number=0):
Dev=Find(self.D['I2C_devices'],'dev_name',dev)
Reg=Find(Dev['dev_registers'],'reg_name',reg)
regnr=Reg['reg_addr']
Addr=Dev['dev_address'];
# data2=[Addr<<1,regnr]+data;
data2=[Addr<<1]+int2bytes(regnr)+value
# logging.info("%s",data2)
I2Ccallback('SDO',0)
I2Ccallback('SCL',1)
if not(I2CbbTX(data2,I2Ccallback)): return False;
data2=[(Addr<<1)+1];
data3=[0]
if not(I2CbbRX(data2,data3,I2Ccallback)): return False;
if data3[0]!=0x80:
logging.error("Expected Ack 0x80, received: %s",data3);
return False;
logging.info("Si4012 TX success!")
return True;
def I2CGet(self,dev,reg,value,I2Ccallback,width=8,bitoffset=0):
SPI=Find(self.D['I2C_devices'],'dev_name',dev)
dev_number=0;
Reg=Find(SPI['dev_registers'],'reg_name',reg)
Addr=SPI['dev_address'];
regnr=Reg['reg_addr']
data2=[Addr<<1]+int2bytes(regnr)
if (len(data2)==3) and (data2[1]==17):
data2[1]=18; #SI4012 hack as get is one higher than set
width+=1; #hack to ignore first ack byte
# while regnr>255:
# data2=[regnr%256]+data2;
# regnr=int(regnr/256);
# data2=[Addr<<1,regnr]+data2;
# logging.info("%s %s %s",data2,Addr,Reg['reg_addr']);
if not(I2CbbTX(data2,I2Ccallback)): return False;
# return False;
data2=[(Addr<<1)+1];
l1=int(np.floor((width+bitoffset+7)/8))
makesinglevalue=((len(value)==1) and (l1>1));
if makesinglevalue: data3=[0 for x in range(l1)]
else: data3=value
if not(I2CbbRX(data2,data3,I2Ccallback)): return False;
if makesinglevalue: value[0]=bytes2int(data3)
else: value[:]=data3[:];
if (width!=l1*8) or (bitoffset>0):
value[0]=UnMask(value[0],width,bitoffset)
#logging.info("Received: %s",data3);
return True;
def I2CbbTX(data2,SetBit):
SetBit('SDIOdir',1) #Input, should be high
if SetBit('SDI',0,True)==0:
logging.error("I2C line low!")
return False;
#Start
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',0)
for b in data2:
bit_array = "{0:{fill}8b}".format(b, fill='0')
#logging.info(bit_array)
for bit in bit_array:
SetBit('SDIOdir',int(bit)) #input=high, output=low
SetBit('SCL',1)
SetBit('SCL',0)
SetBit('SDIOdir',1) #Input
#logging.info(GetBit(SDI))
if SetBit('SDI',0,True)==1:
logging.error("I2C: Not ACK")
return False;
SetBit('SCL',1)
#logging.info(GetBit(SDI))
SetBit('SCL',0)
# SetBit(SDIOdir,0) #Output
#Stop
SetBit('SDIOdir',0) #Low
SetBit('SCL',1)
SetBit('SDIOdir',1) #High
return True
def I2CbbRX(data1,data2,SetBit):
SetBit('SDIOdir',1) #Input, should be high
if SetBit('SDI',0,True)==0:
logging.error("I2C ack: line low!")
return False;
#Start
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',0)
for b in data1:
bit_array = "{0:{fill}8b}".format(b, fill='0')
#logging.info(bit_array)
for bit in bit_array:
SetBit('SDIOdir',int(bit)) #input=high, output=low
SetBit('SCL',1)
SetBit('SCL',0)
SetBit('SDIOdir',1) #Input
#logging.info(GetBit(SDI))
if SetBit('SDI',0,True)==1:
logging.error("I2C: Not ACK")
return False;
SetBit('SCL',1)
#logging.info(GetBit(SDI))
SetBit('SCL',0)
for x in range(len(data2)):
readbit='';
SetBit('SDIOdir',1) #Input
for bit in range(8):
SetBit('SCL',1)
readbit+=str(SetBit('SDI',0,True))
SetBit('SCL',0)
if x<len(data2)-1:
SetBit('SDIOdir',0) #Output
else: #last one = not-ack
SetBit('SDIOdir',1) #Output
SetBit('SCL',1)
SetBit('SCL',0)
data2[x]=int(readbit,2)
#Stop
SetBit('SDIOdir',0) #Output = low
SetBit('SCL',1)
SetBit('SDIOdir',1) #Input = high
return True;
Loading