Skip to main content

pymcp2222 - Microchip MCP2222 USB-to-I2C/SPI/UART/IO Bridge - CLI and Python library

PyPI - Format PyPI - Python Version PyPI - License


Overview

pymcp2222 is a command-line tool and Python library to provision, configure, and control Microchip's MCP2222 USB-to-UART/I2C/SPI/IO bridge devices, with unified CLI and API.


Installation

pip install pymcp2222

Command-Line Usage

See all options and help with:

pymcp2222 --help
pymcp2222 <command> --help

Device Listing

pymcp2222 list                                 # List devices (default VID/PID)
pymcp2222 --vid 0x1234 --pid 0x5678 list       # List devices with custom VID/PID
pymcp2222 --vid 0x04D8 --pid 0x0B15 --serial SERIALNO list

GPIO Examples

pymcp2222 gpio read --pin 0
pymcp2222 gpio write --pin 2 --value 1

IO Pin Control and Configuration Examples

# Set one pin
pymcp2222 io setconfig --pin 3 --config designation=GPIO3,direction=output,open_drain=1,idle_state=1,pull_up=1

# Set an alternate alert config
pymcp2222 io setconfig --pin 2 --config designation=ALRT1,direction=input,pull_up=1,edge=rising

# Get pin config
pymcp2222 io getconfig --pin 2

I2C Protocol Examples

# Configure I2C bus
pymcp2222 i2c configure --speed 400kHz --timeout 100ms

# I2C write
pymcp2222 i2c write --address 0x55 --data 0xA0,0xB1
pymcp2222 i2c write --address 0x55 --input-file C:\\Users\\JohnDoe\\mydata.csv

# I2C read
pymcp2222 i2c read --address 0x55 --length 2
pymcp2222 i2c read --address 0x55 --length 10 --output-file C:\\Users\\JohnDoe\\result.csv

# I2C write-read (repeated start)
pymcp2222 i2c write_read --address 0x12 --write-data 0xEF,0xAB --read-length 2 --output-file C:\\Users\\JohnDoe\\readback.csv

# I2C line diagnostics and recovery
pymcp2222 i2c get_scl_sda
pymcp2222 i2c bus_recovery

SPI Protocol Examples

# Configure SPI
pymcp2222 spi configure --cs CS1 --speed 3MHz --mode 0 --polarity active_low --delay 100

# SPI write
pymcp2222 spi write --data 0xAA,0xBB
pymcp2222 spi write --input-file C:\\Users\\JohnDoe\\mydata.csv

# SPI read
pymcp2222 spi read --length 4
pymcp2222 spi read --length 16 --output-file C:\\Users\\JohnDoe\\readbytes.csv

# SPI exchange (full duplex)
pymcp2222 spi exchange --data 0x01,0x02,0x03
pymcp2222 spi exchange --input-file C:\\Users\\JohnDoe\\in.csv --output-file C:\\Users\\JohnDoe\\out.csv

CONFIG Command (Full Device Configuration) Examples

# Get config
pymcp2222 config get usb
pymcp2222 config get manufacturer
pymcp2222 config get product_name
pymcp2222 config get serial_number
pymcp2222 config get io --source EEPROM
pymcp2222 config get i2c --source SRAM
pymcp2222 config get spi --source SRAM
pymcp2222 config get protection_level
pymcp2222 config get rev_id

# Set manufacturer/product/serial
pymcp2222 config set manufacturer --name "Microchip Inc."
pymcp2222 config set product_name --name "My Product"
pymcp2222 config set serial_number --new-serial "SN0010002"

# Set USB (with optional custom VID/PID, power descriptors)
pymcp2222 config set usb --newvid 0x1234 --newpid 0x5678 --max-current 250mA
pymcp2222 config set usb --newvid 0x04D8 --newpid 0x0B15 --max-current 250mA --self-powered --remote-wakeup --serial-enabled
pymcp2222 --vid 0x1234 --pid 0x5678 config set usb --newvid 0x04D8 --newpid 0x0B15 --max-current 250mA

# Set all IO pins at once
pymcp2222 config set io \
    --pin0 designation=GPIO0,direction=output,open_drain=1,idle_state=1,pull_up=1 \
    --pin1 designation=GPIO1,direction=input,pull_up=1 \
    --pin2 designation=ALRT1,direction=input,pull_up=1,edge=rising \
    --pin3 designation=CLKO,direction=output,clkdiv=4MHZ \
    --pin4 designation=ALRT2,direction=input,pull_up=0,edge=falling \
    --pin5 designation=ALRT3,direction=input,edge=rising,pull_up=0

