Для чего нужны подтягивающие резисторы на линии данных и тактирования в I2C
Что проверяют
Вопрос задают тестировщику встраиваемых систем и железа: понимаете ли вы электрику шины, а не только протокол. Следом просят объяснить, как по осциллограмме понять, что резистор подобран неправильно, и что будет, если на шине несколько модулей со своими подтяжками.
Как отвечать
Суть в схеме выходов. Линии SDA и SCL у всех устройств на шине с открытым стоком: устройство умеет только прижать линию к земле, а поднять её до питания не может. Высокий уровень даёт подтягивающий резистор к VDD.
Отсюда следствия:
- без подтяжки: линия висит в воздухе, высокий уровень не формируется, шина не работает вообще;
- монтажное И: если хоть одно устройство тянет линию вниз, на ней ноль. На этом построены арбитраж нескольких ведущих и растягивание такта (clock stretching), когда ведомый держит SCL, пока не готов;
- ограничение сверху: фронт нарастания задаёт RC-цепочка из резистора и ёмкости шины. Спецификация ограничивает время нарастания: 1000 нс в стандартном режиме 100 кГц и 300 нс в быстром 400 кГц. Слишком большое сопротивление даёт заваленные фронты и ошибки на высокой частоте;
- ограничение снизу: при малом сопротивлении устройству приходится пропускать слишком большой ток. Стандарт рассчитан примерно на 3 мА при низком уровне не выше 0,4 В, для питания 3,3 В это минимум около 1 кОм.
На практике часто берут 4,7 кОм для 100 кГц и 2,2 кОм для 400 кГц, а точное значение считают от ёмкости конкретной платы.
Где спотыкаются
Говорят, что резисторы нужны «от дребезга» или «от помех». Дребезг это про механические кнопки, а подтяжка на I2C нужна, чтобы высокий уровень вообще появился.
Не учитывают параллельные подтяжки. Готовые модули часто несут свои резисторы, и шесть модулей по 4,7 кОм на одной шине дают около 780 Ом. Это уже ниже допустимого минимума для 3,3 В, и ведомые перестают надёжно прижимать линию к нулю.
Проверяют только логическим анализатором. Он покажет NACK и сорванную транзакцию, но причину видно лишь на осциллографе: если фронты скруглены и похожи на акулий плавник, сопротивление или ёмкость слишком велики.