Logic low not low enough

logic-levelserialuart

I'm having an issue where the "low" level being output from one device isn't low enough for the device on the other end to interpret it as such. I'm guessing I'm not the first person to have this problem, but I haven't been able to find a solution.

Here are the details:

I'm trying to interface between the ALDL connector in my car and a Teensy++ 2.0. ALDL uses a UART-like protocol at 8192 baud, except transmit and receive are on the same wire. The circuit I'm using (from here) is below:

ALDL schematic

When the "Receive Control Pin" (a regular, software-controlled, digital IO pin on the Teensy) is low, the ALDL data line should be able to drive the Teensy's receive line. When it is high, the Teensy's transmit line should be able to drive the ALDL data line while the Teensy receive line is held high.

So far, it hasn't been working. I think the problem is that unless the ALDL data line is brought very close to ground when low, the Teensy's receive line doesn't read it as such. To test this, I disconnected the ALDL line and manually jumpered it to ground. The Teensy's receive line dropped to 0.93V, and it read a byte. Then, I jumpered the ALDL line to 0.45V (from a voltage divider). That time, the Teensy's receive line only went to 1.65V, and it didn't read anything.

The little documentation I found said the ALDL line can output as high as 0.8V when low. Is there any way to modify this circuit or build a different one to avoid this problem?

Edit:

The ALDL signals are at a 5V level. Specifically:

Transmit
Low level output voltage: 0.8V max
High level output voltage: 4.0V min

Receive
Low level input voltage: 2.0V max
High level input voltage: 2.8V min

Best Answer

This will reduce the input voltage to your board by about 0.5V.

schematic

simulate this circuit – Schematic created using CircuitLab