Перейти к содержанию

Конфликт на шине

Когда два выхода соединены одной линией и один тянет её вверх, а другой вниз, между ними течёт ток короткого замыкания. Это и есть конфликт на шине. Он портит данные, а при сильных выходах может повредить микросхемы.

Обновлено Редакция GAW

Конфликт на шине (bus contention) — ситуация, когда два выхода, подключённые к одной линии, одновременно активны и пытаются установить на ней разные уровни. Один двухтактный выход открыл верхний транзистор, другой — нижний, и между питанием и землёй образуется цепь через два открытых канала. Ток ограничен только их сопротивлением.

TI в даташитах логики 74HC — например, 74HC138 и 74HC595 — предупреждает отдельной строкой: выходы КМОП с симметричным сильным каскадом при конфликте на шине могут дать токи выше предельно допустимых. Последствия разные:

  • уровень на линии оказывается где-то посередине, и приёмники читают его случайно;
  • выходы греются, растёт потребление, на питании появляются броски;
  • при длительном конфликте сильных выходов микросхема может выйти из строя.

Откуда берётся конфликт:

  • два ведомых SPI выбраны одновременно, и оба выдают данные на MISO;
  • линия, которую микроконтроллер настроил как выход, подключена к выходу другой микросхемы;
  • при смене направления двунаправленной шины одно устройство ещё не отключилось, а другое уже включилось.

Как от него защищаются:

СпособКак работает
Третье состояниенеактивные выходы отключаются; линией в каждый момент управляет один
Открытый стоквыходы только тянут вниз, вверх — резистор; одновременная работа безопасна, на этом построен арбитраж I²C
Аппаратная защитаATmega128: если в режиме ведущего SPI вход SS опустили извне, SPI во избежание конфликта сам становится ведомым — MOSI и SCK превращаются во входы
Резисторы в линияхпоследовательные резисторы ограничивают ток, если конфликт всё же возник

Последовательный резистор на сотни ом между выводом микроконтроллера и общей линией почти не мешает медленному сигналу, но при ошибке в программе ограничит ток конфликта: при 5 В и 330 Ом — около 15 мА.

Частые вопросы

Что такое конфликт на шине?

Ситуация, когда два или больше выходов одновременно управляют одной линией и пытаются установить разные уровни. Между ними течёт ток, ограниченный только сопротивлением выходных транзисторов. TI в даташитах логики 74HC предупреждает, что из-за сильных симметричных выходов такой конфликт может дать токи выше предельных.

Как избежать конфликта на шине?

Следить, чтобы в каждый момент линией управлял один выход: остальные переводят в третье состояние, как невыбранные ведомые SPI, или используют выходы с открытым стоком и подтяжкой, как на I²C, — там одновременная работа нескольких выходов безопасна. В отладке помогают последовательные резисторы на десятки–сотни ом, ограничивающие ток.

Почему I²C не боится конфликта, а SPI боится?

На I²C выходы с открытым стоком: они только тянут линию вниз, а вверх её поднимает резистор. Если один выход отпустил линию, а другой держит в нуле, тока короткого замыкания нет — на этом построен арбитраж. На SPI выходы двухтактные, и два активных выхода на MISO замкнут питание на землю через транзисторы.

Источники

  1. Texas Instruments. SNx4HC138 3-Line To 8-Line Decoders/Demultiplexers (SCLS107G, revised October 2021) — разд. 9.2.1 — КМОП-технология с симметричным выходным каскадом: избегать конфликта на шине, так как он может дать токи выше предельных; выходы нельзя подтягивать выше VCC и ниже GND
  2. Texas Instruments. SN54HC595, SN74HC595 8-Bit Shift Registers With 3-State Output Registers (SCLS041J, revised October 2021) — разд. 9.2.1 — то же предупреждение: симметричный выход, конфликт на шине может дать токи выше предельных; сильный выход создаёт быстрые фронты на лёгкой нагрузке
  3. Atmel. ATmega128/ATmega128L Datasheet (2467X–AVR–06/11) — разд. SPI, вывод SS в режиме ведущего — если SS настроен как вход и его опустила внешняя схема, SPI считает, что его выбрал другой ведущий, и во избежание конфликта на шине сбрасывает бит MSTR и становится ведомым: MOSI и SCK становятся входами, ставится флаг SPIF

Нашли ошибку?