Модуль интерфейса TWI на МК AVR

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

Ряд микроконтроллеров семейства ATmega содержит встроенный модуль интерфейса TWI, позволяющий выполнять обмен данными по последовательному каналу в различных режимах.

Упрощенная структурная схема модуля приведена на рис. 5.17. Модуль содержит блок шинного интерфейса (SDA, SCL) с регистром данных TWDR и контроллером состояний Start;Stop, блок контроля адреса с регистром адреса TWAR и схемой сравнения, блок управления с регистрами управления TWCR и состояния TWSR, контроллер скорости передачи с предделителем и регистром скорости TWBR.

Рис. 5.17. Структура модуля TWI

Регистр данных TWDR обеспечивает параллельную загрузку байтов и последовательный вывод данных на линию SDA путем сдвига содержимого регистра влево в сторону старших разрядов.

Регистр адреса TWAR используется при работе микроконтроллера в качестве ведомого. Код, записанный в семи старших разрядах регистра, представляет собственный адрес микроконтроллера. Этот код сравнивается компаратором с адресом, поступающим в микроконтроллер при появлении адресного пакета в регистре TWDR. Младший бит TWGCE регистра TWAR разрешает распознавание общих вызовов (обращений с адресом $00). Если разряд TWGCE = О, распознавание общих вызовов запрещено.

Управление работой порта осуществляется с помощью регистров TWCR (табл. 5.6) и TWSR (табл. 5.7).

Биты регистра TWCR имеют следующее назначение: TWEN – бит разрешения работы модуля TWI. При установке бита в состояние 1 выводы SDA, SCL подключаются к внешним выводам микроконтроллера РС1, РСО соответственно для всех ранее названных моделей микроконтроллеров, кроме ATmegaSx (выводы РС4, РС5) и Atmega 64х, 128x(PDl, PDO);

TWSTA – флаг состояния Start. При установке бита в единичное состояние микроконтроллер может сформировать состояние Start, если шина свободна. Если шина занята, модуль ожидает появления состояния Stop и лишь после этого захватывает шину, формируя состояние Start;

TWSTO – флаг состояния Stop. Установка флага в состояние 1 приводит к формированию на шине состояния Stop;

TWEA – бит разрешения подтверждения. При установке бита в 1 устройство формирует сигнал подтверждения, когда это необходимо;

TWIE и TWINT – флаги разрешения и прерывания от модуля TWI. Запрос прерывания генерируется, если TWINT = 1 и TWIE = = 1. Сброс флага TWINT может быть осуществлен только при записи в него логической 1;

TWWC – флаг, устанавливаемый в 1 при попытке записи в регистр данных TWDR, когда флаг прерывания TWINT сброшен.

Биты регистра TWSR:

TWS7…TWS3 – код состояния модуля TWI;

TWPS1:TWPS0 – коэффициент деления предделителя контроллера скорости передачи.

Контроллер скорости передачи формирует последовательность тактовых сигналов, поступающих на линию SCL. Частота формируемых сигналов зависит от коэффициентов деления TWBR и

Таблица 5.8. Таблица коэффициентов для выбора скорости обмена

по TWI

fcLK,

TWBR

TWPS

fscL,

fcLK,

TWBR

TWPS

fscb

МГц

 

 

кГц

МГц

 

 

кГц

16

12

0

400

8

10

0

-222

16

72

0

100

8

32

0

100

14,4

10

0

400

4

12

0

100

14,4

64

0

100

3,6

10

0

100

12

10

0

-333

2

10

0

-55

12

52

0

100

1

10

0

-28

TWPS, загружаемых в регистры TWBR и TWSR, и для разных моделей микроконтроллеров рассчитывается по формулам:

–      для ATmegal63x, ATmega323x fsci                         + 2TWBR);

–    для моделей ATmega 8х, 16х, 32х, 64х, 128х fscL ^fcLK ; (16 + + 2TWBR*4^^).

Значения коэффициентов деления для различных частот fciK и

