Почему в I2C не используют push-pull вместо open-drain с подтягивающими резисторами
Что проверяют
Читаете ли вы схему, а не только протокол. Для тестировщика встроенных систем это проверка на умение объяснить, почему шина внезапно замолкает, и понимание, что именно надо померить, прежде чем заводить баг.
Как отвечать
Open-drain выбран не ради экономии, а потому что на линиях SDA и SCL физически нужна проводная логика «И»: линия низкая, если её тянет хотя бы одно устройство, и высокая, только когда не тянет никто. Из этого растут три вещи, без которых I2C не работает:
- подтверждение: бит
ACKвыдаёт ведомый, дёргая ту же линию данных, которой только что управлял ведущий; - растягивание такта: ведомый удерживает
SCLв нуле, пока не готов, и ведущий обязан это увидеть и подождать; - арбитраж: два ведущих могут начать передачу одновременно, и тот, кто выставил единицу, а увидел на линии ноль, молча уходит с шины.
С push-pull всё это превращается в короткое замыкание: один выход тянет линию к питанию, другой к земле. Плату за open-drain стоит назвать самому: фронт вверх формирует RC-цепочка из подтяжки и ёмкости шины, поэтому номинал резистора выбирают компромиссом между временем нарастания и током, который выходной транзистор должен принять в нуле. Ток в нуле течёт постоянно, так что по потреблению open-drain как раз проигрывает.
Где спотыкаются
Повторяют, что open-drain экономит энергию. Наоборот: пока линия в нуле, через подтяжку непрерывно течёт ток, а push-pull тратит в основном на переключениях. Аргумент за open-drain это проводная логика и целые выходы, а не потребление.
Второе: пишут в баге «шина зависла» и прикладывают только лог. Застрявшая в нуле линия данных это отдельный диагноз, у него есть штатное лечение девятью импульсами такта, но чтобы его назначить, нужны осциллограммы обеих линий, скорость обмена и номинал подтяжки.
Третье: проверяют на отладочной плате и закрывают тест. Ёмкость шины растёт от длины проводов и числа устройств, поэтому подтяжка, которая держит фронт на коротком стенде, не держит его на изделии со шлейфом. Проверять надо на целевой сборке и на верхней границе заявленной скорости.