Модуль компаса я купил по случаю: чип на плате требовал 3,3 В, но надпись «I2C» и знакомые четыре пина настраивали на оптимизм. Я подключил его к Uno с её пятёркой вольт — и он работал. День. Потом показания начали плавать, через месяц модуль перестал отвечать сканеру вовсе, тихо, без искр и запаха. Вскрытие показало: я месяц перегружал его входы пятью вольтами, и чип умер от собственного терпения.
Шина I2C многое прощает — открытый сток, дублирующиеся подтяжки, длинные провода, — но не это. В этом уроке разберёмся, почему 5 В опасны для 3,3-вольтовых чипов, почему обратное направление безопасно, как работает двунаправленный конвертер на MOSFET BSS138 и как я принимаю шину после установки конвертера — детектором физического смысла данных.
Чем опасно прямое подключение
Ключ к пониманию — открытый сток: устройства на шине умеют только тянуть линию вниз, к земле. Вверх её поднимает подтяжка — к тому напряжению, к которому её подключили. Если подтяжка модуля сидит на 5 В, все пять вольт приходят на ножку чипа, питающегося от 3,3 В. А у таких чипов предел на входах обычно VDD + 0,5 В — то есть 3,8 В. Лишний вольт открывает защитные диоды: по ним течёт ток, входы греются, а в худший расклад срабатывает latch-up — самоподдерживающийся пробой структуры, после которого чип сгорает, не успев ничего сообщить. Именно поэтому смерть моего компаса была тихой: не короткое замыкание, а медленное отравление.
Обратное направление, к счастью, безопасно. Uno считает высоким всё, что выше VIH — порога, равного 0,6 от питания: 0,6 × 5 В = 3,0 В. Подтяжка к 3,3 В даёт как раз 3,3 В — запас 0,3 В, небольшая, но стабильная. Отсюда моё правило в одну строку: вниз к земле — можно, вверх к 5 В — никогда. И ещё одно, про платки: судите не по чипу, а по обвязке. Модули серии GY со стабилизатором на борту подтягивают линии к 3,3 В после стабилизатора и к 5-вольтовой шине чаще всего готовы; если же подтяжки припаяны прямо к ножке VCC, а вы подали туда 5 В — чип в опасности. Мы такое уже видели с часами: DS3231 в отдельном уроке тоже живёт от 3,3 В, и модули с регулятором к Uno подключаются напрямую.
| Ситуация | Решение |
|---|---|
| Слейв на 5 В: PCF8574, DS1307 | К Uno подключается напрямую |
| Слейв строго 3,3 В, плата без обвязки | Двунаправленный конвертер на BSS138 обязателен |
| Модуль GY-xxx со стабилизатором | Чаще работает напрямую; проверьте, куда припаяны подтяжки |
| Голый OLED SSD1306 на 3,3 В | Конвертер; готовые модули смотрите на борту |
| Мастер 3,3 В (ESP32) + слейв 5 В | Конвертер, либо подтяжки к 3,3 В, если слейву хватает 3,3 В |
Почему для шины нужен именно особый преобразователь? Потому что I2C меняет направление посреди байта: мастер шлёт адрес — слейв тут же отвечает данными. Обычные «направленные» преобразователи уровней, которые ждут, что линия всегда говорит в одну сторону, здесь спотыкаются. Для двухпроводной шины с открытым стоком придумали элегантное решение — ключ из одного MOSFET, который не нуждается ни в направлении, ни в управляющем пине. Голые SSD1306-экраны, кстати, тоже 3,3-вольтовые — об этом в уроке про первый запуск OLED.
Двунаправленный конвертер на BSS138
Механика проста до изящества. Затвор каждого ключа посажен на низкое напряжение — 3,3 В. Исток смотрит в линию низковольтной стороны, сток — в высоковольтную. Обе стороны подтянуты каждая к своему питанию — на готовых модулях стоят резисторы 10 кОм на оба канала. Пока обе линии подняты, ключ закрыт: стороны вообще не связаны, каждая живёт своим уровнем. Кто-то прижал свою линию к земле — между затвором и истоком появляется напряжение, ключ открывается и тянет вниз вторую сторону через себя. Отпустил — подтяжки вернули каждой стороне её напряжение. Направление разруливается само, вплоть до каждого бита, — именно то, что нужно шине, где направление меняется внутри одной транзакции.
Практика: готовый модуль на четыре канала стоит копейки — на российских маркетплейсах от сотни рублей, у Adafruit — $3,95, — и это дешевле любого сгоревшего чипа. Скорость: 100 кГц конвертер держит уверенно, 400 кГц — на коротких проводах; для дальних линий конвертер и буфер дружат, о метрах мы говорили в уроке про длину проводов. И не подменяйте BSS138 «похожим» транзистором 2N7000 по совету с форума: у того другая связка порога и ёмкостей, фронты получаются кривыми — я такое видел дважды, оба раза на чужих платах.
#include <Wire.h> void checkBus() { // 1. Оба устройства должны ответить Wire.beginTransmission(0x68); // часы DS3231 — «3,3-вольтовая сторона» int rtc = Wire.endTransmission(); Wire.beginTransmission(0x27); // LCD-переходник — «5-вольтовая сторона» int lcd = Wire.endTransmission(); // 2. Контрольные байты и проверка физического смысла Wire.requestFrom(0x68, 3); unsigned long deadline = millis() + 100; while (Wire.available() < 3 && millis() < deadline) { delay(1); } int b0 = 255, b1 = 255, b2 = 255; if (Wire.available() >= 3) { b0 = Wire.read(); b1 = Wire.read(); b2 = Wire.read(); } // регистры времени: секунды и минуты обязаны лежать в 0..59 bool okData = (b0 <= 59) && (b1 <= 59) && (b2 <= 59); if (rtc == 0 && lcd == 0 && okData) { Serial.println("bus=ok (adresa otvetili, dannye v diapazone)"); } else { Serial.print("bus=... rtc="); Serial.print(rtc); Serial.print(" lcd="); Serial.print(lcd); Serial.print(" data="); Serial.println(okData); }} void setup() { Wire.begin(); Serial.begin(9600); Serial.println("Priyomka shiny posle konvertera urovnej");} void loop() { checkBus(); delay(3000);}Логика приёмки в том, что битые уровни почти никогда не выглядят как «нет связи» — они выглядят как мусор: 255, нули, числа вне физических диапазонов. Поэтому детектор проверяет не связь, а смысл: секунды не бывают больше 59, минуты тоже. Схема монтажа конвертера: земля одна общая на оба напряжения, выводы LV и HV подпитываются каждый своим, подтяжки конвертера суммируются с подтяжками модулей — три модуля по 10 кОм параллельно дадут уже 3,3 кОм на шину, следите за этим, как в истории с каскадом лишних подтяжек из первого урока раздела.
Про питание 3,3 В с самой Uno: пин 3.3V отдаёт не больше 50 мА. Конвертеру (сами ключи тока не едят) и паре датчиков по паре миллиампер хватает, но экран с подсветкой от этого пина уже на грани — при просадке 3,3 В конвертер начинает врать, и вы будете искать виноватого не там. Надёжнее брать 3,3 В от внешнего источника — о таких схемах писал в уроке про питание макетки.
Детектор мусора: приёмка в симуляторе
- Открытый сток тянет линии вниз: опасна не единица, а подтяжка к 5 В на 3,3-вольтовом чипе
- Предел большинства 3,3-вольтовых чипов — VDD + 0,5 В; пятёрка превышает его на 1,2 В
- Uno читает HIGH от 3,0 В (VIH = 0,6 × 5 В), поэтому подтяжка к 3,3 В для мастера безопасна
- Конвертер на BSS138 двунаправленный без управляющих пинов: затвор на 3,3 В, подтяжки 10 кОм с обеих сторон
- Судите по платке, а не по чипу: стабилизатор на борту и подтяжки после него — чаще можно напрямую
- 1. Что именно представляет опасность для 3,3-вольтового чипа на общей шине?
- 2. Каков абсолютный предел на входах большинства 3,3-вольтовых чипов?
- 3. Почему Uno корректно читает 3,3-вольтовые сигналы?
- 4. Как конвертер на BSS138 понимает, в какую сторону передавать уровень?
- 5. Модуль со стабилизатором и подтяжками к 3,3 В после него подключили к Uno на 5 В. Вероятный итог?
Теперь на вашей шине могут жить все: 5-вольтовые PCF8574, 3,3-вольтовые часы, OLED и датчики погоды — по два провода и конвертер за сотню рублей. Детектор мусора из симулятора берите на борт как приёмный тест: адреса ответили, числа физически осмысленны — шина принята. Дальше по курсу — устройства крупным планом: дисплеи, датчики и энергонезависимая память, каждое со своим характером и своими уровнями.
Частые вопросы по теме урока
- Что именно представляет опасность для 3,3-вольтового чипа на общей шине?
- Вверх линию поднимает подтяжка, и она приносит на вход 5 В. Вниз устройства тянут только сами — к земле, это безопасно. Подтяжка линий к 5 В
- Каков абсолютный предел на входах большинства 3,3-вольтовых чипов?
- VDD + 0,5 В, то есть 3,8 В при питании 3,3 В. Пятёрка превышает предел на 1,2 В — защитные диоды не рассчитаны на это. VDD + 0,5 В
- Почему Uno корректно читает 3,3-вольтовые сигналы?
- 3,3 В выше порога 3,0 В на 0,3 В. Запас небольшой, но стабильный — направление «слейв к мастеру» безопасно. Порог VIH равен 0,6 от питания: 3,0 В, а сигнал — 3,3 В
- Как конвертер на BSS138 понимает, в какую сторону передавать уровень?
- Затвор сидит на 3,3 В, и любой прижим линии к земле открывает ключ сам. Направление разруливается до каждого бита. Никак: направлений нет, ключ открывается сам, когда одну из сторон прижали к земле
- Модуль со стабилизатором и подтяжками к 3,3 В после него подключили к Uno на 5 В. Вероятный итог?
- Подтяжки сидят на 3,3 В стабилизатора, чип пятёрку на входы не видит. Но всегда проверяйте плату: подтяжки прямо на VCC — уже опасно. Чаще всего работает: линии подтянуты к 3,3 В, а Uno читает от 3,0 В