Tri-state, sběrnice a spor
Open-drain řeší sdílený drát tím, že nikdo neumí táhnout nahoru. Druhé řešení je opačné: budiče umí obojí, ale umí se odpojit. Tomu třetímu stavu se říká vysoká impedance, značí se Z a není to napětí — je to nepřítomnost budiče.
Tři stavy, z toho dva jsou napětí
| stav | co drží drát | kdy je správný |
|---|---|---|
| 1 | horní tranzistor k VDD | když mluvím a posílám jedničku |
| 0 | dolní tranzistor k zemi | když mluvím a posílám nulu |
| Z | nikdo | vždycky jindy |
Co se stane, když se dva potkají
Jeden drží jedničku, druhý nulu. Mezi napájením a zemí je pak cesta přes dva sepnuté tranzistory a nic jiného v ní není:
Padesát pět miliampér nezničí nic okamžitě, a v tom je ta past — spor se obvykle neprojeví jako porucha, ale jako teplo, propad napájení a občasná chyba jinde na desce. Napětí na drátě přitom sedí někde uprostřed, často přímo v zakázaném pásmu, takže všechny ostatní vstupy na téhle sběrnici v tu chvíli čtou náhodná čísla — i ty, které se sporu neúčastní.
Kde spor vzniká i u správně napsaného kódu: při přepínání směru. Jeden budič se odpojuje, druhý se zapíná, a když se ta dvě zpoždění překryjí, vznikne spor na desítky nanosekund při každé výměně. Řešení je mrtvý čas — táž myšlenka jako u H-můstku v BridgeLabu, jen o tři řády rychleji.
A plovoucí sběrnice je vlastní problém
Když se odpojí všichni, drát nedrží nikdo. Není to nula ani jednička — je to kus mědi s kapacitou, který si drží poslední náboj a pomalu ho ztrácí, a mezitím sbírá všechno, co kolem prolétne. U CMOS vstupů to znamená příčný proud a topení (kapitola 1). Proto má každá sběrnice slabý pull-up nebo pull-down — ne kvůli logice, ale aby drát nikdy nezůstal bezprizorní.