fscL приведены в табл. 5.8.

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

Модуль TWI может работать в следующих режимах:

–    ведущий с передачей байтов данных;

–    ведущий с приемом байтов данных;

–   ведомый с приемом байтов данных;

–   ведомый с передачей байтов данных.

Процедура передачи одного байта данных от ведущего к ведомому представляет собой определенную последовательность действий.

1.  В регистр ТWCR выводится команда для формирования состояния Start. Для этого необходимо установить в 1 бит TWSTA (TWSTA = 1), сбросить флаг TWINT (TWINT = 1) и установить бит активизации модуля TWI (TWEN = 1). После формирования состояния Start флаг TWINT устанавливается в 1. Для перехода к следующему действию выполняется проверка кода состояния $08 в регистре TWSR. (Ожидание установки флага TWINT можно заменить обработкой запроса прерывания. – Прим. авт.) Программная реализация функции старта представлена далее в программе 5.6 процедурой Send Start.

2.   Содержимое пакета с адресом и нулевым значением бита направления записывается в регистр TWDR. Передача инициализируется сбросом флага TWINT. После завершения передачи адреса и получения бита подтверждения флаг TWINT устанавливается в 1, а в регистре TWSR устанавливается код статуса $18. Программная реализация функции записи представлена в программе процедурой SendAdr.

3.   После проверки кода статуса в регистр данных TWDR загружается байт данных для передачи и сбрасывается флаг TWINT. По окончании передачи данных и получения бита подтверждения флаг TWINT устанавливается в 1, а в регистре TWSR устанавливается код статуса $28. Эти действия обеспечивают передачу от ведущего устройства ведомому как команд, так и данных. Программная реализация функции вывода данных (а также команд) представлена в программе процедурой Send Сот Data.

4.  После успешного завершения передачи выполняются команды для формирования состояния Stop. Программная реализация функции представлена в программе процедурой Stop.

Кратко определим последовательность действий, выполняемых при приеме одного байта данных ведущим устройством:

1) в регистр TWCR выводится команда для формирования состояния Start; после формирования состояния Start флаг TWINT устанавливается в 1. Для перехода к следующему действию выполняется проверка кода состояния ($08) в регистре TWSR. (Ожидание установки флага TWINT также можно заменить обработкой запроса прерывания. – Прим. авт.);

2)   содержимое пакета с адресом и единичным значением бита направления записывается в регистр TWDR и инициализируется передача. После завершения передачи адреса и получения бита подтверждения флаг TWINT устанавливается в 1, а в регистре TWSR устанавливается код статуса ($40);

3)   после сброса флага TWINT (разрешения приема) и получения байта данных от ведомого данные из регистра TWDR переписываются в один из регистров общего назначения. При успешном приеме код статуса в регистре TWSR принимает значение $50. При необходимости формируется бит подтверждения приема;

4)   после завершения приема выполняется команда для формирования состояния Stop.

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

1)    в регистр TWCR выводится команда, сбрасывающая флаг TWINT;

2)   после приема первого байта с адресом ведомого устройства формируется запрос прерывания, проверяется код статуса в регистре TWSR; если он равен $60, прием собственного адреса выполнен успешно;

3)  передается бит подтверждения путем установки TWEN = 1 и выполняется сброс флага TWINT;

4)    проверяется код статуса в регистре TWSR (если он равен $80, значит в регистр TWDR принят байт данных); передается бит подтверждения (TWEN = 1) и выполняется сброс флага TWINT;

Действия 4-го шага повторяются, пока не будет принято все сообщение. При поступлении состояния Stop в регистре TWSR формируется код статуса $А0 (конец пакета).

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

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

Работу встроенного модуля TWI рассмотрим на примере вывода данных из микроконтроллера ATmegaSx в параллельный порт РСА9554 для индикации. Схема сопряжения микроконтроллера МК и параллельного порта приведена на рис. 5.18.

Рис. 5.18. Схема устройства для обмена данными с ППП по интерфейсу TWI

