The cable · rev B

A cable that plays by the ALDL rules.

The ALDL data line is a single wire that every module may only pull low. Most DIY cables push against it. This one doesn't – and it survives 12–24 V on the data pin.

The request on the wire · 8192 baudF4 57 01 00 B4

Each byte: one start bit (low), eight data bits with the least significant bit first, one stop bit (high) – 122 µs per bit. The whole request takes 6.1 ms; the engine computer answers with 67 bytes.

Ready-made cables are not sold at the moment. Build one from the parts list below – or use a standard FTDI cable with the quick fix at the end of this page.

schematic

The problem with most DIY cables

The GM 8192 baud ALDL line is a single open-collector wire: inside the ECM (and CCM, ABS …) a ~10 kΩ resistor pulls it to +5 V and each module pulls it low with a transistor to send a 0 bit. Idle = high. Everybody may only pull low; nobody may drive it high.

The popular "$20 cable" ties the FT232R's TXD and RXD together straight onto pin M. TXD is a push-pull output that drives the line high whenever it idles, so every 0 bit from the ECM becomes a fight between the ECM's transistor and the FTDI output. Depending on the parts the resulting "low" sits at 0.5–1.5 V – right at the receiver thresholds – and you get framing errors and garbage, worse when the CCM chatters. The same cable also stresses the ECM output.

Two more classic traps:

  • FT_Prog "Invert TXD/RXD" – correct only for RS-232 (DB9) adapters that have an inverting transceiver. On a TTL FT232R board it makes TX idle low (holding the whole car bus down – the CCM then logs code 41) and RX reads inverted data.
  • 3.3 V boards / VCCIO jumper on 3.3 V – the line is 5 V; use 5 V I/O.

Recommended design (rev B)

RefPartWhy
U1Genuine FTDI FT232RL breakout, VCCIO jumper = 5 V (or FTDI TTL-232R-5V)USB ⇄ TTL UART, 5 V logic, no driver sabotage
Q12N3904 NPN (SMD MMBT3904)inverter: TXD idle HIGH → Q1 on → Q2 off
Q22N3904 NPN, 40 V (SMD MMBT3904, PN2222A fits)open-collector line driver – only ever pulls the line LOW, like every GM module
Q3BSS138 N-MOSFET 50 V (SOT-23) or BS170 (TO-92)RX isolator: gate on +5 V, source → RXD, drain → DATA
R1150 Ω, 0.5 Wseries resistor of Q2
R210 kΩ RXD → +5 VRX idle level (bench, car off)
R310 kΩQ1 base
R4 + SW110 kΩ + switch between A and Bdiagnostic enable for 1982–88 (160 baud) ECMs only, OFF for 1989+
R510 kΩ TXD → +5 VTXD high while the FTDI boots or is unplugged → line released
R610 kΩ Q1 collector → +5 Vbase drive for Q2
R722 kΩQ2 base – deliberately high, limits short-circuit current
C1100 nF5 V decoupling
D1TVS SMAJ24A, unidirectional – band (cathode) on DATA, anode on GNDspikes only (ESD, ignition); does not conduct up to 24 V
JP13-way selectorM (1990–95), E (1982–88), E+M (1989)
J1GM 12-pin ALDL plug1995: 16-pin DLC, data pin 9, GND 4+5

How it works

  • TX – TXD idles HIGH, Q1 conducts, Q2 is off: the line is released. A 0 bit (TXD LOW) turns Q1 off, R6+R7 drive Q2's base and Q2 pulls DATA low through R1. Two inversions = the same logic as the FTDI TX, so no FT_Prog inversion is used. Low level ≈ 0.1 V + R1 × bus current (≈0.2–0.4 V with a 2–10 kΩ bus pull-up).

    Polarity (identical in rev A and rev B – both are non-inverting):

    UART stateTXDrev A: 74LVC1G07 outputrev B: Q1rev B: Q2DATA line
    idle / stop bit / 1 bitHIGHhigh-Z (released)onoffHIGH (bus pull-up)
    start bit / 0 bitLOWpulls lowoffonLOW

    A single transistor or open-drain stage on its own would invert (base HIGH → line LOW); the 74LVC1G07 contains buffer + open drain (non-inverting, the small diamond on its symbol marks the open-drain output, it is not an inversion bubble), and rev B uses Q1 to cancel Q2's inversion. An inverted stage would hold the bus LOW whenever the UART idles – see "Why polarity matters".

  • RX – Q3 is the classic MOSFET level shifter. When anything pulls DATA low, Q3's body diode and then its channel pull RXD low; when DATA is high (5 V or even 24 V), Q3 is off and R2 holds RXD at 5 V. RXD therefore only ever sees 0–5 V, and it sees the real line, so every byte we transmit comes back (echo) and VetteALDL checks it byte by byte.
  • Unpowered – with the USB unplugged Q1/Q2 have no base drive and Q3's gate is at 0 V, so the cable is truly invisible to the car (rev A still loaded the bus through R3 and the RXD input).
  • Bench loopback works without the car: Q2 pulls the open DATA wire low, Q3 passes it to RXD.

