Skip to content
Snippets Groups Projects
Select Git revision
  • d10296252e93269b5388b57333c6eb119f4399fa
  • master default protected
  • dither_on_off_disabled
  • yocto
  • pypcc2
  • pypcc3
  • 2020-12-07-the_only_working_copy
  • v2.1
  • v2.0
  • v1.0
  • v0.9
  • Working-RCU_ADC,ID
  • 2020-12-11-Holiday_Season_release
13 results

I2Cbitbang.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    I2Cbitbang.py 4.83 KiB
    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(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.info("Expected Ack 0x80, received:",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(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:",data3); 
              return True;
    
    
    def I2CbbTX(data2,SetBit):
              SetBit('SDIOdir',1) #Input, should be high
              if SetBit('SDI',0,True)==0: 
                          logging.info("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.info("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.info("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.info("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;