WCH CH9325
WCH, also known as Nanjing Qin Heng Electronics, makes a series of microcontrollers, PCI interface chips, and USB interface chips.
The CH9325 is a USB interface chip, which converts data received via UART to USB and vice versa. The chip presents a HID (Human Interface Device) USB profile, in an effort to not require USB driver installation: this is typically handled by the OS kernel. An example of the profile, in Linux 'lsusb' output format, is here.
Supported baudrates on for the UART interface are 2400, 4800, 9600 and 19200.
The chip runs off of a 12MHz oscillator.
Pin layout
1- | O | -16 | ||
UART TX | 2- | -15 | USB +5V | |
UART RX | 3- | -14 | ||
4- | -13 | |||
5- | -12 | |||
USB D+ | 6- | -11 | ||
USB D- | 7- | -10 | OSC+ | |
GND | 8- | -9 | OSC- |
Protocol
Chip configuration
USB packets sent to endpoint 0 are intercepted by the chip, and serve to configure it. A confguration packet consists of 5 bytes:
Byte | Description |
---|---|
1-2 | UART baudrate, in little-endian order. For example, 60 09 = 0x0960 = 2400. Supported baudrates are 2400, 4800, 9600 and 19200; setting any other rate defaults to 2400 instead.
|
3 | |
4 | |
5 |
USB encapsulation
The chip stores bytes received via the UART RX pin into a buffer. It transfers the contents of the buffer to a HID packet at regular intervals (maximum 12ms). The HID packets are always 8 bytes long, with the first byte containing the number of payload bytes. This is encoded as 0xf0 + length. The next 7 bytes contain the payload, padded with zeroes. Thus, even if no data is ever received on the UART, the chip always sends at least one packet every 12ms containing:
f0 00 00 00 00 00 00 00
Here's a packet with 2 bytes payload:
f2 35 41 00 00 00 00 00
Extracting the UART stream on the other side of the USB bus simply entails the reverse process: for every received packet, extract the payload according to the length byte (nibble).