Ряд микроконтроллеров семейства 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).
- Предыдущая запись: РАДИОПЕРЕДАТЧИК С ЧМ ДЛЯ ИЗУЧЕНИЯ АЗБУКИ МОРЗЕ
- Следующая запись: 22-ВАТТНЫЙ УСИЛИТЕЛЬ ДЛЯ 12-ВОЛЬТОВЫХ СИСТЕМ
- УСТРОЙСТВО ЗАЩИТЫ ПК C ПОМОЩЬЮ ПАРОЛЯ (0)
- БЫСТРОДЕЙСТВУЮЩИЙ АМПЛИТУДНЫЙ ДЕТЕКТОР CO СХЕМОЙ ПАМЯТИ И ПЕРЕУСТАНОВКОЙ (0)
- СХЕМА ЗАПИСИ И ВОСПРОИЗВЕДЕНИЯ HA МИКРОСХЕМЕ ISD1000A (0)
- Эффективный УВЧ для приемника (0)
- Универсальная цифровая шкала-частотомер NM8051 (0)
- Адаптердля микроконтроллеров avr к программатору NM9215 (0)
- АДАПТЕР ДЛЯ ИМС ПАМЯТИ pVIICROWIRE EEPROM 93Схх К ПРОГРАММАТОРУ NM9215 (0)