Представляем несложный самодельный сканер шины I2C, который легко обнаруживает подключённые устройства в полном диапазоне адресов от 0 до 127 ($00–$7F). Этот прибор питается стабилизированным напряжением в пределах 2.7–5.5 В, получаемым непосредственно от исследуемой шины. Результаты сканирования отображаются в графической форме на монохромном OLED-дисплее с разрешением 128×64 пикселя (управляемом контроллером SSD1306 через шину I2C) и адресами $78 ($3C) или $7A ($3D). Прибор нужен для проверки наличия устройств на шине I2C и наблюдения за состоянием её линий SCL/SDA.
Схема устройства


В качестве основы схемы — популярный ATtiny24(A/V), хотя вместо него можно использовать и ATtiny44(A/V) или ATtiny84(A/V), отличающиеся лишь объёмом памяти. Управляющая программа, написанная на ассемблере, универсальна для всех этих моделей и занимает 1182–1188 байт FLASH-памяти. Она компилируется с учётом заданной частоты CLK микроконтроллера, которая должна быть чётной и лежать в диапазоне 4–20 МГц. Для удобства, в архиве есть отдельные прошивки для каждой возможной частоты.

Микроконтроллеры в версиях «A» и «V» выделяются своей способностью работать при напряжении питания от 1.8 до 5.5 В с максимальной частотой 20 или 10 МГц. Это позволяет сканеру функционировать при минимальном Vcc=1.8 В (с частотой CLK=4 МГц), что особенно полезно при низком напряжении. Зависимость максимальной частоты Fmax от Vcc проста: при 1.8 В — 4 МГц, при 2.7 В — 10 МГц, а при 4.5–5.5 В — до 20 МГц (кроме версии «V»). Эта гармония напряжения и частоты отражена на графике, который я привёл в документации.
Принцип работы сканера
После включения сканер непрерывно следит за линиями SCL/SDA, отображая на дисплее их текущие состояния: «SCL: x» и «SDA: x», где «x» — это логический уровень («0» — LOW, «1» — HIGH). Это позволяет мгновенно заметить неисправность, например, замыкание линии на землю. Короткое нажатие кнопки S1 (SCAN) запускает проверку доступности шины.
Если в течение примерно 50 мс на линиях SCL/SDA фиксируется низкий уровень (шина занята), сканер приостанавливает работу, показывая «SCL: B» и «SDA: B», и ждёт повторного нажатия S1 для возврата к мониторингу.
Если же шина свободна, сканер приступает к её исследованию. Важно, чтобы во время сканирования никакие устройства не передавали данные — иначе возникнет конфликт, и результаты станут ненадёжными. Об этом пользователь не будет предупреждён напрямую, разве что обнаружит неожиданные устройства.
Сканирование шины I2C и управление дисплеем реализовано программно (bit-bang) с частотой 100 кГц (режим Standard Mode). Сигналы (O)SCL/(O)SDA формируются с точностью до одного такта, сохраняя идеальную симметрию благодаря чётной частоте CLK (4–20 МГц).
Процесс обнаружения устройств прост: для каждого адреса ($00–$7F) выполняется старт, отправка 8-битного адреса с битом RW=0, проверка бита подтверждения ACK (через 2.5 мкс после 9-го фронта SCL) и завершение стоп-условием. Этот цикл повторяется 128 раз, охватывая все адреса, включая зарезервированные диапазоны %0000xxx ($00–$07) и %1111xxx ($78–$7F), которые также могут использоваться устройствами.












