I2C не работает чаще всего по трём причинам, и все три проверяются за минуту.
Первая: нет подтяжек. Линии SDA и SCL должны быть подтянуты к питанию (4.7 кОм). На некоторых модулях они уже стоят, на других — нет, и тогда на шине «висит воздух». Проверка: мультиметром в покое на SDA и SCL должно быть напряжение питания (3.3 или 5 В). Если 0 или плавает — подтяжек нет.
Вторая: неверный адрес. Сканер адресов покажет, что реально на шине. Часто адрес сдвинут (0x3C против 0x3D), зависит от перемычки на модуле, или указан 8-битный вместо 7-битного (0x78 против 0x3C). Проверка: i2c_scanner, потом сверка с даташитом.
Третья: шина «залипла». Одно из устройств удерживает SDA в нуле (после сброса, сбоя питания или помехи), и обмен стоит. Проверка: посмотреть уровни; если SDA в нуле при отпущенных линиях — залипло. Лечение: 9 тактов на SCL вручную или передёрнуть питание.
Дополнительно:
— Нет общей земли между платами — обмен не пойдёт.
— Разные напряжения: 5 В датчик и 3.3 В микроконтроллер без сдвигателя.
— Слишком длинные провода: ёмкость шины растёт, фронты заваливаются. Больше 30–50 см — уже проблема.
— Слишком быстрая скорость для конкретного устройства (попробуй 100 кГц).
— Два устройства с одинаковым адресом.
Порядок отладки: питание → подтяжки → адрес → земля → скорость. Не начинай с кода.
Три причины покрывают почти все случаи, и проверяются они мультиметром, а не чтением драйвера.
Когда I2C не работает, первым делом измерь напряжение на SDA и SCL. Если не 3.3 В — ищи подтяжки, а не ошибку в коде.
Проверь себя
Сканер не находит устройство, хотя оно подключено. С чего начать?
С питания и земли: есть ли 3.3 В на модуле, общая ли земля. Потом проверить подтяжки на линиях и только затем — адрес и скорость.
-
Спецификация I²C-bus (NXP UM10204) на i2c-bus.org
подтяжки и адресация
-
SparkFun: I2C
типичные ошибки