# Set I2C/SPI config
pymcp2222 config set i2c --speed 400kHz --timeout 100ms
pymcp2222 config set spi --speed 3MHz --mode 0 --cs CS1 --polarity active_low --delay 2500

# Password protection/config locking
pymcp2222 config enable_password --password abcd1234
pymcp2222 config disable_password --password abcd1234
pymcp2222 config lock_config --password abcd1234
pymcp2222 config unlock_config --password abcd1234
pymcp2222 config change_password --old abcd1234 --new 4321dcba
pymcp2222 config permanent_lock --serial-number SN0010002

# Copy EEPROM to SRAM, restore factory defaults, soft reset
pymcp2222 config eeprom_as_current
pymcp2222 config reset_to_factory
pymcp2222 config soft_reset

Python API Usage

Here are examples for all main API types/classes.
All exceptions raised are documented in the respective method docstrings.


Device Enumeration (list_mcp2222_devices.py)

from pymcp2222.list_mcp2222_devices import list_devices
devices = list_devices()
for d in devices:
    print(f"Device: vid={d.vid:04x} pid={d.pid:04x} serial={d.serial} product={d.product}")

Device Connection and Basic Usage (mcp2222device.py)

from pymcp2222.mcp2222device import MCP2222Device
dev = MCP2222Device()  # Default VID/PID. Or: MCP2222Device(vid=0x1234, pid=0x5678, serial="...")
dev.open()
print("Connected:", dev.get_connected_device_info())
dev.close()

Configure IO pin and get configuration (io.py)

Configure IO pin

from pymcp2222.io import IOPinConfig, IODirection, IO0Designation

dev = MCP2222Device()
config = IOPinConfig(
    designation=IO0Designation.GPIO0,
    direction=IODirection.OUTPUT,
    open_drain=True,
    idle_state=True,
    pull_up=True
)
dev.io.set_config(0, config)
result = dev.io.get_config(0)
print(result)

Read/Write a GPIO

from pymcp2222.mcp2222device import MCP2222Device
from pymcp2222.io import GpioVal

dev = MCP2222Device()
dev.open()
state = dev.io.gpio_read(0)
print("GPIO0 state:", state)
dev.io.gpio_write(0, GpioVal.HIGH)
dev.close()

Device-wide IO Configuration (mcp2222device.py)

Set all IO pins (EEPROM, takes effect after power-cycle or soft-reset):

from pymcp2222.mcp2222device import MCP2222Device, IOSettings
from pymcp2222.io import IOPinConfig, IODirection, IO0Designation, IO1Designation, IO2Designation, IO3Designation, IO4Designation, IO5Designation

dev = MCP2222Device()
setting = IOSettings([
    IOPinConfig(IO0Designation.GPIO0, IODirection.OUTPUT, open_drain=True, idle_state=True, pull_up=True),
    IOPinConfig(IO1Designation.GPIO1, IODirection.INPUT, pull_up=True),
    IOPinConfig(IO2Designation.ALRT1, IODirection.INPUT, pull_up=True),
    IOPinConfig(IO3Designation.CLKO, IODirection.OUTPUT, open_drain=True, idle_state=False),
    IOPinConfig(IO4Designation.ALRT2, IODirection.INPUT, pull_up=False),
    IOPinConfig(IO5Designation.ALRT3, IODirection.INPUT, pull_up=False)
])
dev.set_io_power_on_config(setting)

Get all IO pin configs (SRAM or EEPROM):

from pymcp2222.mcp2222device import ConfigSource
io_config = dev.get_io_config(ConfigSource.EEPROM)
print(io_config.to_dict())

I2C: Configure, Read, Write, Write_Read (i2c.py)

Configure I2C (in EEPROM for next power-on):

from pymcp2222.mcp2222device import MCP2222Device
from pymcp2222.i2c import I2CParams, I2CSpeed

dev = MCP2222Device()
params = I2CParams(I2CSpeed.FREQ_400KHZ, timeout=100)
dev.set_i2c_power_on_config(params)

# Get I2C config from EEPROM/SRAM
i2c_params_eeprom = dev.get_i2c_config(ConfigSource.EEPROM)
print("I2C EEPROM config:", i2c_params_eeprom.to_dict())
i2c_params_sram = dev.get_i2c_config(ConfigSource.SRAM)
print("I2C SRAM config:", i2c_params_sram.to_dict())

