верстак

Шум на шине I²C длиной сорок сантиметров

Метеостанция на балконе: контроллер внутри, датчик температуры снаружи, между ними сорок сантиметров плоского шлейфа. Раз в час-полтора датчик переставал отвечать, и помогал только сброс питания.

Сначала я винил софт

Переписал работу с шиной три раза. Добавил таймауты, потом восстановление шины девятью тактами SCL, потом полный реинит периферии. Отвалы стали реже, но не исчезли — что уже само по себе было подсказкой: если ошибка чинится ретраем, но возвращается, проблема не в логике.

Осциллограф на линии SDA

Поставил щуп на SDA у датчика и оставил на полчаса с ждущей развёрткой. Поймал момент: фронт нарастает не за микросекунду, а размазан почти на пять, и на вершине сидит характерный горб от наводки. Приёмник в этот момент честно видел то, что видел.

подтяжки были   4,7 кОм
ёмкость шлейфа  ~120 пФ (оценка по фронту)
постоянная      4,7к * 120п = 0,56 мкс, а с запасом на приём — мало

Что помогло

Три вещи, в порядке эффекта: подтяжки уменьшил до 2,2 кОм, скорость шины снизил со ста килогерц до пятидесяти, а в шлейфе развёл сигнальные линии через одну с землёй. Последнее оказалось важнее всего — до этого SDA и SCL шли соседними жилами и наводились друг на друга.

После переделки станция работает пятый месяц без единого отвала. Программные костыли я оставил: они не мешают, а через год я всё равно забуду, зачем они там.

Мораль

Осциллограф стоило достать в первый же вечер, а не на третий. Я потратил примерно шесть часов на переписывание рабочего кода ради проблемы, которая видна на экране за две минуты.

← ко всем заметкам