Реле Tianbo - ресурс 10 млн переключений

Сниффер шины I2C на микроконтроллере AVR

Сниффер (монитор, "прослушка") I2C шины позволяет проводить мониторинг шины не влияя на работу проверяемого устройства: все данные, включая адреса устройств, сигналы ACK/NAK, условия START и STOP передаются в текстовой форме в терминальную программу на компьютере по последовательному интерфейсу.

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

В своих разработках, при отладке устройств и поиске ошибок, где используется интерфейс I2C, пользователям не редко необходимо знать, что происходит на шине при работе устройства. Существуют коммерческие устройства для этих целей, но чаще всего их стоимость очень высока. Для мониторинга можно было использовать логический анализатор подключенный к сигналам SCL и SDA и расшифровывать протокол вручную. Для решения этой проблемы и было разработано данное устройство – монитор I2C шины.

Интерфейс I2C был разработан компанией Philips в 1980 г. Это последовательная шина данных для связи интегральных схем, разработанная фирмой Philips в начале 1980-х как простая шина внутренней связи для создания управляющей электроники. Используется для соединения низкоскоростных периферийных компонентов с материнской платой, встраиваемыми системами и мобильными телефонами. Название представляет собой аббревиатуру слов Inter-Integrated Circuit. I2C использует две двунаправленных линии, подтянутые к напряжению питания и управляемые через открытый коллектор или открытый сток — последовательная линия данных (SDA, англ. Serial DAta) и последовательная линия тактирования (SCL, англ. Serial CLock), обе нагруженные резисторами. Стандартные напряжения +5 В или +3,3 В, однако допускаются и другие.

Блок схема устройства приведена на рисунке ниже.

 сниффер шины I2C

Принципиальная схема устройства представлена на рисунках ниже.

принципиальная схема сниффер шины I2C
Кликните для увеличения

 

принципиальная схема: сниффер шины I2C
Кликните для увеличения

Принципиальная схема: сниффер шины I2C
Кликните для увеличения

Основой устройства является 8-битный микроконтроллер AVR ATmega161 производства компании Atmel. Микроконтроллер использует внешнюю память RAM (ОЗУ), порт RS232 и два вывода для подключения к шине I2C. Стоит отметить также, что имеется перемычка для установки скорости 9600 бод. Интерфейс RS232 использует линии RTS и CTS для управления потоком. Интерфейс RS232 выполнен на микросхеме MAX203 (RS-232 трансивер).

Интерфейс I2C может работать на различных скоростях, но обычно в пользовательских устройствах это 100 кГц или 400 кГц. Изначально подразумевалось использовать устройство для 100 кГц шины, поэтому микроконтроллера AVR с рабочей частотой 8 МГц будет достаточно. Ограничения на скорость накладываются ввиду того, что микроконтроллер AVR должен выполнить несколько инструкций для каждого бита на шине I2C. В дальнейшем, для мониторинга высокоскоростных интерфейсов I2C, возможно применение дополнительной логики (программируемой логики) для захвата последовательного потока и предоставления данных для дальнейшей обработки микроконтроллеру.

Интерфейс RS232 поддерживает работу со скоростью 115,200 бод. Если данные будут передаваться в формате ASCII, каждый байт на шине I2C займет при передаче по RS232 два байта. Это вызывает определенные проблемы при буферизации, поэтому было принято решение применить внешнюю память 32 КБайт для использования в качестве кольцевого буфера. Подпрограмма помещает данные, полученные от I2C интерфейса в конец, подпрограмма обслуживания последовательного интерфейса берет данные для передачи с начала RAM памяти. Простая подпрограмма перемещает указатели обратно на начало внешней памяти RAM при достижении 32 КБайт.

В итоге для устройства понадобится микроконтроллер ATmega161, SRAM память и микросхема для управления памятью 74F573 (8 защелок D-типа). Возможно использование устаревшей памяти – 20 нс 32 КБайт SRAM (например, от старых компьютеров на базе 486 процессора).

Для тестирования памяти (т.к. нет уверенности, что устаревшие микросхемы работоспособны) была предусмотрена подпрограмма тестирования памяти. Вывод микроконтроллера PC7(А15) был выбран для сигнала CS (выбор устройства) микросхемы RAM, таким образом устанавливая RAM на адрес 0.

Перемычка на схеме (J6, вывод микроконтроллера PB0 ) предназначена для снижения скорости обмена по RS232 до 9600 бод (в этом случае внешняя память очень необходима) при подключении к «слабой» терминальной программе, а также при использовании аппаратного контроля потока.

Для отладки устройства применялась отладочная плата производства Atmel STK500.

Программное обеспечение микроконтроллера разработано таким образом, что все основные операции выполняются в обработчиках прерываний. На шине I2C условия Start и Stop формируются при изменении на линии SDA, когда SCL имеет высокий логический уровень, поэтому обработчик прерывания вызывается при каждой смене фронта сигнала SDA. При входе в обработчик прерывания проверяет состояние линии SCL. Если SCL имеет низкий уровень – обработка прерывания прекращается. Иначе, «новый» уровень линии SDA определяет, было условие Stop или Start. Все данные и условия записываются в память (S для условия Strat, P для условия Stop), счетчик битов сбрасывается и далее следует выход из обработчика прерывания.

Прерывания для линии SCL (для захвата бит данных) включаются только после определния наличия условия Start и выключаются после обнаружения условия Stop.

Для захвата данных нам необходим лишь нарастающий фронт сигнала SCL. С каждым прерыванием мы «захватываем» линию SDA, чтобы узнать что на линии: 1 или 0. Каждый бит помещается в специальный регистр, предназначенный для данных, счетчик битов инкрементируется. По достижении 8 бит, происходит конвертация в формат ASCII и сохранение в RAM. Следующий бит будет ACK или NAK, который также сохраняется в SRAM (A, N).

Пример данных получаемых от сниффера шины I2C в терминальной программе:

S C0 A 73 A E2 A 05 A 00 A 00 A P
S C0 A 00 A 7F A 5F A 55 A 00 A P
S C0 A 02 A 1F A 07 A 99 A A0 A P
S C0 A 5C A 00 A 00 A 00 A D8 A P
S C0 A 78 A 00 A 80 A 10 A CC A P
S C0 A 7B A E0 A 05 A 00 A 00 A P
S A0 A 00 A S A1 A 31 A 31 A 31 A 31 A 31 A 31 A 31 A 31 N P
S C0 A 21 A 00 A 00 A 05 A 58 A P
S C0 A 21 A S C1 A 00 A 00 A 00 A 80 N P


По полученным данным видно, что тестируемое устройство производит запись в регистры устройства с адресом 0хС0, проводит чтение данных по адресу 0хА0 (повторное условие Start, следующее за адресом 0хА1), снова производит запись по адресу 0хС0, и затем производит чтение (снова, повторно условие Start) с адреса 0хС1.

Исходный код и прошивка для микроконтроллера

circuitcellar.com

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: I2C Bus Sniffer on AVR

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя