ОБМЕН ДАННЫМИ ПО ИНТЕРФЕЙСУ I2C (TWI) на МК AVR

March 15, 2011 by admin Комментировать »

Цель работы – изучение приема и передачи информации по последовательному каналу I2C (Integrated Circuit) и программирование ввода;вывода.

Двухпроводный последовательный интерфейс I2C и подобные ему (Two-wire Serial Interface, TWI) обеспечивают взаимодействие МК с множеством микросхем (энергонезависимой памятью, контроллерами параллельных портов, LCD-дисплеями, микроконтроллерами и различными специализированными устройствами).

Рис. 5.11. Схема соединения устройств по интерфейсу I2C

Данный интерфейс позволяет объединить до 128 устройств по схеме, приведенной на рис. 5.11.

Интерфейс представляет собой две линии: одна (SDA) используется для передачи данных, другая (SCL) – для тактовых сигналов. Через резисторы R1, R2 обе линии подключены к источнику питания VCC. Выходы устройств выполнены по схеме с открытым коллектором (стоком), что позволяет реализовать функцию «монтажное И» для выходных сигналов. Низкий уровень сигнала логического О на выходе любого из устройств устанавливает низкий уровень на всей линии. Высокий уровень на линии устанавливается, когда выводы всех устройств находятся в третьем (высокоим- педансном) состоянии.

Устройство, подключенное к шине, может иметь статус ведущего (master) или ведомого (slave). Статус микроконтроллера устанавливается программно.

Протоколом работы шины предусмотрены:

•          посылка ведущим устройством стартового бита начала обмена;

•          передача последовательности из семи разрядов адреса ведомого устройства;

•          транзакция чтения или записи 8-битовых данных;

•           получение ведущим устройством битов подтверждения передачи адреса и данных;

•      формирование бита подтверждения после приема данных;

•      посылка ведущим устройством стопового бита.

Шина I2C (TWI) является последовательной: все данные и адреса передаются по линии SDA поразрядно. Каждый передаваемый бит сопровождается тактовым сигналом на линии SCL. В течение всего времени действия сигнала SCL (SCL = 1) состояние линии SDA должно оставаться неизменным. Изменение данных на линии SDA происходит при отсутствии тактового сигнала на линии SCL (SCL = 0). Исключение составляют стартовый и стоповый

Рис. 5.12. Временные диаграммы сигналов интерфейса I2C

биты, определяющие начало и конец обмена. Стартовый бит формируется путем изменения уровня сигнала на линии SDA с 1 на О при SCL = 1, стоповый бит – при изменении сигнала SDA с О на 1 также при SCL = 1. Диаграмма изменения состояний линий интерфейса приведена на рис. 5.12.

Кроме названных особых случаев на диаграмме представлен бит повторного старта, который можно сформировать сразу после передачи байта данных. Это позволяет ведущему устройству организовать передачу нового байта данных сразу без потери контроля над шиной.

Протокол обмена по шине предполагает передачу двух типов кадров (пакетов): с адресом и данными (рис. 5.13).

Кадр 7-разрядного адреса содержит:

S – стартовый бит;

А – 7-разрядный адрес ведомого устройства, передаваемый ведущим, начиная со старшего разряда;

R;W – управляющий бит, определяющий тип транзакции на шине (R;W = О – запись, R;W = 1 – чтение);

АСК – бит подтверждения.

Адрес, передаваемый ведущим устройством после захвата шины, поступает ко всем устройствам, подключенным к ней. Каждое из устройств сравнивает поступающий адрес с собственным. При распознавании ведомым устройством своего адреса оно возвращает на линию SDA сигнал подтверждения АСК низкого уровня во время 9-го тактового сигнала SCL. Если по каким-либо причинам ведомое устройство не способно обслужить запрос ведущего, оно удерживает на линии SDA сигнал высокого уровня. Нулевой адрес используется для общего вызова всех устройств. Управляющий бит в этом случае устанавливается в О, чтобы обеспечить передачу одного и того же сообщения всем устройствам.

После передачи адреса начинается передача данных. Кадр байта данных (рис. 5.13, ^ содержит восемь битов данных и один бит

Рис. 5.13. Формат кадра адреса {а) и кадра данных (б)

подтверждения, формируемый приемником. Данные, так же как и адрес, передаются последовательно бит за битом, начиная со старшего разряда. После приема каждого байта данных приемник вырабатывает сигнал подтверждения АСК путем выдачи на линию SDA сигнала низкого уровня. Высокий уровень сигнала свидетельствует об ошибке или невозможности продолжить прием. Не получив подтверждения от приемника, ведущий может прекратить передачу данных, сформировав сигналы состояния Stop.

После завершения передачи байта данных работа может быть продолжена либо для передачи следующего байта в том же направлении без изменения ведомого, либо выбором нового ведомого и(или) сменой направления обмена. При завершении обмена шина освобождается ведущим устройством.

В микроконтроллерах AVR реализация протокола обмена может быть осуществлена двумя способами: программно или про- граммно-аппаратно. Программный способ реализуется с использованием библиотеки функций для формирования протоколов обмена. Этот способ применяется в микроконтроллерах, в которых отсутствуют встроенные аппаратные средства, реализующие протокол обмена. К ним относят микроконтроллеры семейств ATtiny и АТ90. Микроконтроллеры семейства ATmega (модели 8х, 16х, 32х, 323х, 64х, 128х, 163х) имеют в своем составе модуль обмена по интерфейсу TWI, что упрощает программирование ввода;вывода. Рассмотрим подробнее оба способа.

Программная реализация протокола I2C

Программная реализация протоколов I2C для разных случаев взаимодействия устройств представляет собой набор программ, эмулирующих работу ведущего и ведомых устройств с учетом функциональных требований. Наиболее сложным является случай, когда в качестве ведущего и ведомых выступают микроконтроллеры, которые могут быть как передатчиками, так и приемниками при обмене данными и не имеют встроенных средств обмена по I2C. Более простым считается случай, когда одно из устройств (микроконтроллер) является ведущим, а ведомые устройства содержат встроенный порт для обмена по I2C. Такие устройства (датчики, устройства памяти, часы реального времени и др.) широко выпускаются различными фирмами-производителями электронных компонентов и могут быть подключены к микроконтроллеру достаточно просто.

Решая общую задачу организации взаимодействия микроконтроллера с периферийными устройствами, рассмотрим необходимые механизмы программной реализации I2C. Это предполагает программную эмуляцию I2C, существенно упрощающую работу только со стороны ведущего микроконтроллера. Алгоритмы основных транзакций шины, записи и чтения, которые использованы при программировании, представлены на рис. 5.14, 5.15.

Процедура транзакции записи (передача адресного байта и запись байта данных) начинается с захвата линии SDA (SDA = 0) – формирования стартового бита – и установки флага С = 1, косвенно используемого для выявления признака окончания цикла передачи. Путем циклического сдвига влево байта данных первый передаваемый бит вытесняет 1 из флага С в младший разряд регистра данных. Это исключает возможность преждевременного выхода из цикла, когда в регистре данных во время передачи байта остаются нулевые биты. Линия SCL переводится в 0. Значение бита С используется для управления состоянием линии SDA. Если передаваемый бит, установленный в С, равен 1, линия SDA принимает значение SDA = 1, в противном случае SDA = 0. Далее спустя время задержки устанавливается линия SCL в 1 и после проверки, если ведомое устройство не тормозит работу на линии SCL, выполняется циклический переход для вывода следующего бита данных. На последующих итерациях цикла выполняется логический сдвиг. После выявления признака конца передачи, когда все биты регистра данных равны О, выполняется переход к процедуре проверки бита подтверждения.

Рис. 5.14. Схема алгоритма записи байта данных

Получение бита подтверждения АСК начинается с захвата линии SCL (SCL = 0) и освобождения ведущим линии SDA (SDA = = 1). После временной паузы линия SCL переключается в состояние 1 и, если она свободна от влияния ведомых устройств, значение SDA считывается в качестве сигнала подтверждения АСК (установка или сброс бита С). После паузы на линии SCL устанавливается 0.

Рис. 5.15. Схема алгоритма чтения байта данных

Процедура транзакции чтения (прием данных от ведомого) начинается с установки признака конца приема (1) в младший разряд регистра данных. Цикл чтения битов данных начинается с захвата линии SCL (SCL = 0), установки 1 на линии SCL, подтверждения высокого уровня сигнала SCL = 1 и последующего ввода бита данных в регистр данных путем опроса линии SDA и сдвига содержимого регистра данных. После очередной паузы выполняется проверка признака конца приема байта данных по значению флага С. Если не все биты получены (С = 0), прием продолжается. Если приняты все биты (С = 1), ведущее устройство переходит к формированию бита подтверждения приема АСК для ведомого устройства. При необходимости формирования бита АСК линия SDA устанавливается в О, линия SCL переводится в состояние 1. После подтверждения SCL = 1 и паузы линия SCL вновь возвращается в состояние 0. На этом чтение байта данных заканчивается.

Процедуры формирования стартового бита, стопового и повторного старта сводятся к установке исходных состояний сигналов

SDA = SCL = 1 и последующих изменений согласно приведенным выше временным диаграммам. Используемые задержки времени (паузы) необходимы для обеспечения надежной передачи. Их устанавливают, согласно рекомендациям, на период и длительность сигнала SCL; время удержания неактивного состояния линий интерфейса; время, предшествующее повторному старту, и др.

Практическая часть

Работу интерфейса I2C рассмотрим на примере обмена данными между микроконтроллером AT90S8515 и программируемым параллельным портом (ППП) РСА9554 фирмы Philips. Схема сопряжения микроконтроллера МК и параллельного порта ППП приведена на рис. 5.16.

Рис. 5.16. Схема связи микроконтроллера с параллельным портом по интерфейсу I2C

Порт представляет собой микросхему, имеющую канал последовательной связи I2C, с одной стороны, и 8-разрядный параллельный канал ввода;вывода, с другой стороны. Разряды параллельного порта могут быть запрограммированы на ввод или вывод с помощью 8-разрядного управляющего слова, пересылаемого в регистр управления (конфигурации) порта. Для обращения к ППП в микроконтроллерной системе используется один из восьми адресов в диапазоне $40-$47. При этом три младших разряда определяют путем установки сигналов логического О и логической 1 на входах А2-А0. Для обращения к внутренним регистрам порта используется командный байт, значение которого определяет регистр и выполняемую операцию: О – чтение данных с входного регистра порта, 1 – запись данных в выходной регистр порта, 2 – изменение полярности сигналов, 3 – запись в регистр конфигурации (направления передачи). Обращение к порту содержит три посылки: первая служит для передачи адреса, вторая – команды, третья – данных. Обмен с портом выполняется по запросу прерывания, формируемому микросхемой ППП при изменении сигналов на входах порта. Для этого выход INT ППП подключен к входу INTO микроконтроллера (для AT90S8515 линия порта PD2).

Задание 1. Подготовить программу для исследования передачи и приема данных по последовательному каналу I2C, используя в качестве ведомого программируемый параллельный порт. Алгоритмом основной программы предусмотрена такая последовательность действий:

•     инициализация порта микроконтроллера с линиями интерфейса;

•     настройка системы прерываний микроконтроллера;

•     временная пауза;

•     настройка конфигурации ППП;

•     вызов процедуры обмена с ППП;

•     перевод микроконтроллера в режим пониженного энергопотребления и ожидания прерываний от ППП.

При поступлении запроса выполняются следующие действия:

•     инициализация обмена с ППП;

•     формирование состояния Start и посылка адреса;

•     запись в ППП команды ввода ($00);

•     изменение направления обмена;

•     повторный старт;

•     чтение данных из ППП;

•     обмен тетрадами;

•     сохранение данных;

•     формирование состояния Stop;

•     формирование состояния Start и посылка адреса;

•     запись команды вывода ($01);

•     обратная пересылка данных в ППП;

•     формирование состояния Stop и выход из прерывания.

Далее приведен текст программы на языке Ассемблер для обмена с ППП с включенными процедурами обмена ведущего микроконтроллера по интерфейсу I2C. При программировании протокола I2C ведущего микроконтроллера за основу взята бета-версия 1.0 программы из библиотеки AVR Studio. В программе используются две библиотечные функции задержки: i2c_hp_delay минимум на 5 мкс и i2c_qp_delay минимум на 2,5 мкс.

Программа 5.5

;Тестовая программа 5.5 для работы с программируемым ;параллельным портом по интерфейсу I2C. Для ввода и вывода ;данных используются по четыре вывода порта. При изменении ;сигналов на входах порта на линии INTO вырабатывается ;запрос прерывания низкого уровня. По прерыванию происходит ;запись входных значений порта ППП и их передача на линии ;вывода.

.org 0x000

rjmp RESET             ;обработка сброса

.org 0x001

rjmp UPDATE            ;обработчик прерывания от ППП

.include "8515def.inc"    ;файл определений AT90S8515

.equ SCLP = б             ; SCL-pin (PD6)

.equ SDAP = 7             ; SDA-pin (PD7)

.def i2cdelay = rl6       ;счетчик цикла задержки

.def i2cadr = rl7         ;регистр адреса шины I2C

.def i2cdata = rl8        ;регистр данных шины I2C

.equ i2crd = 1            ;1-чтение

.equ i2cwr = 0            ;0-запись

RESET: main:

Idi rl6,HIGH(RAMEND) ;установка out sph,rl6    ; указателя

Idi rl6,L0W(RAMEND) ; стека out spl,rl6 ; Инициализация интерфейса I2C

clr i2cdata            ;очистка регистра данных

out DDRD,i2cdata Idi i2cdata,0x04 out PORTD,i2cdata ; Настройки микроконтроллера cli

Idi rl6,l«INT0         ;разрешение прерывания INTO

;(no спаду)

out GIMSK,rl6

Idi rl6, (1«SE) I (0«ISC01) I (O«ISC0O)

out MCUCR,rl6

sei

rcall i2c_hp_delay ;пауза в ожидании

rcall i2c_hp_delay ; готовности всех устройств.

;rcall i2c_hp_delay ; подключенных к шине

; Настройка конфигурации микросхемы ППП

Idi i2cadr,$40+i2cwr ;посылка адреса ППП+записи rcall i2c_start    ;генерация стартового бита

Idi i2cdata,$03

rcall i2c_write ;команда записи в порт конфигурации Idi i2cdata,$f0 ;старшие 4 бита – на ввод, rcall i2c_write ;младшие 4 бита – на вывод rcall i2c_stop         ;генерация стопового бита

rcall UPDATE           ;ввод;вывод через ППП

loop: sleep ;переход в режим пониженного энергопотреблени пор

rjmp loop

; Подпрограмма обработки прерывания от ППП UPDATE:

Idi i2cadr,$40+i2cwr ;посылка адреса ППП+записи rcall i2c_start Idi i2cdata,$00

rcall i2c_write ;команда чтения данных из порта Idi i2cadr,$40+i2crd ;изменение направления обмена rcall i2c_rep_start

set                       ;подтверждения после чтения

;не будет

rcall i2c_read            ;чтение данных

swap i2cdata              ;обмен тетрадами

mov r20,i2cdata           ;сохранение

rcall i2c_stop            ;генерация стопового бита

clt                       ;сброс флага Т

Idi i2cadr,$40+i2cwr ;изменение направления обмена

rcall i2c_start

Idi i2cdata,$01

rcall i2c_write           ;команда вывода данных в порт

mov i2cdata,r20

rcall i2c_write           ;вывод данных

rcall i2c_stop            ;генерация стопового бита

reti

ИМПОРТИРОВАННЫЕ ПОДПРОГРАММЫ, ; используемые для работы ведущего МК по протоколу I2C

;Для коммуникации используются линии порта PD – PD6(SCL) и ;PD7(SDA).Управление выводами SDA, SCL с открытым стоком ;осуществляется путем начальной установки битов PORTx ;в О и в дальнейшем с помощью установки;сброса битов ;направления DDRx.

Основные функции: **** ;i2c_start – стартовая посылка, посылка адреса и ;направления,

;i2c_rep_start – посылка "повторного старта" (repeated ;start),

;i2c_write – передача байта, i2c_read – прием байта, ;i2c_stop – стоповая посылка

;Функции задержек

i2c_hp_delay:             ;задержка (на 5 мкс минимум)

Idi i2cdelay,2 i2c_hp_delay_loop: dec i2cdelay brne i2c_hp_delay_loop ret

i2c_qp_delay:             ;задержка (на 2,5 мкс минимум)

Idi i2cdelay,1 i 2 c_qp_de1a y_lо op: dec i2cdelay brne i2c_qp_delay_loop ret

;Функция повторного старта подготавливает шину I2C к ;формированию стартового бита

;За данной функцией должен следовать вызов i2c_start

i2c_rep_start:

rcall i2c_qp_delay

sbi DDRD,SCLP         ;захват линии SCL (выход SCL=0)

cbi DDRD,SDAP         ;освобождение линии SDA

rcall i2c_hp_delay    ;задержка

cbi DDRD,SCLP ;освобождение линии SCL (выход SC1=1)

rcall i2c_qp_delay    ;задержка

;функция формирования стартового бита ;За данной функцией должен следовать вызов i2c_write

г

i2c_start:

mov i2cdata,i2cadr

sbi DDRD,SDAP             ;захват SDA

rcall i2c_qp_delay ;задержка

;Функция записи одного байта в ведомое устройство

;Также используется для передачи адреса

;За данной функцией должен следовать вызов i2c_get_ack

t

i2c_write:

sec                       ;установка флага С

rol i2cdata               ;сдвиг первого бита в С

rjmp i2c_write_first i2c_write_bit:

Isl i2cdata               ;посылка следующего бита в С

i2c_write_first:

breq i2c_get_ack          ;переход, если передача завершена

; (регистр пуст) sbi DDRD,SCLP       ;захват линии SCL

brcs i2c_write_high ;если бит установлен,

; освободить SDA,

i2c_write_low:            ;иначе

sbi DDRD,SDAP             ; захват SDA

rjmp i2c_write_delay i2c_write_high:

cbi DDRD,SDAP             ;освобождение линии SDA

i2c_write_delay:

rcall i2c_hp_delay ;задержка cbi DDRD,SCLP     ;освобождение линии SCL

rcall i2c_hp_delay ;задержка i2c_write_check_wait:

sbis PIND,SCLP            ;ожидание состояния SCL=1

rjmp i2c_write_check_wait rjmp i2c_write_bit

;Функция чтения подтверждения. Используется функцией ;i2c_write

i2c_get_ack:

sbi DDRD,SCLP      ;захват линии SCL

cbi DDRD,SDAP       ;освобождение линии SDA

rcall i2c_hp_delay ;задержка cbi DDRD,SCLP     ;освобождение линии SCL

i 2 c_ge t_a с k_wa i t:

sbis PIND,SCLP     ;ожидание высокого уровня SCL

rjmp i2c_get_ack_wait

clc                 ;сброс флага С

sbic PIND,SDAP     ;если SDA=1,

sec                ;установка флага С

rcall i2c_hp_delay ;задержка

sbi DDRD,SCLP      ;захват линии SCL

ret

;Функция чтения одного байта от ведомого в регистр ;i2c_data

;Значение флага С=1 используется как признак конца приема ;После данной функции должна следовать функция i2c_put_ack

i2c_read:

;Загружаем $01 – это после приема данных приведет к ;установке флага С

Idi i2cdata,0x01 i2c_read_bit:

sbi DDRD,SCLP         ;захват линии SCL

rcall i2c_hp_delay    ;задержка

cbi DDRD,SCLP         ;освобождение линии SCL i2c_read_check_wait:

sbis PIND,SCLP        ;ожидание состояния SCL=1

rjmp i2c_read_check_wait

rcall i2c_hp_delay    ;задержка

clc                   ;сброс флага С

sbic PIND,SDAP        ;если SDA=1,

sec                   ;установка флага С

rol i2cdata           ;сохранение принятого бита

brcc i2c_read_bit      ;прием закончен, когда флаг С=1

;Функция формирования подтверждения. Используется функцией ;i2c_read

;При значении флага Т=1 подтверждение не формируется, ;после чего обычно формируется стоповый бит ;При Т=0 формируется подтверждение приема

i2c_put_ack:

sbi DDRD,SCLP             ;захват линии SCL

brtc i2c_put_ack_low ;если Т=0, формируем подтверждение cbi DDRD,SDAP     ;освобождение линии SDA

rjmp i2c_put_ack_high i2c_put_ack_low:

sbi DDRD,SDAP             ;захват SDA

i 2 c_pu t_a с k_h i gh:

rcall i2c_hp_delay        ;задержка

cbi DDRD,SCLP             ;освобождение линии SCL

i2c_put_ack_wait:

sbis PIND,SCLP            ;ожидание освобождения SCL

rjmp i2c_put_ack_wait

rcall i2c_hp_delay        ;задержка

sbi DDRD,SCLP

ret

;Функция формирования стопового бита i2c_stop:

sbi DDRD,SDAP             ;захват SDA

rcall i2c_hp_delay        ;задержка

cbi DDRD,SCLP             ;освобождение линии SCL

rcall i2c_qp_delay        ;задержка

cbi DDRD,SDAP             ;освобождение линии SDA

rcall i2c_hp_delay        ;задержка

ret

Создать проект в AVR Studio 4 и загрузить тестовую программу. Проверить работу МК в пошаговом режиме, наблюдая выходы

порта PD (PD6, PD7). Эмуляцию сигналов с порта ППП при чтении данных можно выполнить, устанавливая ручным способом биты данных на линии SDA (разряд PIND7). Чтобы ускорить прогон программы, рекомендуется перед компиляцией закомментировать строки программы с проверкой состояния линии SCL.

Создать проект устройства, используя схему рис. 5.16, для проверки работы канала I2C с помощью программы ISIS 6 Professional из пакета Proteus 6 Professional фирмы Labcenter Electronic. Проверить работу устройства в пошаговом режиме.

Оставить комментарий

Устройство витков выходе генератора импульсов микросхемы мощности нагрузки напряжение напряжения питания приемника пример провода работы радоэлектроника сигнал сигнала сигналов сопротивление схема теория транзистора транзисторов управления усиления усилитель усилителя устройства частоты