Computing stuff tied to the physical world

Modifying the USB BUB

The upload puzzle is solved if we can find a device which connects to USB, has power and ground, has a serial link (i.e. send and receive lines), and has two output pins which can be controlled from the USB side.

We’re almost there with what has got to be one of the most common interfaces in embed-land by now: the “FTDI interface”. It meets all of the above requirements, except that it only has one output pin, tied to DTR on the USB side.

There are tons of these on the market, some of questionable origin perhaps, but all extremely widely used and highly popular (as FTDI Ltd found out).

The solution is to make one or two changes, depending on which type of FTDI board you’re using. This requires some soldering skill, and you have to do things calmly and carefully…

Note that this applies to any FTDI board with the following properties and jumper settings:

  • supply voltage on the ┬ÁC side is 5V, not 3.3V
  • logic signal level is 3.3V, not 5V
  • has a 6-pin “FTDI header”
  • based on the FT323RL chip, as most boards are

The first two requirements are not essential, in that other combinations can be made to work with ARM chips, but it’s harder to get this right and you may get burned one day when you mix & match, and hook things up to another FTDI board with different settings.

The “5V power with 3.3V logic” setting is the default for all the boards from JeeLabs, and probably also most of the other Arduino-compatible boards out there.

Let’s get started. The worst that can happen is a “bricked” FTDI board – take your time!

Modification 1 – connecting RTS

There is usually a pin on the FTDI header side of the board which is marked CTS (Clear To Send). This pins is not used with Arduino’s. It’s of very little use, being an input pin.

The modification needed is to connect it to the RTS (Request To Send) pin of the FTDI chip, which is an output. There’s no need to disconnect the CTS input, since no one uses it.

The bad news is that on many FTDI boards, the RTS pin on the chip is not connected to anything. That means you have to have steady hand, a fine-tipped soldering iron, and soldering wick to correct any problems – always a good idea for your toolset, by the way!

Here is the wire you’ll need to add in this case, very carefully:

DSC 4764  Version 2

The RTS signal is on pin 3 of this 28-TSSOP package – those pins are only 0.5 mm apart!

The good news is that the “USB BUB II” available from Modern Device and resold in the JeeLabs shop has RTS exposed via an internal pad. This makes modification a lot easier.

Connect a wire between the CTS header pin and RTS, as shown below:

DSC 4814

Make sure that the wire doesn’t touch anything but the RTS pad and the CTS header pin.

Modification 2 – disable the reset cap

This modification only applies to the BUB II, which inserts a capacitor between the chip’s DTR output signal and the FTDI header. This is harmless for JeeNodes, but will interfere with proper reset operation on ARM chips.

Locate the tiny “C4” SMD capacitor on the board and either replace it with a short wire, or simply solder a wire on top to short out the capacitor, as shown in the image above.

That’s it. This modified BUB will continue to work as before with JeeNodes, but it now has that extra RTS output pin available to also properly perform uploads on ARM chips.

If you absolutely totally can’t wait to upload that blink demo to your own LPC810 chip…

On MacOSX, using Homebrew:

  • install the open source lpc21isp utility: brew install lpc21isp
  • type: lpc21isp -control -bin firmware.bin /dev/tty.usb* 115200 0

On Linux (Ubuntu), using apt-get:

  • install the open source lpc21isp utility: apt-get install lpc21isp
  • type: lpc21isp -control -bin firmware.bin /dev/ttyUSB* 115200 0

Otherwise, just hang in there and it’ll all be described in a lot more detail Real Soon Now.

[Back to article index]