Electronic – Bus Contention – Output Pin driving another Output Pin

programmable-logicshort-circuit

I've run into an unusual problem. I'll start off by describing my goal: I'm designing a circuit that can test for short circuits and open circuits in a wiring harness. The wiring harness does not have a CAN bus or anything complicated like that – just simple wires.

Here's how it works

I have two CPLDs, one as a designated driving end (all pins are output) and another as an receiving end (all pins are input). The driving end CPLD is programmed to be a Serial In Parallel Out shift register and the receiving end is a Parallel In Serial Out shift register.

Let's assume all the wires in the harness are one-to-one i.e. no junctions. Let's also assume that there are only 8 wires. So, to test the first wire in the harness, the driving end register is loaded with 10000000. The receiving end also sees this and it all ends well. The driving end is then clocked and it reads 01000000. If the receiver also reads this, then that wire is OK.

But suppose there is a short circuit between wire 2 and 3. If that's the case, then the receiving end will read 01100000. This, too, is OK as we have detected the short and can take action.

But what happens at the driving end? The CPLD's pin 3 will be forcing 0V and pin 2 will be forcing 3.3V. The short circuit between pin 2 and 3 will result in two output pins connected together. I'm assume that a significant current will flow from pin 2 to pin 3 and damage could result.

Note that the shift registers/CPLDs are being driven by a microcontroller. Also note that the harness is usually quite large, around 200-300 wires. Some of which are one-to-many connections. This is why a CPLD was an attractive option as it allows me to program a large shift register and allows testing of a large harness with a relatively small circuit.

How can I handle such a problem?

Best Answer

I would personally use tri-state outputs in this situation.

Instead of driving a 0 or a 1, you could have pull-down (or pull up depending on your preference) resistors on the outputs, and drive the pin you're interested in high or low - the opposite of your chosen pull-up/-down resistor. The other outputs should be set to high impedance so they don't interfere with the expected results.

The pull-up/-down resistors would probably be best situated at the receiving end of the wiring harness so that it 'defaults' the inputs to a known state and stops them floating, rather than defaulting the signal through the harness.

Makes it a little more complex than a simple shift register...

Also, maybe Open Collector (or Open Drain for you CMOS junkies) would do the trick in a similar way...