Задание 2. Подготовить программу для проверки обмена данными между микроконтроллером и параллельным портом, используя встроенный модуль интерфейса TWI. В качестве примера ниже приведена программа 5.6, которая выполняет вывод в порт инвертируемого 8-разрядного кода данных. При передаче пакетов с адресами и данными использован механизм программной проверки условий установки в 1 флага TWINT и состояний регистра TWSR.

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

Программа 5.6

;Тестовая программа 5.6 для вывода данных в программируе-

;мый параллельный порт по интерфейсу TWI ;

.org 0x000 rjmp init

.include "mSdef.inc"      ;файл определений ATmegaS

.def SLA_W = rl7          ;адресный байт

.def DATA = rl8           ;байт данных (команды)

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

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

Коды статуса в режиме ведущий передатчик **** .equ START = 0x08 ;после старта

.equ MT_SLA_ACK = 0x18    ;после передачи адреса

.equ MT_DATA_ACK = 0x28   ;после передачи данных

init:

Idi rlб,HIGH(RAMEND)      ;инициализация

out sph,rl6           ; указателя стека Idi г1б,LOW(RAMEND) out spl,rl6 ;Подготовка TWI к работе

Idi rl6,12                ; Для частоты Fclk = 4 МГц

out TWBR,rl6              ; TWBR=12 TWPS=0

Idi rl6, (1«TWEN)         ; Fscl = 100 КГц out TWCR,rl6

Idi r20,0xAA          ; данные для вывода ;Настройка микросхемы ППП

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

Idi SLA_W,$40+i2cwr       ;посылка адреса+записи rcall Send_Adr

Idi DATA,$03              ;команда записи в порт

;конфигурации

rcall Send_Com_Data

Idi DATA,0x00             ;настройка ППП на вывод rcall Send_Com_Data

rcall Stop            ;генерация стопового бита ;Вывод данных

loop: rcall Send_Start    ;генерация стартового бита

Idi SLA_W,$40+i2cwr       ;посылка адреса+записи rcall Send_Adr

Idi DATA,$01              ;выходной регистр rcall Send_Com_Data

mov DATA,r20              ;вывод данных rcall Send_Com_Data

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

com г20                   ;инвертирование

rjmp loop                 ;повторение вывода

; Функции режима ведущего передатчика

Send_Start:

Idi г1б, (1«TWINT) I (1«TWSTA) | (1«TWEN)

out TWCR,rl6           ;условия для состояния START

waitl:

in rl6,TWCR

sbrs rl6,TWINT            ;ожидание установки флага TWINT

rjmp waitl in rl6, TWSR andi rl6,0xF8

cpi rl6,START             ;проверка выполнения старта

brne error ret Send_Adr:

out TWDR,SLA_W            ;загрузка пакета с адресом

Idi г1б, (1«TWINT) I (1«TWEN) out TWCR, rl6    ;передача

wait2:

in rl6,TWCR

sbrs rl6,TWINT            ;ожидание установки флага TWINT

rjmp wait2 in rl6,TWSR andi rl6,0xF8

cpi rl6,MT_SLA_ACK ;проверка выполнения передачи

brne error

ret

Send_Com_Data:

out TWDR,DATA             ;загрузка байта данных

Idi г1б, (1«TWINT) I (1«TWEN) out TWCR,rl6     ;передача

waits:

in rl6,TWCR

sbrs rl6,TWINT            ;ожидание установки флага TWINT

rjmp waits in rl6,TWSR andi rl6,0xF8

cpi r1 б,MT_DATA_ACK ;проверка выполнения передачи

brne error

ret

Stop: Idi rl6, (1«TWINT) | (1«TWEN) | (1«TWST0)

out TWCR,rl6                  ; условия для состояния STOP

Idi rl6,0xlf

wait4:dec rl6               ;задержка для состояния STOP

brne wait4 ret

error: ret

Рис. 5.19. Схема устройства с интерфейсом TWI между двумя микроконтроллерами

