Как я с i2c разбирался…

imagesМоё вхождение в увлечение электроникой, началось с ардуины. Вначале я подключал резисторы, светодиоды, lcd экраны и другие штуки, используя готовые библиотеки. Спустя некоторое время, я понял что это мне очень нравиться, купил оригинальный программатор, и начал программировать в AVR студии на ассемблере, потом на си.
Постепенно назрела необходимость использовать различные МК работающие на i2c, но вначале нужно разобраться как с ними работать, и для этого мне потребовался отладчик, готовых реализаций, для сборки отладчика на радио-компонентах имеющихся у меня в наличии не нашел, поэтому сделал свой.

Перед прочтением желательно прочитать следующее: http://easyelectronics.ru/interface-bus-iic-i2c.html

Общение с устройствами i2c будет через микроконтроллер atmega16, данный микроконтроллер с компьютером соединяется по протоколу USART,  а с устройством i2c,  по 2-м выводам  атмеги  sda и scl соответственно. Получается что микроконтроллер  атмега будет являться посредником в общении,  с устройствами i2c. Реализован только режим мастера.

Для общения с устройствами через USART, был разработан небольшой протокол:

1) Передаваемая строка начинается на ! и заканчивается на &

2) Для установки на шине i2c начала передачи используется символ S

3) Для установки окончания передачи используется символ E

4) Для посылки байта команда Wxx, где хх – шестнадцатиричное значение

5) Если при получении байта от i2c устройства нужно послать AСK то команда будет такой r–, иначе R– будет послан NAK, что означает мы не собираемся больше получать данные.

А теперь собственно пример при работе с мк ds1307 (календарь):

Мы посылаем команду: !SWD0W00E&

Для удобства разобьем команду пробелами,  ! S WD0 W00 E &

1) S – в начале шлем старт

2) WD0 – шлем байт D0 в данном случае он содержит адрес устройства из 7-ми бит, и 8-й бит R/W сейчас он равен нулю.

3) Woo – шлем байт 00, который устанавливает “указатель” на ячейку с которой мы далее будем работать

4) E – завершение связи с устройством

а вот как выглядит:

i2c start i2c stop

 

Пример записи в ячейку 01, значения 22 (хранятся в ней минуты): Посылаем команду: ! S WD0 W01  W22 & (пробелы не должны быть, так просто визуально понятнее сделал)

Пример чтения из устройства секунд, минут и часов: !SWD0W00SWD1r–r–R–E&, а в ответ микроконтроллер пришлет следующее: ++ok+ok++ok+41+47+00+

А теперь расшифрую посылаемую строку поподробнее: !S WD0 W00 S WD1 r– r– R– E&

1) S – начало

2) WD0 – посылаем адрес устройства (с битом write = 0)

3) W00 – устанавливаем указатель

4) S – посылаем повторный старт (требование логики мк ds1307)

5) WD1 – посылаем адрес устройства (с битом read = 1)

6) r–   – после получения байта посылаем ACK

7) r–   – после получения байта посылаем ACK

8)R–  – после получения байта посылаем NAK (сообщая мк ds1307 что больше получать данные не собираемся)

9) E -окончание

 

Расшифровка полученной строки: + +ok +ok + +ok +41 +47 +00 +

Получаемая строка всегда имеет одинаковую длину с посылаемой, если сопоставим то что отправили и получили увидим следующее:

1) S –> +

2) WD0 –> +ok

3) W00 –> +ok

4) S –> +

5) WD1 –> +ok

6) r–  –> +41   (сейчас 41 секунда)

7) r–   –> +47 (47 минут)

8)R–  –> +00 (0 часов)

9) E –> +

+ и +ok означают успешное выполнение.

И вот часть сигнала:

i2c-2

Зеленый шарик это посылка “старта”……

 

Сейчас понемногу делаю программу, с более дружественным интерфейсом, выглядит так:

i2c

Правда ещё очень сырая, но кому интересно, ниже будет архив, с 2-мя проектами для атмеги, и данной программы.

0034_AVR_SHARP_Tester_I2C

На этом пока и закончу, так-же успел проверить работоспособность с мк MCP23008 – эта мк имеет 8 выводов, которые можно настраивать на вход/выход, и собственно по 2 проводам рулить 8-ю портами.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Protected with IP Blacklist CloudIP Blacklist Cloud