• Fixed bug. When GP1, 2 and 3 are all in ADC mode and ADC reference is VDD. If just after reset VRM reference is selected, ADC stops working.

Interrupt on Change:
  • Added new section about Interrupt On Change (IOC) detection.

  • Renamed function wake_up_config to IOC_config().

  • Added IOC_read() to read Interrupt On Change flag.

  • Added IOC_clear() to clear Interrupt On Change flag.

  • Replaced raising edge with rising edge.

  • Removed deprecated functions I2C_is_idle and I2C_cancel.

  • Solved bug USB remote Wake-up is not saved with save_config().

  • New behavior for enable_power_management(). Changes are not saved immediately to Flash. Call to save_config() is needed instead.

  • New function read_flash_info().

  • Device information now returns GPIO designation and default status.

  • Document as limitation a weird MCP2221’s bug related to interrupt flag and ADC reference.



  • New SMBus compatible class. Useful to use other Python I2C modules with MCP2221 interface.

  • Fixed. I2C slave class exception when device is not present.

  • Conflict with kernel module hid_mcp2221. See Delay at the end of script (Linux) in Install / troubleshooting.

  • Explain I2C speed limit for very short transfers.

  • Document SMBus compatible class. Include example code for BME280 (Temperature, Pressure, Humidity sensor).


  • Fixed bug: when ADC reference is VDD and DAC reference is VRM and a new GPIO configuration is applied, DAC stops working. It seems to be related with a known MCP limitation.

  • Fixed bug: Restore DAC reference value after reset.

  • In some cases MCP2221A’s firmware does not restore DAC or ADC pin assignment when it boots. Software workaround.

  • Deprecated I2C_cancel() and I2C_is_idle(). Bus is now managed automatically. You can use _i2c_release and _i2c_status as replacement if needed.

  • Fixed. Low SCL and low SDA exceptions were swapped.

  • When the I2C bus detects SDA activity, the next transfer does not work fine. Prevented via software. See _i2c_status.

  • Instructions and schematic for testing in the Install / troubleshooting section.

  • Replaced PNG schematics by SVG versions in Examples.

  • Troubleshooting section to run as an unprivileged user in Linux (udev rule).

  • Added developers section with details about I2C transfers. See Internal details.

  • Added test suite.

  • Added IOC edge detection setting in device representation.

  • Fixed. Bug when reset a device with customized VID/PID.

  • Multiple tries to find the device after a reset() (until timeout).


Improved USB stability:
  • Added timeout in HID read.

  • Added retries in send_cmd.

  • Better USB trace_commands output format.

  • Removed sleep parameter in send_cmd().

More reliable I2C functions:
  • Rewritten I2C_read() to take into account internal I2C engine status.

  • Rewritten I2C_write() to prevent infinite loop, quicker write and ACK checking.

  • Timeout and early failure check in read and write to prevent infinite loop.

  • Custom exceptions for better error handling (see Exceptions in Full API reference)

  • Automatically try to recover from an I2C error in past operation.

New features:
  • Function to save current state: save_config().

  • Added speed parameter in I2C Slave class.

  • Removed self argument from autodoc methods.

  • Added pictures and schematics.

  • Added MCP2221 pinout guide.

  • Added advanced ADC/DAC examples section.

  • Added license.

  • Corrected typos.

  • Formatting.


Released 1.5.1 again by mistake.



Add I2C Slave helper class.


First EasyMCP2221 version.

Older releases

This project was initially a fork of PyMCP2221A library by Yuta KItagami (

I made a few changes, then a few more, until I ended up rewriting almost all the code. Since the API is no longer compatible with PyMCP2221A, I decided to create a new package.

Tags v1.4 and earlier are from PyMCP2221A.