When people ask about my day job, I tell them it is “designing/reviewing embedded security and cryptography”. I haven’t written much on this blog about my embedded work, mostly due to NDAs. However, I recently have been working on some hobby projects in my spare time that are a good topic for some articles.
When interfacing with an external board over USB, it’s often easiest to use a USB-serial cable like the FTDI 232R. This cable provides a virtual serial port interface to the PC host and the normal serial signals at the target. You can then interact with your target using an ordinary terminal program. One key difference is that the signals are LVTTL (0 – 3.3V) or TTL (0 – 5V), while ordinary serial is -10V to +10V. So you can’t just use an ordinary USB-serial adapter, the kind used to connect an old PDA to your computer.
On a recent project, I needed to debug some code running in a microcontroller. Since most microcontrollers these days have a built-in UART, debug prints can be added by configuring the clock divider for the given baud rate and monitoring a single pin (the RX pin). With AVR libc, it’s as simple as providing a “send byte” routine to a local copy of stdout, then calling printf() as usual. As I dug through my parts bin, I realized I didn’t have one of these FTDI cables and it was too late to buy anything.
My first thought was to use one of my scope probes to capture the serial I/O and decode it in software. You can dump an oscilloscope’s trace buffer to a file, then walk through the samples for your given channel and recover the original data. I decided this would take too long though, so I got a second opinion from bunnie. I was hoping to scavenge one of the many ordinary USB-serial adapters I had lying around. He told me that most of them are built with a separate level converter IC, so it was likely I could mod one to get what I wanted.
That was the motivation I needed to tear into an adapter. It was covered with injection-molded plastic, so I had to use a knife to slice the edges and peel it back. Inside, I found it had a FTDI 232BL, Sipe SP213ECA, and Atmel 93C46. I think the Atmel is a serial EEPROM (8-pin, SOIC). If you search for the “Sipe” part, you will see a bunch of Chinese “part number squatters”. That’s usually the tell-tale sign that a part isn’t sold via retail and is only used by OEMs as a clone. I think the copied manufacturer is “Sipex”, so I used that datasheet. The FTDI chip is quite common and does all the logic for the USB and serial protocols.
The Sipex chip is a level converter, similar to the MAX232. It uses a series of capacitors in a configuration called a “charge pump” to step the voltage up or down to +/-10V, while requiring only a 3.3V source of power.
My plan was to bypass the level shifter and connect my TX, RX, and GND pins directly from my microcontroller to the FTDI chip since both run at 3.3V. However, I needed to disconnect the RX stage of the level shifter from the FTDI, otherwise there could be contention if my microcontroller was driving logic low and the FTDI was driving high. I looked at the Sipe datasheet and did some investigation with my multimeter. It turns out that the RX signal comes in from the serial port on pin 23 and goes out at the reduced TTL level on pin 22.
I could have cut pin 22 with a knife but that is hard to reverse if I wanted to put it back. Instead, I used my soldering iron to release the pin and gently pry up on it. This is called lifting a pin and is often done by techs doing rework. I find it works best to nudge the pin sidewise with tweezers while heating it, then lift it. You can lift a pin just a little if you only want to disconnect it, or you can lift it and bend it back over the package like I did if you plan to solder wire onto the pin and the pad. I left it this way in case I wanted to add a switch in the future, allowing the same device to be used as a TTL or ordinary serial port. (The ugly junk around the pins and under the chip is leftover plastic from the cover, a side-effect of the injection molding process.)
Next, I soldered ground, RX, and TX wires from the FTDI chip to a pin header. I find it works best to put a little extra solder on the pins/pads and then apply heat above the wire until it melts into the solder on top of the pin. Below is a picture of the header and the three wires. The header isn’t connected to the serial port below, it’s actually floating above it.
Finally, I used a glob of hot glue to stabilize and insulate the header from the other connections on the chip as below.
I tested for shorts between pins and between Vcc and ground (very important). It seemed fine so I plugged it in. I needed a cable to match the pinouts of my microcontroller and the USB-serial adapter, so I took an old ribbon cable and swapped some of the wires around to match. I find ribbon cables are really useful for building custom cables quickly since the tabs on the connectors come apart easily with a screwdriver and it presses back together once you’re done. Below is the final result, about 45 minutes of work.
By the way, if you need an overview of the basics, here is an excellent intro to surface-mount soldering. I especially agree with its complaint against the “flood and wick” style of SMT soldering. I hope this article encourages you to find creative solutions to your interfacing problems.
4 thoughts on “DIY USB to TTL serial adapter”
Nice to see others have similar thinking!
In my case, I removed the Sipex chip and bridged the pins to get TTL at the DB9 connector.
hi there great job, just want to ask after doing this, what software might be useful on working on this programmer many thanks, SORRY for the question
nath, I don’t discuss a programmer in this article. You must be referring to the previous comment. You should click on his blog and leave your question there instead.
There is also a way to hack pl2303 adaptors to have 3.3v and 5v with a switch:
Comments are closed.