Problem Statement

A USB-C PD compatible charger is used to power two devices, where one device is USB-C PD compatible, and the other is non-USB-C PD compatible. Moreover, the CC lines of USB-C PD compatible device port are connected directly with USB-C PD compatible charger port CC pins while the data lines of USB-C PD compatible device port are connected to the data lines of non-USB-C PD compatible device port for communication. Consequently, this configuration yields no communication among the devices being charged as both devices operate as UFP (Device mode) when being powered from USB-C PD charger. Whereas, for successful communication it is required that one device should act as DFP (Host) and the other as UFP (Device).

Work Flow of a USB-C Power Delivery Charger - oxeltech


  1. Initially, our understanding was that the USB-C PD compatible charger does not always provide maximum current if the USB-C PD compatible device attached with it over CC lines is consuming less current (e.g., when it is close to being fully charged). In that case, other load circuitry including non-USB-C PD compatible devices (in our case specifically Raspberry Pi and a load circuit) fed from the same VBUS of USB-C charger would not get enough power to stay alive. Therefore, we used a USB-C HUB controller and two USB-C PD controllers interfaced through SPI with the USB-C HUB controller. Moreover, the CC lines of one PD controller were attached with USB-C charger port CC pins and the CC lines of the other PD controller were attached with USB-C PD compatible device port CC pins. The USB-C HUB controller is supposed to perform Data Role swap function and collect power requirements of all the sink devices connected to it and provide that information to the charger USB-C PD controller to ensure that the USB-C charger keeps providing the required current. This design could work but has more components resulting in increased complexity.
  2. Later, it was found that USB-C PD compatible charger always provides maximum negotiated current irrespective of the actual current consumption. Therefore, a simpler solution is made by removing USB-C HUB controller which was mainly used to collect power requirements from all the sink devices to configure the USB-C PD controller attached with USB-C charger to negotiate the required power. Thus, in this new design we only used two different USB-C PD controllers, one that includes PD controller + MCU and the other is simple USB-C PD controller to initially configure the USB-C PD compatible device (in our case Tablet) to operate as DFP (Host) while sinking power from USB-C charger. Whereas a buck converter is used to convert the USB-C charger power to 5V for non-USB-C PD compatible device (in our case Raspberry Pi Pico) that operate as UFP (Device) and for other load devices. More details about this design are provided in design approach section below.

USB-C PD Controllers

There are different USB Type-C PD data-role swap controllers available from different manufacturers. But for this application, the following controllers from Microchip were used.

1. UPD301C

Microchip UPD301C - A Standalone USB-C PD Controller - oxeltech

UPD301C is standalone USB Type-C PD controller for dual role Power/Data applications. The architecture of UPD301C includes UPD350 and MCU integrated in it with support for three external PD controllers

2. UPD350

Microchip UPD350 - A USB-C PD Controller for MCUs - oxeltech

UPD350 is designed to function as a companion USB Type-C PD controller to an external MCU using the integrated I2C/SPI interface.

Design Approach

The Channel Configuration (CC) lines of USB Type-C charger port are connected to UPD310C PD controller CC lines for power negotiation on VBUS. The VBUS line from USB Type-C charger port is feed to USB-C PD compatible device and Buck converter.

The CC lines of USB-C PD compatible device port are connected to CC lines of UPD350 for power negotiation. The Data lines D+/D- of USB-C PD compatible device are connected to non-PD compatible USB Device (Raspberry Pi Pico) for communication.

The UPD301C PD controller and UPD350 PD controller are connected through SPI interface, where the microcontroller in UPD301C act as SPI Master while UPD350 controllers as SPI Slave. In addition, the microcontroller is programmed to configure the UPD350 over SPI interface to initiate Data Role swap over CC lines for the USB-C PD compatible device to act as DFP (Host). As soon as the USB-C device becomes Host, the communication starts between the USB-C PD compatible device and non-USB-C PD compatible device.

For any USB-C related issue, or any Hardware Design related challenge in general, feel free to Contact Us for our consultancy. You can check out our other Technical Blogs on various topics or visit our new website Oxeltech.de to find all about our services and products.

Was this article of help to you?
Subscribe to our newsletter. We write about developing embedded and electronic systems.

Leave a Reply

Your email address will not be published. Required fields are marked *

Recent Posts
error: Content is protected !!

Subscribe Our Newsletter