Why polarity matters

A UART idles HIGH (mark) and a byte starts with a LOW start bit; the ALDL line also idles HIGH and modules pull it LOW. So the line must follow TXD directly. If one stage inverted:

  • the bus would be held LOW all the time the app is not sending – the CCM loses the ECM (code 41), the dash loses ECM data and nobody can talk;
  • every byte would reach the car inverted (start bit HIGH = no start bit), so nothing is understood;
  • "fixing" it with FT_Prog "Invert TXD" is fragile: before the FTDI loads its EEPROM (plug-in, USB reset, unplugged laptop) the line would be pulled LOW again.

The connection debugger catches this on the bench (step 2: the line is stuck low / echo inverted) and from the EEPROM (step 1: "inverted lines").

What happens if 12 V (or more) reaches the data pin

The ECM itself never puts 12 V on the ALDL data line (see below), but a wrong pin, an off-by-one plug, the fuel-pump test pin G on 1984–89 cars, pin 16 (battery) on the 16-pin DLC or a harness fault can.

Voltage on DATARev BRev A (74LVC1G07 + clamp)
12–16 V, idlenothing conducts (Q2 40 V, Q3 50 V, D1 24 V stand-off); R2 keeps RXD at 5 Vthe clamp diode takes amps from a low-impedance source and burns; U2 (abs. max 6.5 V) gets ~55 mA through R1 and dies
12–16 V while transmittingQ2 current limited by its base drive to ~15–40 mA; RX sees the line stuck HIGH → echo error → the app stops sendingas above
24 V (jump start)nothing conducts (D1 stand-off 24 V)as above
spikes > 27 VD1 clamps (≤ 39 V at 10 A, below Q2's 40 V)clamp at ~6–7 V

Old "TX+RX tied" cables and the BAT85 quick fix below are not protected: 12 V would be forced into the FTDI TX pin. Use them only on the correct pin.

What the data line looks like inside the car's modules

The GM 8192 baud ALDL line (pin M, 1990–95; pin 9 on the 1995 16-pin DLC) is not the European ISO 9141 K-line/L-line (12 V, used e.g. by Opel/Vauxhall – the Tech 1 has a separate KW2000 cartridge for that). It is a single bidirectional wire:

  • each module (ECM, CCM, ABS, SIR, climate) has an open-collector (NPN) output that pulls the wire to ground to send a 0 bit and releases it for a 1 bit;
  • the wire is pulled up to the ECM's regulated 5 V through a resistor (order of 10 kΩ; the exact value for the 1227727 is not documented in our sources – measure it if you need it, see below);
  • every module also listens on the same wire (a comparator/transistor input), so each hears its own transmission – that is why the bus works as a "wired-AND" and why our cable must only pull low.

The 160 baud line (pin E, 1982–88) is also a 5 V open-collector output of the ECM, but it only transmits (pulses) when the 10 kΩ A–B resistor is present. Some other GM systems of that era used a 12 V serial line (the Tech 1 self-test even has "LOW SPEED 12 V SERIAL DATA"); rev B works with those too because Q2 and Q3 tolerate 40/50 V.

To estimate the pull-up of your car: ignition ON, engine off, measure DATA (M) to ground (A) with the cable unplugged – about 5 V (the CCM traffic makes it flicker). Then put a 10 kΩ resistor from M to A and measure again: R_pullup ≈ 10 kΩ × (5 V − V) / V. Keep it short – while loaded the CCM may lose the ECM and store code 41, which you can clear afterwards.

History: rev A

Rev A used a 74LVC1G07 open-drain buffer, 4.7 kΩ into RX, a 47 kΩ pull-up and a clamp diode on the line. Drawings before 2026-09-26 showed that diode reversed (anode on DATA = the bus held at ~0.6 V) and as a 5.0 V TVS; both are fixed, and rev B replaces the whole front end because rev A does not survive 12 V on the data pin.

Quick fix for an existing TX+RX-tied cable

Cut TX, insert a Schottky diode (BAT85/1N5817): band (cathode) toward TXD, anode toward the ALDL line; put 4.7 kΩ in series with RX; 5 V board; all FT_Prog inversions OFF.

Not protected against 12 V on the data pin (the diode would forward 12 V into the FTDI TX) – use it only on the correct pin and build rev B for anything permanent.

12-pin ALDL (car socket, seen from the cabin)

 F  E  D  C  B  A        A = ground          B = diagnostic enable (ECM)
 G  H  J  K  L  M        E = 160 baud data (1982–89)   M = 8192 data (1990–95)
                         G–A = dash diagnostics 1990–93 (NEVER on 1984–89: G = fuel pump)

Test procedure

  1. Bench: VetteALDL → Connection debugger step 1 (PC & driver) and 2 (loopback) – must be 100 % clean.
  2. Car, ignition OFF: step 3 – the data wire must not be on a ground pin.
  3. Ignition ON: step 4 – CCM traffic visible, ECM answers.
  4. Anything red → Sessions & support → Create support bundle.