Задание 3. Подготовить программы обмена данными для ведущего и ведомого микроконтроллеров. Проверить работу интерфейса TWI, по которому выполняется передача сообщения из микроконтроллера МК1 в МК2 (рис. 5.19), с помощью двух наборов STK500 по методике контроля работы интерфейса SPI, описанной в 5.2. Взамен внешних резисторов, требуемых спецификацией интерфейса, использовать внутренние подтягивающие резисторы выводов РС4, РС5 ведомого микроконтроллера.

В роли ведущего выступает микроконтроллер МК1, в роли ведомого – микроконтроллер МК2. Рабочий режим МК2 – режим ожидания. После передачи сообщения просмотреть коды символов сообщения на светодиодах, нажимая кнопку SWO.

Программа передачи ведущего микроконтроллера строится подобно 5.6. Каждый передаваемый пакет содержит служебные биты, байт адреса и байт данных. Ниже приведен основной модуль программы для передачи трех символов сообщения по интерфейсу TWI. Функции Send Start, Send_Ack, SendjCom Data, Stop те же, что и в программе 5.6.

Программа 5.7

;Основной модуль программы 5.7 для передачи сообщения ве- ;дущим микроконтроллером МК1 по интерфейсу TWI ;Вызываемые функции Send_Start, Send_Adr, Send_Com_Data, ; Stop из программы 5 . б

;Соединения: РС4мк1-РС4мк2, РС5мк1-РС5мк2 .org 0x000

rjmp init

.include "mSdef.inc"      ;файл определений ATmegaS .def temp = rl6

.def SLA_W = rl7          ;адресный байт

.def DATA = rl8           ;байт данных (команды)

.def count = rl9          ;счетчик данных

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

Коды статуса в режиме ведущий передатчик ****

.equ START = 0x08         ;после старта

.equ MT_SLA_ACK = 0x18    ;после передачи адреса

.equ MT_DATA_ACK = 0x28   ;после передачи данных init:

Idi г1 б,НIGH(RAMEND)     ;инициализация

out sph,rl6               ; указателя стека Idi rlб,LOW(RAMEND) out spl,rl6

Idi ZL,low(text*2)        ;загрузка адреса текста

Idi ZH,high(text*2)       ; сообщения в регистр Z

Idi count,3           ;установка счетчика передач ;Подготовка TWI к работе

Idi г1б,12                ;для частоты Fclk = 4 МГц

out TWBR,rl6              ; TWBR=12, TWPS=0

Idi rl6, (1«TWEN)         ; Fscl=100 КГц out TWCR,rl6

output:                   ;вывод данных

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

Idi SLA_W,$44+i2cwr       ;посылка адреса+записи rcall Send_Adr

1pm                       ;считывание байта из

;flash-памяти в rO

mov DATA,гО               ;вывод данных rcall Send_Com_Data

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

adiw zl,l                 ;увеличение указателя адреса на 1

dec count                 ;уменьшение счетчика на 1 brne output

loop: rjmp loop           ;передача выполнена

text: .db ‘A’,’V’,’R’     ;текст сообщения

; (ASCII – коды $41, $56, $52)

Программа ведомого микроконтроллера может иметь следующую структуру:

а) начальная инициализация микроконтроллера, включая определение указателя стека, счетчика принимаемых данных, настройку портов, подготовку модуля TWI;

б)  разрешение прерываний и переход в режим ожидания прерываний;

в)  обработка запросов прерываний от модуля TWI, обеспечивающая прием пакетов с байтами адреса, команды и данных; сохранение байтов сообщения во внутренней памяти SRAM; подсчет числа байтов принятого сообщения; по окончании приема – последовательный вывод байтов сообщения при нажатии кнопки SWO.

Ниже приведен фрагмент программы ведомого микроконтроллера, включающий процедуру инициализации, и обработчик прерываний от модуля TWI, обеспечивающий прием сообщения по интерфейсу TWI и сохранение в памяти.

Программа 5.8

