added i2c unit

doublebuf
Ondřej Hruška 6 years ago
parent 3fca05e239
commit 0d2d1fc926
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 1
      gex/__init__.py
  2. 72
      gex/units/I2C.py
  3. 19
      main.py

@ -10,6 +10,7 @@ from gex.Client import Client
from gex.units.DOut import DOut from gex.units.DOut import DOut
from gex.units.DIn import DIn from gex.units.DIn import DIn
from gex.units.Neopixel import Neopixel from gex.units.Neopixel import Neopixel
from gex.units.I2C import I2C
# General, low level # General, low level

@ -0,0 +1,72 @@
import gex
class I2C(gex.Unit):
"""
I2C master direct access
"""
def _type(self):
return 'I2C'
def _begin_i2c_pld(self, address:int, a10bit:bool=False):
pb = gex.PayloadBuilder()
if a10bit: address |= 0x8000
pb.u16(address)
return pb
def write(self, address:int, payload, a10bit:bool=False):
"""
Write to an address
"""
pb = self._begin_i2c_pld(address, a10bit)
pb.blob(payload) # payload to write
self.query(0x80, pb.close())
def read(self, address:int, count, a10bit:bool=False):
"""
Read from an address
"""
pb = self._begin_i2c_pld(address, a10bit)
pb.u16(count) # number of bytes to read
self.query(0x01, pb.close())
def read_reg(self, address:int, reg, width:int=1, a10bit:bool=False, endian='little'):
"""
Read a single register
"""
return self.read_regs(address, reg, count=1, width=width, a10bit=a10bit, endian=endian)[0]
def read_regs(self, address:int, reg, count:int, width:int=1, a10bit:bool=False, endian='little'):
"""
Read multiple registers from an address
"""
pb = self._begin_i2c_pld(address, a10bit)
pb.u8(reg)
pb.u8(width*count) # we assume the device will auto-increment (most do)
resp = self.query(0x03, pb.close())
fields = []
pp = gex.PayloadParser(resp.data, endian=endian)
for i in range(0, count):
if width==1: fields.append(pp.u8())
elif width==2: fields.append(pp.u16())
elif width==3: fields.append(pp.u24())
elif width==4: fields.append(pp.u32())
else: raise Exception("Bad width")
return fields
def write_reg(self, address:int, reg, value:int, width:int=1, a10bit:bool=False, endian='little'):
"""
Write a to a single register
"""
pb = self._begin_i2c_pld(address, a10bit)
pb.u8(reg)
pb.endian = endian
if width == 1: pb.u8(value)
elif width == 2: pb.u16(value)
elif width == 3: pb.u24(value)
elif width == 4: pb.u32(value)
else: raise Exception("Bad width")
self.query(0x82, pb.close())

@ -50,14 +50,29 @@ if False:
strip.write((b << 2) | ((~b) & 1)) strip.write((b << 2) | ((~b) & 1))
time.sleep(.02) time.sleep(.02)
if True: if False:
neo = gex.Neopixel(client, 'npx') neo = gex.Neopixel(client, 'npx')
print('We have %d neopixels.\n' % neo.get_len()) print('We have %d neopixels.\n' % neo.get_len())
#neo.load([0xF0F0F0,0,0,0xFF0000])
# generate a little animation... # generate a little animation...
for i in range(0,512): for i in range(0,512):
j = i if i < 256 else 255-(i-256) j = i if i < 256 else 255-(i-256)
neo.load([0x660000+j, 0x3300FF-j, 0xFFFF00-(j<<8), 0x0000FF+(j<<8)-j]) neo.load([0x660000+j, 0x3300FF-j, 0xFFFF00-(j<<8), 0x0000FF+(j<<8)-j])
time.sleep(.005) time.sleep(.001)
neo.load([0,0,0,0])
i2c = gex.I2C(client, 'i2c')
# i2c.write(0x76, payload=[0xD0])
# print(i2c.read(0x76, count=1))
print(i2c.read_reg(0x76, 0xD0))
print("%x" % i2c.read_reg(0x76, 0xF9, width=3, endian='big'))
i2c.write_reg(0x76, 0xF4, 0xFA)
print(i2c.read_reg(0x76, 0xF4))

Loading…
Cancel
Save