Подтяжки на I2C: сколько и зачем
Старый мем — «поставь 4.7 кОм на SDA и SCL, не парься». Иногда работает. Иногда нет. Разберёмся почему.
Откуда вообще цифра 4.7к
Из старого Philips application note 1980-х годов. Тогда I2C работала на 100 кГц, питание было 5 В, ёмкость линии — небольшая. 4.7 кОм давали разумный компромисс между скоростью фронта и потреблением.
Когда 4.7к не работает
- длинная линия (>50 см) — ёмкость растёт, RC растёт, фронт «заваливается»
- fast mode plus (1 МГц) — нужно ~1 кОм
- низкое питание (1.8 В) — порог логического «1» близко к VDD, нужна более жёсткая подтяжка
- много slave'ов — суммарная ёмкость складывается
Как считать правильно
I²C спецификация определяет максимальное время фронта (300 нс для standard mode, 100 нс для fast mode). Зная ёмкость линии, можно посчитать максимальное R.
R_max = t_rise / (0.85 × C_line)
Для типичной макетной платы с 100 пФ и 100 нс фронтом: R_max ≈ 1.2 кОм.
Что я делаю на практике
Ставлю 2.2 кОм по умолчанию, мерю фронт осциллографом, корректирую если нужно. На ESP32-WROOM с тремя slave'ами на одной плате — обычно 2.2 кОм идеально.