I2C Runtime Operations:

dev.open()
dev.i2c.configure(params)
dev.i2c.write(0x55, [0xA0, 0xB1, 0x02])
data = dev.i2c.read(0x55, 2)
print("I2C read result:", list(data))
data2 = dev.i2c.write_read(0x55, [0xA0, 0xB1], 2)
print("I2C write_read result:", list(data2))
dev.close()

I2C Line Status / Bus Recovery:

status = dev.i2c.get_scl_sda_status()
print("SCL High:", status.scl_high, "SDA High:", status.sda_high)
success = dev.i2c.bus_recovery()
print("Bus recovery:", "Released" if success else "Failed")

SPI: Configure, Write, Read, Exchange (spi.py)

Write SPI settings to EEPROM (power-on config):

from pymcp2222.mcp2222device import MCP2222Device
from pymcp2222.spi import SPIParams, SPISpeed, SPIMode, SpiCs, SpiCsPolarity

dev = MCP2222Device()
params = SPIParams(speed=SPISpeed.FREQ_3MHZ, mode=SPIMode.MODE0,
    cs=SpiCs.CS1, polarity=SpiCsPolarity.ACTIVE_LOW, delay_us=100)
dev.set_spi_power_on_config(params)

# Get SPI config from EEPROM/SRAM
spi_params_eeprom = dev.get_spi_config(ConfigSource.EEPROM)
print("SPI EEPROM config:", spi_params_eeprom.to_dict())
spi_params_sram = dev.get_spi_config(ConfigSource.SRAM)
print("SPI SRAM config:", spi_params_sram.to_dict())

Configure runtime SPI and exchange data:

dev.open()
dev.spi.configure(SPISpeed.FREQ_3MHZ, SPIMode.MODE0, SpiCsPolarity.ACTIVE_LOW, SpiCs.CS1, delay_us=100)
dev.spi.write([0xAA, 0xBB])
read_bytes = dev.spi.read(4)
print("SPI read result:", list(read_bytes))
echo = dev.spi.exchange([0x01, 0x02, 0x03, 0x04])
print("SPI exchange result:", list(echo))
dev.close()

Device Configuration APIs (mcp2222device.py)

Set/get manufacturer/product/serial [max 30 characters]

dev.set_manufacturer("Microchip Inc.")
print(dev.get_manufacturer())
dev.set_product_name("My Product")
print(dev.get_product_name())
dev.set_serial_number("SN0010002")
print(dev.get_serial_number())

Set USB config (VID/PID, current, flags):

from pymcp2222.mcp2222device import USBParams, USBDevcfg
usbparams = USBParams(
    vid=0x1234, pid=0x5678,
    devcfg=USBDevcfg(self_powered=True, remote_wakeup=False, serial_number_enabled=True),
    max_current=250)
dev.set_usb_params(usbparams)
cfg = dev.get_usb_params()
print(cfg)

Change/enable/disable password [8 characters], lock config, factory reset, soft reset:

dev.enable_password("abcd1234")
dev.disable_password("abcd1234")
dev.lock_config("abcd1234")
dev.unlock_config("abcd1234")
dev.change_password("abcd1234", "4321dcba")
dev.reset_to_factory()
dev.soft_reset()

Permanently lock config (requires serial):

dev.permanent_lock("SERIAL")

Get protection level:

lvl = dev.get_protection_level()
print(lvl.description)

Get Revision ID:

id = dev.get_rev_id()
print(id.value)

Additional Information

  • Full CLI reference: pymcp2222 --help
  • CLI + Python API for all device/IO/I2C/SPI/config operations.
  • MCP2222 Product Page

Changelog

[1.0.1] - August 2026

Initial public release.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pymcp2222-1.0.1.7-py3-none-any.whl (104.3 kB view details)

Uploaded Python 3

File details

Details for the file pymcp2222-1.0.1.7-py3-none-any.whl.

File metadata

  • Download URL: pymcp2222-1.0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 104.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.15

File hashes

Hashes for pymcp2222-1.0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 95d2d035a715eee8ced0656f26c59f693d4f6ca3080c4a4a243aa3daf06f3d06
MD5 b0f29c125afcc9c116910a22a95de211
BLAKE2b-256 1d21a39396937125021a54192e31a071ce4a28be2c195af209db4829513f13b5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page