mcps_busio_i2c.py
1 import time 2 import hid 3 import busio 4 5 from adafruit_blinka.microcontroller.mcp2221.mcp2221 import mcp2221 as _mcp2221 6 from adafruit_blinka.microcontroller.mcp2221.mcp2221 import MCP2221 as _MCP2221 7 from adafruit_blinka.microcontroller.mcp2221.i2c import I2C as _MCP2221I2C 8 9 MLXADDR = 0x33 10 ADDRID1 = 0x2407 11 12 13 class MCP2221(_MCP2221): # pylint: disable=too-few-public-methods 14 def __init__(self, address): 15 self._hid = hid.device() 16 self._hid.open_path(address) 17 print("Connected to " + str(address)) 18 self._gp_config = [0x07] * 4 # "don't care" initial value 19 for pin in range(4): 20 self.gp_set_mode(pin, self.GP_GPIO) # set to GPIO mode 21 self.gpio_set_direction(pin, 1) # set to INPUT 22 23 24 class MCP2221I2C(_MCP2221I2C): # pylint: disable=too-few-public-methods 25 def __init__(self, mcp2221, *, frequency=100000): 26 self._mcp2221 = mcp2221 27 self._mcp2221.i2c_configure(frequency) 28 29 30 class I2C(busio.I2C): # pylint: disable=too-few-public-methods 31 def __init__(self, mcp2221_i2c): 32 self._i2c = mcp2221_i2c 33 34 35 addresses = [mcp["path"] for mcp in hid.enumerate(0x04D8, 0x00DD)] 36 37 i2c_devices = [] 38 i2c_devices.append(I2C(MCP2221I2C(_mcp2221))) 39 40 for addr in addresses: 41 try: 42 i2c_device = I2C(MCP2221I2C(MCP2221(addr))) 43 i2c_devices.append(i2c_device) 44 except OSError: 45 print("Device path: " + str(addr) + " is used") 46 47 48 while True: 49 for i2c in i2c_devices: 50 addrbuf = bytearray(2) 51 addrbuf[0] = ADDRID1 >> 8 52 addrbuf[1] = ADDRID1 & 0xFF 53 inbuf = bytearray(6) 54 i2c.writeto_then_readfrom(MLXADDR, addrbuf, inbuf) 55 print("Device " + str(i2c_devices.index(i2c)) + ": ") 56 print(inbuf) 57 time.sleep(0.5)