Following my adventures (part 1, part 2) with the RP2350-USB-A, I took another look at the alternatives.
Specifically, I am looking for a cheap dev board with two full USB ports (1 device, 1 host), that could be easily programmable, and would be production-ready for hobbyist projects (if you’re a professional, you’ll just manufacture your own board).
First, I want to clarify that strikes out the boards that expose UART-over-USB as one of the two USB ports, such as the Arduino Due, or the ESP32-S3-DevKitC. In these cases, the MCU (MicroController Unit) only supports USB, but also has UART for debugging; since UART-to-USB chips are cheap, the board exposes it with as a USB port as well, but it can only be used for this specific purpose.

Next, I do mean cheap. For instance, at 480$ a piece, the ST STM32H743I-EVAL is quite pricey for hobbyist development, let alone production. At 49€ emPower-USB-Host+ could be a neat toy, but a bit expensive for production. And both ports are host anyway, so it would require some soldering.
We are getting close with the nanoCH*, such as the nanoCH32V203 and nanoCH32V305, by Chinese radio amateur BG5DIW, which you can source at about 3€ each. The nanoCH32V305 has two device-only ports, but the nanoCH32V203’s USB2 port seems to be usable as host. Also, both are native, unlike the RP2040/RP2350’s PIO which is more of a hack. The main drawback is that it is using a pretty unusual MCU, so support is going to be limited. However, is probably the next best candidate if the final contenders do not pan out.

This leaves us with:
- RP2350-USB-A, which I discussed previously
- RP2040-PiZero, by WaveShare, like the RP2350-USB-A
- Feather RP2040 with USB Type A Host, by Adafruit
- USB Interposer, with very little available information
All are priced in the 10€ to 20€ range.
The trigger for this article was that the RP2350-USB-A does not have the right resistors on its USB-A port to make it usable as a host port without modification. So, let’s check the schematics!
First, the RP2040-PiZero is even more baffling than the RP2350-USB-A. The USB D+ and D- are effectively pulled up to 3.3V by 2.2kΩ resistors. 2.2kΩ pull-up resistors seem to be typical for I²C but, if I understand this properly, it means that the PIO.USB is (mostly) unusable. Unsurprisingly, people are having issues with it, but it might work sometimes.

Second, the Feather RP2040 directly connects the D+ and D- lines to the RP2040 MCU:

I am going to assume this means you are supposed to use the internal pull-down resistors that are provided by the RP2040 MCU itself. It has the advantage that you can then programmatically pull up or down the D+ and D- lines as needed. However, their resistance is between 50kΩ and 80kΩ; even in the best case, that would be way out of spec and is going to cause issues.

In fact, I did try to use the internal pull-down resistors with my RP2350-USB-A when it could not detect devices being unplugged, but it just did not work.
This leaves only the USB interposer, which I hope is properly designed. This is not unlikely, as its purpose is very clearly to offer a USB host and a USB device ports. Unfortunately, there is very little documentation, and it looks more bare-bones, so I will have to wait for it to be delivered, and then to tinker for a while before I learn anything about it.
Maybe I am missing something, but it is a shame that the possibility of doing basic USB with the RP2040/RP2350’s PIO is not better exploited by dev boards. But, eh, maybe it’s a hint that I should take a stab at the nanoCH32V203 instead!

Leave a Reply