;Программа 5.8 приема по интерфейсу TWI для ведомого мик- ;роконтроллера МК2(основной фрагмент программы) ;Соединения: SWO-PBO, шлейфом порт PD-LED

.org 0x000

rjmp init .org 0x011

rjmp TWI_INT                ;переход к обработке

;прерывания

.include "m8def.inc"         ;файл определений ATmega8

.def count = г22          ;счетчик данных .def temp = г1б

.equ SHOW=0                  ;для подпрограммы OUTLED

;****Коды статуса в режиме          ведомого****

.equ TW_SR_SLA_ACK = ОхбО     ;принят байт с адресом

.equ TW_SR_DATA_ACK = 0x80      ;принят байт данных

.equ TW_SR_STOP = ОхАО      ;обнаружено состояние STOP

;***Инициализация ведомого мк*** init:

Idi г1б,HIGH(RAMEND)

out sph,rl6

Idi rl6,LOW(RAMEND)

out spl,rl6

clr temp                          ;настройка

out DDRB,temp                 ; вывода порта РВО

sbi PORTE,О                   ; на ввод, ser temp

out DDRD,temp                 ; выводов порта PD

out PORTD,temp                    ; на вывод

Idi count,3               ;установка счетчика байтов

Idi XL,0x80            ;b регистре X адрес, по которому

Idi ХН,0х01 ; происходит запись принятых данных ;Подготовка модуля TWI к работе

Idi temp,0x30        ;подключение подтягивающих резисторов

out PORTC,temp                ; на линиях SCL,SDA

Idi г1б,12                ;для Fclk = 4 МГц, TWBR=12,

out TWBR,rl6                 ; TWPS=0 Fscl=100 КГц

Idi rl6,0x44                 ;адрес устройства I2C

out TWAR,rl6

Idi rl6, (1«TWINT) I (1«TWEA) | (1«TWIE) | (1«TWEN)

out TWCR,rl6               ;запуск обмена по TWI sei

loop: rjmp loop           ;бесконечный цикл ожидания

г

;Обработчик прерывания от модуля TWI

TWI_INT:

in rl6,TWSR

cpi г1б,TW_SR_SLA_ACK ;1-я проверка brne ierror

Idi rl6, (1«TWINT) I (1«TWEA) | (1«TWEN) out TWCR,rl6 TW_WAIT_DATA:

in rl6,TWSR

cpi rlб,TW_SR_DATA_ACK;2-я проверка brne TW_WAIT_DATA in rl6,TWDR

St X+,rl6              ;сохранение байта данных в памяти

Idi г1б, (1«TWINT) I (1«TWEA) | (1«TWEN) out TWCR,rl6

TW_WAIT_STOP:                   ;ожидание состояния STOP in rl6,TWSR

cpi rl6,TW_SR_STOP       ;3-я проверка brne TW_WAIT_STOP ;Байт данных принят

dec count                    ;уменьшаем счетчик данных

brne ierror                  ;если не все, продолжаем,

rcall OUTLED             ; иначе выводим на индикаторы reti ierror:

Idi rl6, (1«TWINT) I (1«TWEA) | (1«TWIE) | (1«TWEN)

out TWCR,rl6                 ;перезапуск интерфейса reti

.Вывод на индикаторы***

OUTLED: clr temp                ;сигнализация –

out PORTD,temp               ; прием завершен

Idi XL,0x80                  ;установка начального адреса

Idi count,3               ;установка счетчика байтов WAIT_SHOW: sbic PINB,SHOW;ожидание нажатия

rjmp WAIT_SHOW               ; кнопки SHOW

Id temp,X+                   ;считывание байта из памяти

com temp                     ;инвертирование и

out PORTD,temp               ; вывод на светодиоды

rcall DELAY                  ;задержка из программы 5.4

dec count                    ;если показаны не все данные,

brne WAIT_SHOW               ; продолжение по нажатию SHOW ret

Полные тексты программ для ведущего и ведомого микроконтроллеров можно найти на сайте (проекты 5 7 и 5 8).

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

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