Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2006 №10

Преобразователь интерфейса I2С <–> UART на основе микроконтроллера UPD78F9222 компании NEC

Корюкин Сергей


Нередко возникает необходимость в различных преобразователях интерфейсов. В данной статье хотелось бы рассмотреть реализацию преобразователя последовательного интерфейса I 2C в UART. В качестве преобразователя будет использоваться недорогой микроконтроллер фирмы NEC — µPD78F9222, принадлежащий к семейству 78K0S/KA1+ [1]. Микроконтроллер имеет Flash объемом 4 кбайт, 2 кбайт ОЗУ, встроенный интерфейс UART, программируемый супервизор питания, встроенный узел сброса, 8- и 16-разрядные таймеры, встроенные тактовые генераторы: один для ядра, другой для сторожевого таймера, систему прерываний и прочее. Весьма привлекательна и малая стоимость устройства. Однако интерфейс I 2C необходимо эмулировать программно.

При работе с шиной I 2C микроконтроллер (МК)будет выступать в роли «ведущего» (I 2C-Master). В качестве «ведомого» (I 2C-Slave) рассматривается цифровой датчик ADT75 фирмы Analog Devices. Это 12-разрядный датчик температуры с рабочим диапазоном температур от –55 до +125 °С, погрешностью измерения ±2 °С и интерфейсом I 2C. Одновременно к шине I 2C может быть подключено до 8 подобных датчиков (всего в сети I 2C допускается до 128 устройств).

Для создания прототипа преобразователя использовался демонстрационный набор от NEC «Low Pin Count — Do it!» [2] с установленным микроконтроллером uPD78F9222 (рис. 1). Демонстрационная плата подключается к компьютеру через USB-интерфейс, при этом на хост-компьютере создается виртуальный COM-порт, через который происходит как программирование МК, так и обмен данными между МК и хост-компьютером.

Рис. 1. Набор «Low Pin Count — Do it!»
Рис. 1. Набор «Low Pin Count — Do it!»

В состав набора входит несколько демонстрационных программ, позволяющих ближе познакомиться с МК данного семейства. Программирование МК осуществляется при помощи входящей в состав комплекта утилиты. Среди представленных демонстрационных программ есть ADC Demo, на ее примере обеспечивается интерактивное управление оценочным комплектом через гипертерминал персонального компьютера. Эта программа была взята за основу программной эмуляции интерфейса I 2C-UART. Рассмотрим подробно варианты решения данной задачи.

Рис. 2. Схема соединений
Рис. 2. Схема соединений

На рис. 2 приведена схема подключения датчика к плате оценочного комплекта. Контактные площадки 34 и 36 макетного поля CN3 подключены к выводам 17 и 18 микроконтроллера IC3 и являются портами P22 и P21 соответственно. Порт P22 отвечает за сигнал SDA, а P21 — за SCL шины I2C. Временная диаграмма обмена данными через интерфейс I2C изображена на рис. 3.

Рис. 3. Временная диаграмма обмена данными интерфейса I2C
Рис. 3. Временная диаграмма обмена данными интерфейса I2C

Для обеспечения работы интерфейса I2C необходимы следующие процедуры:

  • Процедуры нижнего уровня:
    • iic_init() — инициализация портов;
    • iic_SCL_0() — сброс SCL в «0»;
    • iic_SCL_1() — установка SCL в «1»;
    • iic_istart() — формирование сигнала Start condition (начало передачи);
    • iic_istop() — формирование сигнала Stop condition (конец передачи).
  • Процедуры верхнего уровня:
    • iic_dkwr(addr, data) — запись байта в Slave (ADT75);
    • iic_isend(val) — поразрядная передача байта в порт P22;
    • iic_dkrd(addr, *pnack) — чтение байта из Slave (ADT75);
    • iic_irecv() — поразрядное чтение байта из порта P22.

На рис. 4 представлены блок-схемы этих процедур с кратким описанием.

Рис. 4. Блок-схемы процедур
а) iic_init() — инициализация портов;
б) iic_SCL_0()' сброс SCL в «0»;
в) iic_SCL_1() — установка SCL в «1»;
г) iic_istart() — формирование сигнала Start condition (начало передачи);
д) iic_istop() — формирование сигнала Stop condition (конец передачи);
е) iic_dkwr(addr, data) — запись байта в Slave;
ж) iic_dkrd(addr, *pnack) — чтение байта из Slave;
з) iic_isend(val) — поразрядная передача байта в порт P22;
и) iic_irecv() — поразрядное чтение байта из порта P22

Задержки длительностью 5 мкс в процедурах iic_SCL_0() и iic_SCL_1() необходимы для организации скорости обмена в 100 кбит/с.

В процедурах iic_dkwr(addr, data) и iic_dkrd(addr, *pnack) addr — адрес внешнего устройства на шине I2C (значение от 0 до 127, сдвинутое на 1 бит влево), data — данные.

В процедуре чтения iic_dkrd(addr, *pnack) при вызове процедуры iic_isend(val) младший бит addr устанавливается в «1», указывая на то, что происходит чтение из устройства.

Основной цикл программы представлен на диаграмме рис. 5. Изначально выполняются процедуры инициализации МК. Затем программа зацикливается, ожидая прерывания от интерфейса UART, которое поступает при приеме 1-го байта из хост-компьютера.

Рис. 5. Блок-схема программы
Рис. 5. Блок-схема программы

Далее идет анализ принятого байта и, в зависимости от принятого символа, следует переход к записи информации в Slave (WR, если принят символ W или w) или к чтению байта из Slave (RD, если принят символ R или r). Если же ни одно условие не выполняется, следует переход на процедуру передачи хосту сообщения об ошибке— Error.

При записи байта в Slave требуются дополнительные данные от компьютера: адрес устройства (Addr) и непосредственно данные (Data). Эти данные считываются процедурой rdUART2(), которая также преобразует принятые 2 символа в десятичный формат. Затем управление передается процедуре выдачи данных на шину I2C — iic_dkwr(Addr, Data). Формат данных, передаваемых из компьютера, должен быть в виде Waadd, где W — команда записи, аа — адрес устройства умноженный на 2 в шестнадцатеричном представлении (например: 4Ah = 74 = 37H2, где 37 — десятичный адрес устройства), dd — сами данные для записи в шестнадцатиричном виде (например: A8h = 168). Пример команды—w4AA8. Если при выполнении команды записи происходит ошибка, то в компьютер передается соответствующее сообщение, иначе передается сообщение Ok.

При чтении байта из Slave требуется только адрес устройства, представленный в том же виде, что и в команде записи. Форма команды имеет вид: Raa, где R — команда на чтение, aa — адрес устройства. Если все параметры заданы верно, то в UART передается сообщение DATA=, считанный из устройства байт данных и сообщение Ok. Если же возникли ошибки, то передается сообщение Error.

После окончания процедуры записи или считывания, а также если были ошибки, МК переходит в режим ожидания приема байта команды.

Несколько слов об используемых процедурах:

  • rdUART() — прием одного байта данных из UART;
  • rdUART2() — прием двух байтов из UART и преобразование их в десятичный формат;
  • wrUART()— передача сообщений в UART.

Для облегчения настройки периферии микроконтроллеров NEC у разработчика есть возможность использовать бесплатную среду Applilet (рис. 6).

Рис. 6. Бесплатная среда настройки периферии МК NEC
Рис. 6. Бесплатная среда настройки периферии МК NEC

Эта среда позволяет за считанные минуты сформировать исходный код, необходимый для инициализации периферийных устройств используемого МК, на языке C или ассемблера. Все действия сводятся к установке нужных галочек и ввода необходимых параметров. На рис. 7 и 8 приведен пример настройки UART и портов P21, P22, используемых в настоящем проекте для формирования сигналов интерфейса I2C.

Рис. 7. Настройка UART в Applilet
Рис. 7. Настройка UART в Applilet
Рис. 8. Настройка портов P21 и P22
Рис. 8. Настройка портов P21 и P22

Входящий в оценочный комплект софт от IAR включает:

  • менеджер проектов (интегрированная среда разработки);
  • ассемблер;
  • Си-компилятор;
  • симулятор.

Этот софт позволяет создавать полноценные программные проекты для микроконтроллеров uPD78F9222. После того как программа откомпилирована и загружена в МК оценочного комплекта, можно запустить стандартную программу HyperTerminal, входящую в ОС Windows, настроить ее на работу с виртуальным COM-портом, выставить параметры связи — такие же, как и в настройках UART-микроконтроллера. Теперь хост-компьютер играет роль терминала для оценочного комплекта.

После сброса МК на терминале должна появиться надпись: I2C <-> UART. Можно начинать процедуры обмена данными. На рис. 9 приведен пример считывания текущей температуры из ADT75. Посылаем команду W9000 — адрес устройства 48h (умножаем на 2, получаем 90h, см. DataSheet на ADT75 [3]) и адрес регистра температуры 00. После получения подтверждения выполнения команды Ok, посылаем команду считывания из устройства 90 — R90. Получаем содержимое регистра температуры, в нашем случае оно равно 19h, что соответствует 25 °С (судя по описанию на ADT75).

Рис. 9. Пример обмена данными
Рис. 9. Пример обмена данными

Конечно, программу можно доработать и посылать в компьютер уже вычисленное значение температуры. Причем можно немного усложнить и считывать 2 и более байта данных с шины I2C. Так как м/с датчика температуры имеет разрядность 12 бит, мы считываем только старшие 8, но это уже тема для другой статьи.

В завершение хочется напомнить, что отладочным комплектом «Low Pin Count — Do it!» можно воспользоваться как программатором. Достаточно вывести линии X1_cpld, X2_cpld, RES_N, VCC_uPD и GND с платы на отдельный разъем и подключать его к собственной разработке.

Один из вариантов схемы готового устройства приведен на рис. 10. «Лишние» узлы можно смело выкидывать (за исключением МК). Исходные коды полученного проекта можно найти на сайте [4].

Пример реализации преобразователя I2C <-> UART
Рис. 10. Пример реализации преобразователя I2C <-> UART

Литература

  1. www.eltech.spb.ru/pdf/nec/234/nec_234.pdf
  2. www.eltech.spb.ru/techinfo.html?aid=243
  3. www.analog.com/en/prod/0,2877,ADT75,00.html
  4. www.eltech.spb.ru/addons/NEC_I2C-UART.rar
  5. www.semtech.com/products/product-detail.jsp?navId=H0,C157,C159,P1471

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке