Electronic – Arduino <-> BBB UART issues using bi-directional level converter (5v to 3.3v)

beaglebone blacklevel-shiftinglogic-leveluart

I am having a strange issue interfacing between an Arduino and BeagleBoneBlack over UART.

The Arduino is 5v logic, and the BBB is 3.3v logic, so I'm using a bi-directional logic level converter from sparkfun.

The level converter works fine with my 3.3v USB/FTDI reading with my laptop When I connect GND,3.3v,RX,TX, but when I use the BBB, I don't get anything unless I disconnect the 3.3v line. Interestingly – on my computer using the FTDI cable, I get garbage UNLESS the 3.3v is connected.

On the BBB, with the 3.3v ref voltage disconnected the level-converter seems to convert from 5v – 2.5v (instead of the intended 5v-3.3v), and I'm weary of this floating voltage.

I made a voltage divider with resistors, and with the reference low-volt of 1.6v, communication still works, but again – not with the reference low-volt of 3.3v.

I'd love suggestions as to why this may be the case!

Edit:

To clarify with sweet ASCII art:

This Works (as it should):

___________             _________________               ________         ____________
|         | <-RX (5v)-> | HV1 (LLC) LV1 | <-TX (3.3v)-> |      | <-USB-> | Computer |
| Arduino | <-TX (5v)-> | HV2 (LLC) LV2 | <-RX (3.3v)-> | FTDI | <-USB-> | Computer |
|   (5v)  | <-HV (5v)-> | HV  (LLC) LV  | <-LV (3.3v)-> |(3.3v)| <-USB-> | Computer |
|         | <-- GND --> | GND (LLC) GND | <--- GND ---> |      | <-USB-> | Computer |
-----------             -----------------               --------         ------------

This doesn't work (and it shouldn't, as there's no ref LV):

___________             _________________               ________         ____________
|         | <-RX (5v)-> | HV1 (LLC) LV1 | <-TX (3.3v)-> |      | <-USB-> | Computer |
| Arduino | <-TX (5v)-> | HV2 (LLC) LV2 | <-RX (3.3v)-> | FTDI | <-USB-> | Computer |
|   (5v)  | <-HV (5v)-> | HV  (LLC) LV  |               |(3.3v)| <-USB-> | Computer |
|         | <-- GND --> | GND (LLC) GND | <--- GND ---> |      | <-USB-> | Computer |
-----------             -----------------               --------         ------------

This works (but it shouldn't):

___________             _________________               _______
|         | <-RX (5v)-> | HV1 (LLC) LV1 | <-TX (3.3v)-> | BBB | (Actually reading about 2.5v)
| Arduino | <-TX (5v)-> | HV2 (LLC) LV2 | <-RX (3.3v)-> | BBB | (on these two lines)
|   (5v)  | <-HV (5v)-> | HV  (LLC) LV  |               | BBB |
|         | <-- GND --> | GND (LLC) GND | <--- GND ---> | BBB |
-----------             -----------------               -------

This works (also shouldn't):

___________             _________________               _______
|         | <-RX (5v)-> | HV1 (LLC) LV1 | <-TX (1.6v)-> | BBB |
| Arduino | <-TX (5v)-> | HV2 (LLC) LV2 | <-RX (1.6v)-> | BBB |
|   (5v)  | <-HV (5v)-> | HV  (LLC) LV  | <-LV (1.6v)-> | BBB | (Using a voltage divider)
|         | <-- GND --> | GND (LLC) GND | <--- GND ---> | BBB |
-----------             -----------------               -------

This doesn't work (but should):

___________             _________________               _______
|         | <-RX (5v)-> | HV1 (LLC) LV1 | <-TX (3.3v)-> | BBB |
| Arduino | <-TX (5v)-> | HV2 (LLC) LV2 | <-RX (3.3v)-> | BBB |
|   (5v)  | <-HV (5v)-> | HV  (LLC) LV  | <-LV (3.3v)-> | BBB |
|         | <-- GND --> | GND (LLC) GND | <--- GND ---> | BBB |
-----------             -----------------               -------

Best Answer

Strangely it seems as though the Arduino is outputting voltage over both RX and TX, while the BBB is only outputting voltage on the TX line.

My guess is that the bi-directional LLC isn't able detect which direction communication is supposed to happen, and so the BBB isn't able to transmit to the Arduino.

This Sparkfun LLC is the same as the one I'm using on the BBB -> Arduino channel, but the Arduino -> BBB side just uses a voltage divider. I rigged up this setup, and it seems to be working now.