Подключение i2c к компьютеру
Все началось с того, что ко мне в руки попала микросхема PCA2129T. После непродолжительного “гугления” выяснилось, что это чудо техники производит NXP Semiconductors аж в Нидерландах. Хотя это не особенно интересно, гораздо интереснее оказался даташит на данную микросхему. Скачивается он с сайта производителя, а если быть точным, то вот здесь. Скачиваем, открываем и начинаем внимательно изучать, попутно осуществляя перевод с английского языка.
Итак, изучив первую страницу даташита, выясняем, что PCA2129T обычные часы реального времени (далее RTC), со встроенным кварцем на 32,768 КГц. и температурной компенсацией оного. Да еще и оптимизирована для высокоточных устройств с низким потреблением. Кроме этого, микросхема может работать на шинах I 2 C и SPI. Вот этот момент, конечно не совсем понятен. Я лично так и не смог представить себе устройство в котором требуется подключить RTC именно по SPI, потратив на это целых 4 (ну или 3) вывода микроконтроллера. Разве что у вас уже подключено 157 устройств по I 2 C (а больше и нельзя), а часов для полного счастья как раз и не хватает. Ну да ладно, он никому не мешает. Читаем дальше:
- Осциллятор с температурной компенсацией и интегрированными конденсаторами;
- Точность хода 3ppm (part per million), температуре от -30 до +80 градусов Цельсия. Т.е. часта кварца может изменяться на 3 миллионных. Очень даже неплохо, я бы даже сказал замечательно. Обычные часовые кварцы имеют минимальное отклонение 5ppm и это у самых-самых, обычно все намного хуже и ppm переваливает за 10;
- Год, месяц, день, часы, минуты, секунды и подстройка под високосный год (ну этим уже никого не удивишь);
- Функция штампа времени. Забавная штуковина, например не хотим мы, чтобы пользователь ковырял наше устройство. Берем и вешаем на крышку микропереключатель. Крышку открыли, контакт замкнулся, и в память микросхемы записалась дата и время. Очень удобно, особенно если после вскрытия устройство работать перестала, а пользователь клянется, что ничего не трогал. Либо может поставить “штамп” при смене батарейки, чтобы не забыть когда поменяли;
- Опять описание интерфейсов;
- Резервная батарея. Куда же без нее;
- Контроль напряжения батареи. А вот это полезная штука, не надо АЦП МК использовать. Стукнули микросхеме, она все измерила и сказала нам пора менять или нет;
- Детектор отключения внешнего питания;
- Сброс при подаче питания;
- Детектор остановки осциллятора;
- Выход прерываний. На него можно вывести ежесекундное/минутное прерывание, прерывание сторожевого таймера и прерывания от будильника;
- Программируемый выход.
На этом возможности исчерпаны, но и того, что есть, больше чем достаточно. Далее можно увидеть назначение выводов микросхемы.
Тут все просто: питание (Vss, Vdd), интерфейсы (SDA/CE, SDO, SDI, SCL), переключение интерфейсов (IFS) резервная батарея (вход Vbat и выход BBS), вывод прерываний (INT), вход для “штампа” даты (TS), программируемый выход (CLKOUT) и еще 4 вывода для которых производители не придумали никаких функций.
Ну вот, с регистрами памяти разобрались, теперь можно попытаться запустить это чудо техники. Паяем микросхему вот на такую плату (ну или на любую другую):
А сверху наклеиваем бумажку с названием выводов разъема:
Размеры, конечно, гигантские по сравнению с той же DS3107. Зато производитель обещает высокую точность хода, плюс не надо искать высокоточный кварц. И из внешних компонентов только 3 резистора, ну и пара конденсаторов по питанию. Кстати о питании. Минимальное напряжение всего 1,8В., а максимально 6,5В. хотя производитель рекомендует не превышать 4,2В. Да, сжечь ее достаточно трудно. Один раз перепутал провода питания и подал питание наоборот. Обнаружил это, когда что-то задымило. Микросхема раскалилась, но выжила. После охлаждения и правильной подачи питания заработала, как ни в чем не бывало.
Итак, теперь все готово для работы. Начнем с I 2 C, там проводов меньше. Сразу скажу, что I 2 C буду использовать программный. Он, конечно, не имеет таких широких возможностей, как аппаратный, но для работы с такой примитивной микросхемой его вполне хватит. Для написания библиотеки программного I 2 C нам потребуется описание его принципов работы. Сложного ничего нет, открываем спецификацию протокола и читаем. В общем виде работа I 2 C выглядит следующим образом:
- Начало передачи определяется Start последовательностью — переход линии SDA на низкий уровень при высоком уровне SCL;
- При передаче информации от Master к Slave, ведущий генерирует такты на SCL и выдает биты на SDA. Которые ведомый считывает когда SCL становится 1.
- При передачи информации от Slave к Master, ведущий генерирует такты на SCL и считывает данные с линии SDA. А ведомый следит за состоянием SCL и после того, как SCL уходит в 0, отправляет на SDA бит, который мастер считывает, после того как переводит SCL в высокий уровень.
- Заканчивается все STOP последовательностью. Когда при высоком уровне на SCL линия SDA переходит из низкого в высокий уровень.
Ну вот и все, теперь пишем библиотеку для самой PCA2129. Сначала заглянем в даташит, в раздел Interfaces и найдем там диаграммы записи и чтения. Вот эти:
Для записи (верхняя диаграмма) все просто, оправляем адрес устройства + бит чтения/записи (0), адрес ячейки памяти и данные. Ну и не забываем про СТАРТ и СТОП. Для чтения (нижняя диаграмма) все немного сложнее. Сначала отправляем адрес устройства + бит чтения/записи (0) и адрес ячейки памяти. После этого отправляем СТОП и снова СТАРТ. А теперь отправляем адрес устройства + бит чтения/записи (1) и начинаем читать данные. Т.е. все что от нас требуется – это отправлять адреса соответствующих ячеек памяти и читать/писать данные. Значит, мы можем легко и непринужденно написать библиотеку для PCA2129. Получилось вот так (код как всегда в прикрепленных исходниках):
Ну вот, собственно, и все. Подключаем PCA2129 к отладочной плате (на ней стоит ATm ega16).
В ключаем и… Ура, заработало!
А ведь и правда, работает. И время, и дата, даже будильник и определения заряда батареи. Функцию “штампа” времени я не писал, но если понадобится, дописать не проблема.
Итак, с I 2 C все понятно. Перемещаемся на SPI. Он тоже есть в программной реализации. Как раз те самые выводы, к которым подсоединяется программатор: MOSI, MISO, SCK. Ничем особенным эта шина не отличается. По SCK шлем тактовые импульсы, а по MOSI и MISO идет обмен данными (MOSI – выход, MISO – вход). Да, еще нужна линия CE (chip enable), именно она говорит устройству на линии о начале обмена данными. МК опускает линию в 0 и начинает обмен. Да, у каждого устройства на шине своя линия CE. Обмен данными по SPI происходит еще проще, чем по I 2 C. Да, она еще и более скоростная, до 6,5 Мбит/с. Вполне можно подключать высокопроизводительный АЦП или ЦАП. Мы же будем подключать часы. Обмен данными выглядит следующим образом:
Как видно из диаграмм, все элементарно. По сути это обычный сдвиговый регистр. При записи используется только вывод MOSI МК, при чтении добавляется вывод MISO. Причем запись и чтение данных идут при противоположенных состояниях линии SCK. Как именно - зависит от режима работы SPI, а их целых 4. Описание всех режимов есть в соответствующей документации, поэтому здесь я их приводить не буду. Тем более обычно используется режим 0.
Для SPI я написал библиотеку для программной и аппаратной реализации. При программной реализации можно выбрать любой порт МК, а также вынести линию MISO на любой порт, не зависимо от остальных выводов. Кроме этого можно объединить выводы MOSI и MISO, сэкономив один вывод МК. В аппаратной реализации все стандартно, подключаемся к определенным выводам МК и работаем. Зато можно выбрать 4 режима работы, скорость передачи данных, использовать прерывания и использовать режим Slave (например, для связи двух МК). Да, PCA2129 не осуществляет синхронную передачу данных, поэтому и в библиотеке программной реализации ее нет. Но если понадобится, можно без проблем ее добавить. В обеих библиотеках функции называются одинаково и имеют одинаковые параметры. Выглядят они вот так:
Осталось только немного изменить библиотеку для работы с PCA2129 (ту самую, что написали для работы по I 2 C). Что мы и делаем. Теперь подключаем плату с микросхемой к отладочной плате по SPI (не забывая переставить джампер SPI/I2C и снять джампер I/S).
Подаем питание, и… Снова работает! Только проводов стало больше.
А вот и видео работы:
Итак, подведем итоги. PCA2129T оказалась отличной микросхемой часов реального времени. Из плюсов стоит отметить высокую точность хода, которая гораздо выше, чем можно получить при использовании внешнего кварца), температурная компенсация (она и дает такую точность), отслеживание уровня заряда резервной батареи, “штамп” времени, сторожевой таймер и вывод прерываний. Но без минусов все равно не обошлось, размер микросхемы великоват, намного больше, чем та же DS1307. На мой взгляд, минус не такой уж и значительный, плюсы намного его превосходят. На этом все. К статье прилагаю все библиотеки, описанные в статье. Все они обильно прокомментированы.
Вы здесь: Home Железо Прочее Превращаем программатор USBasp в I2C-USB переходник
Превращаем программатор USBasp в I2C-USB переходник:
Если Вы уже знакомы с USBasp программатором,то вы знаете,что это очень простое и дешевое устройство для программирования м/к ATmega,но оказывается программатор , используя проект i2c tiny usb можно превратить в полноценный дешевый переходник I2C to USB.
В итоге мы получаем возможность подключать разные устройства I2C к компьютеру всего за 100 рублей (3$).Например мы можем подключить датчик давления BMP085 или микросхемы ввода/вывода MCP23017 для подключения кнопок или управления нагрузкой через реле.
USBasp прошивается стандартно как при обновлении прошивки и прошивается так же через arduino как программатор или используя другой USBasp программатор .Для программирования используются те же выводы SCK,MISO,MOSI ,RESET ,но прошивка идет через утилиту avrdude ,а не из среды Arduino IDE.
Порядок действий для прошивки через arduino:
1. Подключаем выводы SCK,MISO,MOSI ,RESET к Arduino согласно инструкции .
2. Установавливаем перемычку self programming (на фото обозначена как JP2),обычно место для перемычки не распаяно.
3. Качаем скомпилированную прошивку под USBasp тут и кидаем в папку путь_к_папке_ардуины_/hardware/tools/ .
4. Перейдем в консоль (cmd или bash) Вашей операционной системы в папку через команду cd путь_к_папке_ардуины_/hardware/tools/ и далее вводим команды для Windows,не забывем указать верный порт,на котором подключена Arduina:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -v
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:i2c_tiny_usb.hex -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m
Для прошивки из Linux все аналогично, заменяется часть строки:
./avrdude -C avrdude.conf -c avrisp -P /dev/ttyUSB0 .
Порядок действий для прошивки через другую USBasp:
Подключаем выводы SCK,MISO,MOSI ,RESET один в один.Можно просто подключить через шлейф,идущий в комплекте с программатором.
Указываем опцию -c usbasp вместо -c avrisp
После успешной прошивки устройство опознается как i2c-tiny-usb и выводы программатора будут иметь другое назначение: SDA и SDL ,к которым мы можем уже подключать I2C устройства согласно справочной информации.
Работа переходника I2C-USB в Linux:
Драйвера в Linux не требуются ,но по умолчанию модуль i2c-dev не загружен и его необходимо установить в автозагрузку выполнив команду echo "i2c-dev" >>/etc/modules или/и загрузить модуль немедленно командой modprobe i2c-dev .В папке /dev/ Вы увидите возможно несколько устройств вида -i2c-X,наше скорее всего будет последним.Зная номер сейчас можно работать с устройствами подключенные на данной шине согласно примеров и инструкций к устройствам.Рекомдуется установить пакет программ i2c-tools (через управление ПО Вашей операционной системы) -поможет для поиска I2C устройств командой i2cdetect -y Х ,где Х - это номер i2c шины:
Приложения с данным переходником i2c_tiny_usb могут работать как с USB устройством -в этом случае загрузка модуля i2c-dev не нужна.
Работа переходника I2C-USB в Windows:
Для работы переходника требуются драйвера i2c_tiny_usb .В windows приложения работают только как с USB устройством,а не с шиной I2C.
Материалы и ссылки:
Прошивка i2c_tiny_usb.hex.
Страничка проекта i2c_tiny_usb.
Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.
Вы здесь: Home Железо Прочее I2C-USB переходник
Превращаем программатор USBasp в I2C-USB переходник:
Если Вы уже знакомы с USBasp программатором,то вы знаете,что это очень простое и дешевое устройство для программирования м/к ATmega,но оказывается программатор , используя проект i2c tiny usb можно превратить в полноценный дешевый переходник I2C to USB.
В итоге мы получаем возможность подключать разные устройства I2C к компьютеру всего за 100 рублей (3$).Например мы можем подключить датчик давления BMP085 или микросхемы ввода/вывода MCP23017 для подключения кнопок или управления нагрузкой через реле.
USBasp прошивается стандартно как при обновлении прошивки и прошивается так же через arduino как программатор или используя другой USBasp программатор .Для программирования используются те же выводы SCK,MISO,MOSI ,RESET ,но прошивка идет через утилиту avrdude ,а не из среды Arduino IDE.
Порядок действий для прошивки через arduino:
1. Подключаем выводы SCK,MISO,MOSI ,RESET к Arduino согласно инструкции .
2. Установавливаем перемычку self programming (на фото обозначена как JP2),обычно место для перемычки не распаяно.
3. Качаем скомпилированную прошивку под USBasp тут и кидаем в папку путь_к_папке_ардуины_/hardware/tools/ .
4. Перейдем в консоль (cmd или bash) Вашей операционной системы в папку через команду cd путь_к_папке_ардуины_/hardware/tools/ и далее вводим команды для Windows,не забывем указать верный порт,на котором подключена Arduina:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -v
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:i2c_tiny_usb.hex -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m
Для прошивки из Linux все аналогично, заменяется часть строки:
./avrdude -C avrdude.conf -c avrisp -P /dev/ttyUSB0 .
Порядок действий для прошивки через другую USBasp:
Подключаем выводы SCK,MISO,MOSI ,RESET один в один.Можно просто подключить через шлейф,идущий в комплекте с программатором.
Указываем опцию -c usbasp вместо -c avrisp
После успешной прошивки устройство опознается как i2c-tiny-usb и выводы программатора будут иметь другое назначение: SDA и SDL ,к которым мы можем уже подключать I2C устройства согласно справочной информации.
Работа переходника I2C-USB в Linux:
Драйвера в Linux не требуются ,но по умолчанию модуль i2c-dev не загружен и его необходимо установить в автозагрузку выполнив команду echo "i2c-dev" >>/etc/modules или/и загрузить модуль немедленно командой modprobe i2c-dev .В папке /dev/ Вы увидите возможно несколько устройств вида -i2c-X,наше скорее всего будет последним.Зная номер сейчас можно работать с устройствами подключенные на данной шине согласно примеров и инструкций к устройствам.Рекомдуется установить пакет программ i2c-tools (через управление ПО Вашей операционной системы) -поможет для поиска I2C устройств командой i2cdetect -y Х ,где Х - это номер i2c шины:
Приложения с данным переходником i2c_tiny_usb могут работать как с USB устройством -в этом случае загрузка модуля i2c-dev не нужна.
Работа переходника I2C-USB в Windows:
Для работы переходника требуются драйвера i2c_tiny_usb .В windows приложения работают только как с USB устройством,а не с шиной I2C.
Материалы и ссылки:
Прошивка i2c_tiny_usb.hex.
Страничка проекта i2c_tiny_usb.
Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.
Все началось с того, что мне надо было подключиться к одному устройству по USART. Я сразу взял адаптер USB to UASRT (ибо в ноутбуке COM порт не предусмотрен) на AtTiny2313 (рекламой заниматься не буду, схема легко находится в интернете), подключил, запустил и внезапно понял, что у адаптера фиксированная скорость 9600, а у девайса, к которому требовалось подключиться, скорость 57600. Дело, естественно, было поздним вечером, и купить что-нибудь вроде FT232 возможности не было. Поэтому после непродолжительного раздумья, было решено изменить скорость UASRT в адаптере обычной перепрошивкой. В итоге соединение было успешно налажено. Но согласитесь - это ведь не выход, программатора может под рукой не оказаться, да и неудобно каждый раз с прошивкой шаманить. В следствие этого я серьезно задумался о создании нормального адаптера, с регулируемой скоростью (и не только).
Конечно, самый простой вариант – купить FT232, но сравнив ее стоимость со стоимостью Mega8, я пришел к выводу, что этот вариант мне не подходит. Поэтому было решено сделать адаптер на МК. А раз он на МК, то делать только USART как-то не рационально. Поэтому неплохо было бы в этот адаптер засунуть еще несколько интерфейсов, если уж делать, то что-то универсальное и полезное. Почти сразу в памяти всплыли “приятные” воспоминания об установке драйверов для адаптера на Tiny2313 (для Windows7 x64 это довольно мучительно). А это значит, что от устройства “виртуальный COM” придется отказаться, следовательно, надо будет написать программу для ПК, иначе работа с устройством будет невозможна. В общем, после обдумывания в течение некоторого времени, сформировалась окончательная идея девайса. Функционал получился вот таким:
- адаптер USB->USART;
- адаптер USB->SPI;
- адаптер USB->I 2 C;
- при этом устройство должно быть HID (Human Interface Device), чтобы не морочить голову с установкой драйверов.
Объектом издевательств стал МК Mega8, т.к. в TQFP корпусе он занимает совсем мало места (намного меньше, чем AtTiny2313) и обладает целыми 8 Кб. памяти. Сначала планировалось сделать все интерфейсы программными, но после разводки платы пришлось отказаться от аппаратного I 2 C, т.к. на односторонней плате вывести его никак не получалось (в будущем все-таки надо будет решить этот вопрос, может отдельно вывести сбоку платы). Поэтому его функциональность несколько ограничена, но USART и SPI остались полнофункциональными. Для связи с ПК была применена библиотека V-USB.
Схема устройства получилась вот такой:
Как видно, ничего сложного в ней нет. МК питается напряжением 5 В., согласование уровней для USB выполнено при помощи делителей напряжения резистор 68 Ом. + стабилитрон 3.3 В.. Тактовая частота МК – 12 МГц. Это минимальная частота для работы с шиной USB. Так же в схеме присутствуют три светодиода для индикации режимов работы. Один из светодиодов показывает, какой режим работы включен, а два других индицируют прием/передачу данных. Никаких кнопок и переключателей в устройстве не предусмотрено, и все настройки выполняются программно, прямо с ПК. Да, на все выводы, используемые для работы интерфейсов включены резисторы на 68 Ом. для защиты МК от КЗ. Как уже было отмечено выше, устройство представляется ПК как HID и не требует установки драйверов. VID и PID были выбраны из предоставляемых V-USB: VID - 0x16c0, PID - 0x05df. В противном случае пришлось бы отдать кругленькую сумму за покупку индивидуального идентификатора для USB устройства. Но т.к. проект Open Source и некоммерческий, совершенно свободно можно использовать идентификаторы, предложенные V-USB.
Плата получилась вот такая:
А в спаянном виде:
Это был тестовый образец да еще и разведенный с ошибками. Я почему-то посчитал, что вывод CE выводить не стоит. Ну ничего, все уже исправлено и к статье приложена правильная плата.
Итак, со схемой все понятно, он простая до предела и паяется за один вечер. Но, как было сказано выше, получившееся устройство определяется ПК как HID, т.е. ОС подбирает под него драйвер из своей базы. Проще говоря, Windows думает, что работает с устройством ввода. Это делает возможным работу на любом ПК без мороки с драйверами. Но с этим связана одна небольшая проблема, ни одна из существующих программ для обмена данными через USART работать с этим устройством не будет. А значит нужна какая-то специальная программа для работы с модулем, иначе он никакой ценности из себя не представляет. Поэтому я открыл свой любимый C++ Builder (нынче его обозвали CodeGear RAD Studio, что в прочем не меняет смысла), версия 2007, и написал вот такую программу:
Ничего особо сложного в ней нет, для каждого интерфейса присутствует некоторое количество настроек. Да, одновременно несколько интерфейсов работать не могут, только по одному. Работает все это дело очень просто, при подключении устройства к ПК в окне программы активизируются кнопки, нажатие на которые запускает соответствующий интерфейс. Потом достаточно написать данные в поле ввода в определенном формате и нажать кнопку "Send". Для каждого интерфейса свой формат данных. Сейчас рассмотрим их более подробно:
USART: (прием данных идет все время, пока активен режим, так сказать, на автомате)
SPI:
- для отправки данных устройству формат строки такой: Адрес (кому передавать и в какую ячейку памяти) А (а) и Данные D (d). Например: aa3 dfa;
- для запроса данных с устройства: Адрес (от кого принимать и из какой ячейки памяти) и идентификатор чтения R (r). Например: aa3 r
I 2 C:
- для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d). Например аа2 m03 d15
- запрос данных выглядит вот так: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Адрес устройства (бит чтения в 1) А (а) Идентификатор чтения с количеством ячеек памяти для чтения R (r). Например: aa2 m03 aa3 r1
Для SPI в режиме Slave никаких команд не предусмотрено, просто сидим и ждем, пока нам что-нибудь пришлют. Для работы с девайсом подключаем его к ПК, ждем некоторое время, пока ОС не сообщит, что драйвера успешно найдены и установлены, запускаем программу и начинаем обмен данными. Все предельно просто, ведь простота и была одним из критериев при создании устройства.
Да, кстати, программа совместима со всеми версиями Windows, начиная с Windows XP и заканчивая Windows 8, и не требует для работы различной экзотики, типа NetFramework и т.п. Как, впрочем, и сам модуль.
Вот, собственно, и все, программа, плата и исходники прилагаются.
Фьюзы выставляются для работы от внешнего кварца с высокой частотой. Выглядят вот так:
На картинке LOW фьюзы в 1, когда не отмечены, и в 0, когда отмечены. HIGH фьюзы наоборот. В шестнадцатеричном виде это выглядит вот так: HIGH: D9, LOW: FF.
Ну и конечно же видео, т.к. лучше один раз увидеть, чем. (USART работает в режиме эхотест (Rx и Tx соединены), а SPI и I 2 C тестируются с микросхемой PCA2129T, статья о ней тут)
I 2 C – двухпроводной интерфейс, разработанный корпорацией Philips. В первоначальном техническом требовании к интерфейсу максимальная скорость передачи данных составляла 100 Кбит/с. Однако со временем появились стандарты на более скоростные режимы работы I 2 C. К одной шине I 2 C могут быть подключены устройства с различными скоростями доступа, так как скорость передачи данных определяется тактовым сигналом.
Протокол передачи данных разработан таким образом, чтобы гарантировать надежный прием передаваемых данных.
При передаче данных одно устройство является «Master», которое инициирует передачу данных и формирует сигналы синхронизации. Другое устройство «Slave» - начинает передачу только по команде, пришедшей от «Master».
В микроконтроллерах PIC16CXXX аппаратно реализован режим «Slave» устройства в модуле SSP. Режим «Master» реализуется программно.
Основные термины, используемые при описании работы с шиной I 2 C:
Передатчик – устройство, передающее данные по шине
Приемник – устройство, получающее данные с шины
«Master» - устройство, которое инициирует передачу и формирует тактовый сигнал
«Slave» - устройство, к которому обращается «Master»
Multi-«Master» - режим работы шины I 2 C с более чем одним «Master»
Арбитраж – процедура, гарантирующая, что только один «Master» управляет шиной
Синхронизация – процедура синхронизации тактового сигнала от двух или более устройств
Выходные каскады формирователей сигналов синхронизации (SCL) и данных (SDA) должны быть выполнены по схемам с открытым коллектором (стоком) для объединения нескольких выходов и через внешний резистор подключены к плюсу питания для того, чтобы на шине был уровень «1», когда ни одно устройство не формирует сигнал «0». Максимальная емкостная нагрузка ограничена емкостью 400 пФ.
Инициализация и завершение передачи данных
В то время, когда передача данных на шине отсутствует, сигналы SCL и SDA имеют высокий уровень за счет внешнего резистора.
Сигналы START и STOP формируются «Master» для определения начала и окончания передачи данных соответственно.
Сигнал START формируется переходом сигнала SDA из высокого уровня в низкий при высоком уровне сигнала SCL. Сигнал STOP определяется как переход SDA из низкого уровня в высокий при высоком уровне SCL. Таким образом, при передаче данных сигнал SDA может изменяться только при низком уровне сигнала SCL.
Адресация устройств на шине I 2 C
Для адресации устройств используется два формата адреса:
Простой 7-разрядный формат с битом чтения/записи R/W;
и 10-разрядный формат – в первом байте передается два старших бита адреса и бит записи/чтения, во втором байте передается младшая часть адреса.
Подтверждение приема
При передаче данных после каждого переданного байта приемник должен подтвердить получение байта сигналом ACK.
Если «Slave» не подтверждает получение байта адреса или данных, «Master» должен прервать передачу, сформировав сигнал STOP.
При передаче данных от «Slave» к «Master», «Master» формирует сигналы подтверждения приема данных ACK. Если «Master» не подтвердит приема байта, «Slave» прекращает передачу данных, «отпуская» линию SDA. После этого «Master» может сформировать сигнал STOP.
Для задержки передачи данных «Slave» может установить логический нуль, указывая «Master» о необходимости ожидания. После «отпускания» линии SCL передача данных продолжается.
Передача данных от «Master» к «Slave»
Чтение данных из «Slave»
Использование сигнала повторного START для обращения к «Slave»
Режим Multi-«Master»
Протокол передачи данных I 2 C позволяет иметь более одного «Master» на шине. Для разрешения конфликтов на шине при инициализации передачи используются функции арбитража и синхронизации.
Арбитраж
Арбитраж выполняется на линии SDA при высоком уровне линии SCL. Устройство, которое формирует на линии SDA высокий уровень когда другое передает низкий, теряет право брать «Master» и должно перейти в режим «Slave». «Master», потерявший инициативу на шине, может формировать тактовые импульсы до конца байта, в котором потерял свойства ведущего.
Синхронизация
Синхронизация на шине происходит после выполнения арбитража по отношению к сигналу SCL. При переходе сигнала SCL с высокого уровня в низкий, все заинтересованные устройства начинают отсчитывать длительность низкого уровня. Затем устройства начинают переводить уровень SCL из низкого в высокий согласно требуемой скорости передачи данных. После перехода уровня из низкого в высокое состояние, заинтересованные устройства отсчитывают длительность высокого уровня. Первое устройство, которое переведет сигнал SCL в низкий уровень, определяет параметры тактового сигнала.
none Опубликована: 2005 г. 0 0
Вознаградить Я собрал 0 0
Читайте также: