Сергей КОРЮКИН
sergey.koryukin@eltech.ur.ru
При работе с шиной I2C микроконтроллер (МК)будет выступать в роли «ведущего» (I2C-Master). В качестве «ведомого» (I2C-Slave) рассматривается цифровой датчик ADT75 фирмы Analog Devices. Это 12-разрядный датчик температуры с рабочим диапазоном температур от -55 до +125 °С, погрешностью измерения ±2 °С и интерфейсом I2C. Одновременно к шине I2C может быть подключено до 8 подобных датчиков (всего в сети I2C допускается до 128 устройств).
Для создания прототипа преобразователя использовался демонстрационный набор от NEC «Low Pin Count — Do it!» [2] с установленным микроконтроллером uPD78F9222 (рис. 1). Демонстрационная плата подключается к компьютеру через USB-интерфейс, при этом на хост-компьютере создается виртуальный COM-порт, через который происходит как программирование МК, так и обмен данными между МК и хост-компьютером.
В состав набора входит несколько демонстрационных программ, позволяющих ближе познакомиться с МК данного семейства. Программирование МК осуществляется при помощи входящей в состав комплекта утилиты.
Рис. 1. Набор «Low Pin Count — Do it!»
Преобразователь интерфейса I2C <-> UART
на основе микроконтроллера UPD78F9222 (NEC)
Нередко возникает необходимость в различных преобразователях интерфейсов. В данной статье хотелось бы рассмотреть реализацию преобразователя последовательного интерфейса I2C в UART. В качестве преобразователя будет использоваться недорогой микроконтроллер фирмы NEC — pPD78F9222, принадлежащий к семейству 78K0S/KA1+ [1]. Микроконтроллер имеет Flash объемом 4 кбайт, 2 кбайт ОЗУ, встроенный интерфейс UART, программируемый супервизор питания, встроенный узел сброса, 8- и 16-разрядные таймеры, встроенные тактовые генераторы: один для ядра, другой для сторожевого таймера, систему прерываний и прочее. Весьма привлекательна и малая стоимость устройства. Однако интерфейс I2C необходимо эмулировать программно.
ЕС
®@®@@© оооооо 0000005 oooooog оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо оооо ©® ©®
CN6 CNS
оо< оо оо & оо I оо» оо“ оо ®
OOJ О Од
ооЗ
005
оо§
ООо
оо»
ооа
CN4
____у
Рис. 2. Схема соединений
Среди представленных демонстрационных программ есть ADC Demo, на ее примере обеспечивается интерактивное управление оценочным комплектом через гипертерминал
персонального компьютера. Эта программа была взята за основу программной эмуляции интерфейса РС-ИЛЯТ. Рассмотрим подробно варианты решения данной задачи.
/fcxjtx
Start Address R/W АСК Data АСК Data АСК Stop
condition condition
Рис. 3. Временная диаграмма обмена данными интерфейса I2C
н
PMC.2,1 = 00; P22 and P21 in port mode PM2.2,1 = 11; P22 and P21 inputs P2.2.1 = 00; clear P22 and P21 latches
E
"T"
Return
H
Delay for 5 microseconds
i
Delay for 5 microseconds
PM2.1 = 0 to set P21 as output P21 output latch is 0, drives SCL LOW
i
PM2.1 = 1 to set P21 as input, stops drive external resistor pulls SCL HIGH
Delay for 5 microseconds
Delay for 5 microseconds
Return
Return
И
0
PM2.2 = 1 to set P22 as input, stops drive external resistor pulls SDA HIGH
i
CALL iic_SCL_0() to set SCL LOW
CALL ¡¡c_SCL__1() to set SCL HIGH
I
I
PM2.2 = 0 to set P22 as output P22 output latch is 0, drives SDA LOW
PM2.2 = 0 to set P22 as output P22 output latch is 0, drives SDA LOW
”T~
Return
CALL iic_SCL__1() to set SCL HIGH
I
PM2.2 = 1 to set P22 as input, stops drive external resistor pulls SDA HIGH
~r
Return
Рис. 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
На рис. 2 приведена схема подключения Контактные площадки 34 и 36 макетного роконтроллера ІС3 и являются портами Р22 датчика к плате оценочного комплекта. поля СЫ3 подключены квыводам 17 и 18 мик- и Р21 соответственно. Порт Р22 отвечает за
Рис. 5. Блок-схема программы
сигнал SDA, а P21 — за SCL шины I2C. Временная диаграмма обмена данными через интерфейс I2C изображена на рис. 3.
Для обеспечения работы интерфейса 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 представлены блок-схемы этих процедур с кратким описанием.
Задержки длительностью 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-го байта из хост-компьютера. Далее идет анализ принятого байта и, в зави-
симости от принятого символа, следует переход к записи информации в Slave (WR, если принят символ W или w) или к чтению байта из Slave (RD, если принят символ R или г). Если же ни одно условие не выполняется, следует переход на процедуру передачи хосту сообщения об ошибке — Error.
При записи байта в Slave требуются дополнительные данные от компьютера: адрес устройства (Addr) и непосредственно данные (Data). Эти данные считываются процедурой rdUART2(), которая также преобразует принятые 2 символа в десятичный формат. Затем управление передается процедуре выдачи данных на шину I2C — iic_dkwr(Addr, Data). Формат данных, передаваемых из компьютера, должен быть в виде Waadd, где W — команда записи, аа — адрес устройства умноженный на 2 в шестнадцатеричном представлении (например: 4Ah = 74 = 37x2, где 37 — десятичный адрес устройства), dd — сами данные для записи в шестнадцатиричном виде (например: A8h = 168). Пример команды — w4AA8. Если при выполнении команды записи происходит ошибка, то в компьютер передается соответствующее сообщение, иначе передается сообщение Ok.
При чтении байта из Slave требуется только адрес устройства, представленный в том же виде, что и в команде записи. Форма команды имеет вид: Raa, где R — команда на чтение, aa — адрес устройства. Если все параметры заданы верно, то в UART передается сообщение DATA=, считанный из устройства байт данных и сообщение Ok. Если же возникли ошибки, то передается сообщение Error.
После окончания процедуры записи или считывания, а также если были ошибки, МК переходит в режим ожидания приема байта команды.
Несколько слов об используемых процедурах:
Рис. 6. Бесплатная среда настройки периферии МК NEC
Рис. 7. Настройка UART в Applilet
• ЫИЛИТО — прием одного байта данных из ИЛИТ;
• ЫИЛКТ2() — прием двух байтов из ИЛИТ и преобразование их в десятичный формат;
• 'гИЛЯТ() — передача сообщений в ИЛИТ. Для облегчения настройки периферии микроконтроллеров ЫЕС у разработчика есть возможность использовать бесплатную среду ЛррШе1 (рис. 6).
Эта среда позволяет за считанные минуты сформировать исходный код, необходимый для инициализации периферийных устройств используемого МК, на языке С или ассемблера. Все действия сводятся к установке нужных галочек и ввода необходимых параметров. На рис. 7 и 8 приведен пример настройки ИЛИТ и портов Р21, Р22, используемых в настоящем проекте для формирования сигналов интерфейса РС.
Входящий в оценочный комплект софт от 1ЛИ включает:
• менеджер проектов (интегрированная среда разработки);
• ассемблер;
• Си-компилятор;
• симулятор.
Этот софт позволяет создавать полноценные программные проекты для микроконтроллеров uPD78F9222. После того как про-
Рис. В. Настройка портов P21 и P22
грамма откомпилирована и загружена в МК оценочного комплекта, можно запустить стандартную программу НурегТегшіпаі, входящую в ОС Windows, настроить ее на работу с виртуальным СОМ-портом, выставить параметры связи — такие же, как и в настройках ИЛИТ-микроконтроллера. Теперь хост-компьютер играет роль терминала для оценочного комплекта.
После сброса МК на терминале должна появиться надпись: І2С <-> ИЛИТ. Можно начинать процедуры обмена данными. Нарис. 9 приведен пример считывания текущей температуры из ЛБТ75. Посылаем команду W9000 — адрес устройства 48Ь (умножаем на 2, получаем 90Ь, см. Ба1а8Ьее1 на ЛБТ75 [3]) и адрес регистра температуры 00. После получения подтверждения выполнения команды Ок, посылаем команду считывания из устройства 90 — И90. Получаем содержимое регистра температуры, в нашем случае оно равно 19Ь, что соответствует 25 °С (судя по описанию на ЛБТ75).
Конечно, программу можно доработать и посылать в компьютер уже вычисленное значение температуры. Причем можно немного усложнить и считывать 2 и более байта данных с шины І2С. Так как м/с датчика температуры имеет разрядность 12 бит, мы считываем только старшие 8, но это уже тема для другой статьи.
Рис. 9. Пример обмена данными
В завершение хочется напомнить, что отладочным комплектом «Low Pin Count — Do it!» можно воспользоваться как программатором. Достаточно вывести линии X1_cpld, X2_cpld, RES_N, VCC_uPD и GND с платы на отдельный разъем и подключать его к собственной разработке.
Один из вариантов схемы готового устройства приведен на рис. 10. «Лишние» узлы можно смело выкидывать (за исключением МК). Исходные коды полученного проекта можно найти на сайте [4]. ■
Литература
1. ww w.eltech.spb.r u/pdf/nec/234/nec_234.pdf
2. w ww.eltech.spb.r u/techinfo.ht ml?aid=243
3. w ww.analog.c om/en/prod/0,2877,ADT75,00.ht ml
4. w ww.eltech.spb.r u/addons/NEC_I2C-UART.rar
5. w ww.semtech.c om/products/ product-detail.jsp?navId=H0,C157,C159,P1471
+5 В
Í SCL
l2C<
GND
SFC2280-10
,37, ,37,
■A 'A
'A 'A
ESD
защита
AM 1...2 +5 В +5 В DC/DC 1-2 Вт
4,7к 4,7к
ADuM 1250
SCL
SDA
rDD1 i DD2
GND ;GND2
SCL
2,5 кВ изоляция
SDA 17
1
MPD78F9222/2
18
VDD
Р21
TxD
MC
Р22 RxD
GND
12
Tx
13
Rx
ADuM5241
'DD1 i DD2
GND, : GND-
2,5 кВ изоляция
ADM101E
10
GND
6 Rx
I COM f P°rt
GND
±15 кВ ESD защита
Рис. 10. Пример реализации преобразователя !2С <-> UART