MCP2221 HID Library

Summary of MCP2221 HID Library


This open-source library provides a multi-platform alternative to Microchip's proprietary DLLs for interfacing with the MCP2221 USB-to-UART/I2C converter. It supports ADC, DAC, GPIO, interrupt inputs, clock reference output, and USB descriptors via HIDAPI. While I2C support is limited, the library enables remote wake-up functionality and raw I2C pin reading. Note that UART throughput is capped at 250kbps due to transmission gaps, and internal pull-ups are unavailable.

Parts used in the MCP2221 HID Library Project:

  • MCP2221 USB to UART and I2C/SMBus serial converter
  • HIDAPI library
  • C++ wrapper
  • C# wrapper

This is a library for interfacing with the HID features of the MCP2221 USB to UART and I2C/SMBus serial converter from Microchip. The converter includes 4 GPIO pins, 3x 10-bit ADCs, 1x 5-bit DAC and more.
Microchip does provide a library for interfacing with the chip, however it is supplied as proprietary DLLs. This project aims to be an open-source and multi-platform alternative.
This library also makes use of HIDAPI.

Supported features

Feature Status
ADC Supported
DAC Supported
GPIO Supported
Interrupt input Supported
Clock reference output Mostly Supported*
USB Descriptors
(Manufacturer, product, serial, VID, PID)
Supported
I2C/SMB Limited support, WIP
Flash password protection Not yet implemented
C++ and C# wrappers Not yet implemented

*Reading clock out duty cycle is not documented in the datasheet, but the Microchip library seems to support it.

Download from GitHub
DocumentationBits of info about the MCP2221

  • Doesn’t use a crystal, only requires 1 small capacitor when powered with 3.3V or 2 capacitors when powered with 5V.
  • Available in a hacker friendly DIP package.
  • Has a remote wake function which when used in conjunction with the interrupt input can be used to wakeup the USB host (usually a PC), just like waking up from a keyboard or mouse press.
  • The raw value of the I2C pins can also be read, allowing them to be used as an additional 2 general purpose input pins.
  • Unfortunately there are no options for enabling any internal pull-up/down resistors.
  • The MCP2221 seems to be a PIC16F1455. [Source]
  • Current consumption @ 3.3V with USB disconnected can be anywhere between 20uA and 70uA, not sure what causes such a difference. Remote wakeup needs to be disabled (default) otherwise current consumption will be about 5mA.
  • Kinda slow compared to other USB/UART converters. Even with the baud rate set to 1,000,000 its overall throughput is only about 250,000 bps. More about this below.

Unconnected pins
The usual way to deal with unconnected pins are to enable their internal pull-up/down resistors, but this chip doesn’t support them. Instead it’s probably best to set unconnected pins as output high or low.
The I2C pins are a little different since they can’t be set to outputs, though there’s still few options:

 

I2C Pin Description
Unconnected Bad, floating inputs will cause excessive power consumption
Connect to VDD Bad, if the I2C bus is accidentally used then a short circuit will occur
Connect to ground OK, but may cause the I2C bus to hang if used, not much of an issue though
External pull-up resistors Best option, but requires additional components

MCP2221 HID LibraryUART Throughput
The main UART function seems to be really slow, maxing out at about 250,000 bps throughput when set to 1,000,000 baud due to a gap of about 30us after each byte transmitted. This isn’t much of a problem at lower bauds, but as the baud rate increases it creates a huge overhead (75% @ 1Mbaud!). Attempting to receive data without a sufficient gap will also corrupt the data. Here are some screen shots comparing the MCP2221 and CH340 UART converter ICs transmitting data at 1,000,000 baud. The MCP2221 has a gap of about 30us between each byte, while the CH340 has a gap of just 1us

For more detail: MCP2221 HID Library

 

 

Quick Solutions to Questions related to MCP2221 HID Library Project:

  • Why is this project created?
    To provide an open-source and multi-platform alternative to Microchip's proprietary DLLs.
  • Which features does the library currently support?
    It supports ADC, DAC, GPIO, interrupt input, clock reference output, and USB descriptors.
  • Does the library support I2C communication?
    I2C support is currently limited and marked as work in progress.
  • How should unconnected pins be handled on this chip?
    Pins should be set as output high or low since internal pull-up/down resistors are not supported.
  • What is the best way to handle floating I2C pins?
    The best option is to use external pull-up resistors to avoid short circuits or excessive power consumption.
  • What causes the difference in current consumption when USB is disconnected?
    Current ranges from 20uA to 70uA, but rises to about 5mA if remote wakeup is not disabled.
  • What is the maximum effective UART throughput of the device?
    The overall throughput is only about 250,000 bps even when the baud rate is set to 1,000,000.
  • Can the I2C pins be configured as general purpose outputs?
    No, the I2C pins cannot be set to outputs, though their raw values can be read.

About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter