]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
Merge pull request #349 from simallaire/multiple_mcp 5.5.1
authorMelissa LeBlanc-Williams <melissa@adafruit.com>
Thu, 8 Oct 2020 14:27:06 +0000 (08:27 -0600)
committerGitHub <noreply@github.com>
Thu, 8 Oct 2020 14:27:06 +0000 (08:27 -0600)
Enable support for multiple mcp2221

examples/mcps_busio_i2c.py [new file with mode: 0755]

diff --git a/examples/mcps_busio_i2c.py b/examples/mcps_busio_i2c.py
new file mode 100755 (executable)
index 0000000..4729e3e
--- /dev/null
@@ -0,0 +1,57 @@
+import time
+import hid
+import busio
+
+from adafruit_blinka.microcontroller.mcp2221.mcp2221 import mcp2221 as _mcp2221
+from adafruit_blinka.microcontroller.mcp2221.mcp2221 import MCP2221 as _MCP2221
+from adafruit_blinka.microcontroller.mcp2221.i2c import I2C as _MCP2221I2C
+
+MLXADDR = 0x33
+ADDRID1 = 0x2407
+
+
+class MCP2221(_MCP2221):  # pylint: disable=too-few-public-methods
+    def __init__(self, address):
+        self._hid = hid.device()
+        self._hid.open_path(address)
+        print("Connected to " + str(address))
+        self._gp_config = [0x07] * 4  # "don't care" initial value
+        for pin in range(4):
+            self.gp_set_mode(pin, self.GP_GPIO)  # set to GPIO mode
+            self.gpio_set_direction(pin, 1)  # set to INPUT
+
+
+class MCP2221I2C(_MCP2221I2C):  # pylint: disable=too-few-public-methods
+    def __init__(self, mcp2221, *, frequency=100000):
+        self._mcp2221 = mcp2221
+        self._mcp2221.i2c_configure(frequency)
+
+
+class I2C(busio.I2C):  # pylint: disable=too-few-public-methods
+    def __init__(self, mcp2221_i2c):
+        self._i2c = mcp2221_i2c
+
+
+addresses = [mcp["path"] for mcp in hid.enumerate(0x04D8, 0x00DD)]
+
+i2c_devices = []
+i2c_devices.append(I2C(MCP2221I2C(_mcp2221)))
+
+for addr in addresses:
+    try:
+        i2c_device = I2C(MCP2221I2C(MCP2221(addr)))
+        i2c_devices.append(i2c_device)
+    except OSError:
+        print("Device path: " + str(addr) + " is used")
+
+
+while True:
+    for i2c in i2c_devices:
+        addrbuf = bytearray(2)
+        addrbuf[0] = ADDRID1 >> 8
+        addrbuf[1] = ADDRID1 & 0xFF
+        inbuf = bytearray(6)
+        i2c.writeto_then_readfrom(MLXADDR, addrbuf, inbuf)
+        print("Device " + str(i2c_devices.index(i2c)) + ": ")
+        print(inbuf)
+        time.sleep(0.5)