Шум на шине I²C длиной сорок сантиметров
Метеостанция на балконе: контроллер внутри, датчик температуры снаружи, между ними сорок сантиметров плоского шлейфа. Раз в час-полтора датчик переставал отвечать, и помогал только сброс питания.
Сначала я винил софт
Переписал работу с шиной три раза. Добавил таймауты, потом восстановление шины девятью тактами SCL, потом полный реинит периферии. Отвалы стали реже, но не исчезли — что уже само по себе было подсказкой: если ошибка чинится ретраем, но возвращается, проблема не в логике.
Осциллограф на линии SDA
Поставил щуп на SDA у датчика и оставил на полчаса с ждущей развёрткой. Поймал момент: фронт нарастает не за микросекунду, а размазан почти на пять, и на вершине сидит характерный горб от наводки. Приёмник в этот момент честно видел то, что видел.
подтяжки были 4,7 кОм ёмкость шлейфа ~120 пФ (оценка по фронту) постоянная 4,7к * 120п = 0,56 мкс, а с запасом на приём — мало
Что помогло
Три вещи, в порядке эффекта: подтяжки уменьшил до 2,2 кОм, скорость шины снизил со ста килогерц до пятидесяти, а в шлейфе развёл сигнальные линии через одну с землёй. Последнее оказалось важнее всего — до этого SDA и SCL шли соседними жилами и наводились друг на друга.
После переделки станция работает пятый месяц без единого отвала. Программные костыли я оставил: они не мешают, а через год я всё равно забуду, зачем они там.
Мораль
Осциллограф стоило достать в первый же вечер, а не на третий. Я потратил примерно шесть часов на переписывание рабочего кода ради проблемы, которая видна на экране за две минуты.