Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

4. Дождаться состояния 0x28 (данные переданы); передать следующий байт. Если передан последний (или единственный) байт, установить START.

5. Дождаться состояния 0x10 (повторный START передан); снять START; если требуется принять больше одного байта, разрешить подтверждение; передать адрес и . Если байт всего один, пункт 4 пропустить.

6. Дождаться состояния 0x50 (данные получены, подтверждение отправлено); сохранить принятый байт. Если получен предпоследний байт, запретить подтверждение (запретить сразу, если байта всего два).

7. Дождаться состояния 0x58 (данные получены, подтверждение НЕ отправлено). Установить STOP.

В качестве примера приведем шаблон реализации самого сложного цикла «Адрес–Передача–Прием» через опрос флага готовности в регистре

I2C0CONSET.

I2C0CONSET=0x20; while (!Finished)

if (I2C0CONSET & 0x08)

{

 

switch

(I2C0STAT)

{

 

case

0x08: ... ; break;

case

0x18: ... ; break;

case

0x28: ... ; break;

case

0x10: ... ; break;

case

0x50: ... ; break;

case

0x58: ... ; Finished=1;

}

 

I2C0CONCLR=0x08;

}

Алгоритм упрощается с использованием прерываний. Требуется поместить в процедуру обработки прерывания конструкцию switch...case и команду сброса флага в I2CxCONCLR.

1.19 Последовательный асинхронный приемопередатчик UART

1.19.1 Назначение и основы функционирования порта UART

Последовательный порт UART используется для обмена сообщениями через интерфейсы RS-232 и RS-485, широко распространенные как в компьютерной технике, так и в промышленных системах управления. Сопряжение этих интерфейсов с портом UART обеспечивается соответствующими преобразователями уровней, выпускаемыми в виде интегральных микросхем.

Универсальный асинхронный приемопередатчик (UART) представляет собой асинхронный интерфейс, использующий две линии для передачи данных в обоих направлениях. Скорость передачи данных ограничена 3,75 Мбит/c. Каждый символ может состоять из 5–8 битов, к которым может добавляться бит контроля четности. Младший бит передается первым. Нача-

80

рисун-

ло и конец символа обозначаются стартовым битом (логический ноль) и стоповым битом (логическая единица). Стоповых битов может быть один или два.

На рисунке 1.19.1 Показаны осциллограммы сигнала, передаваемого по интерфейсу RS-232 персональным компьютером, а также эквивалентного сигнала стандартных уровней ТТЛ/КМОП, полученного с помощью преобразователя уровней MAX232.

Рисунок 1.19.1 – Осциллограммы сигнала RS-232 (вверху) и сигнала на входе RxD микроконтроллера (внизу) при передаче символов 0x89 и 0x39. Параметры сигнала: скорость 9600 бит/с, 8 бит, один стоповый бит, контроль нечетности.

Микроконтроллер LPC2148 оснащен двумя портами UART. Здесь ограничимся рассмотрением только модуля UART0. Другой модуль (UART1) отличается поддержкой полного модемного интерфейса.

Следует указать отличительные особенности портов UART в микроконтроллерах LPC2148: 16-уровневые буферы приемника и передатчика, действующие по принципу очереди; автоматический контроль четности при приеме и формирование бита честности при передаче; развитые средства контроля ошибок; поддержка автоматического определения битовой скорости.

1.19.2 Управляющие регистры

Схема управляющих регистров модуля UART0 показана на

ке 1.19.2.

Регистр U0RBR — вершина буфера-очереди приемника. Содержит самый «старый» принятый байт. Если используется передача символа длиной менее восьми бит, то неиспользуемые старшие разряды заполнены нулями.

При считывании байта из буфера через U0RBR бит доступа к делителю частоты DLAB (см. ниже) должен быть сброшен в ноль.

Регистр U0THR — вершина буфера-очереди передатчика. Байт, загруженный в этот регистр, будет поставлен в очередь и передан после всех байтов, загруженных в U0THR ранее. Запись возможна, если бит доступа к делителю частоты DLAB сброшен в ноль.

81

U0TER – Включение передатчика

 

11

8

7

6

0

 

 

EN

 

 

 

 

TX

 

 

 

 

Вкл

 

 

U0LSR – состояние линии

 

 

11

8

 

7

6

5

4

 

 

 

 

E

 

T

 

E

BI

 

 

R

F

TEM

T

 

 

X

 

 

 

HR

 

 

 

Ошибка в ходе приема

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Передача завершена

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Буфер передатчика пуст

 

 

 

 

 

 

 

 

 

 

 

Поток прерван

 

 

 

 

 

 

3

2

1

0

FE

PE

OE RDR

 

 

 

 

 

 

Данные в буфере приемника

 

 

 

 

 

 

 

 

 

 

 

 

Переп. буфера

 

 

 

 

 

 

 

 

 

 

Ошибка четности

 

 

 

 

 

 

Потеря стопового бита

 

 

U0LCR – управление линией

11

8

 

7

B

6

 

5

4

 

 

 

 

 

 

A

 

 

 

 

 

A

E

K

PARSEL

 

 

L

 

R

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

B

 

 

 

 

Разр. настр. скорости

 

 

 

 

Блок.

Чет/

 

 

 

 

 

 

 

 

 

 

 

нечет

 

 

 

 

 

 

 

 

 

U0FCR – управление буфером

 

3

2

AR

 

 

P

O

P N

ST

E

Контр.

 

 

 

чет.

 

 

 

1

0

WLEN

Число бит

Число стоповых

11

8

7

6

5

4

3

2

1

0

TRIGLEV

TX

 

X

 

 

O

S

R

 

S

IF

N

 

 

F

 

RE

 

RE

 

E

Число байт до

Сбр. буф. TX

 

 

 

Вкл. буферы

 

 

 

прерывания

 

 

 

 

Сбр. буф. RX

 

 

U0IIR – идентификация прерывания

 

 

 

 

11

10

9

 

8

 

 

 

O

 

 

O

 

 

E

 

T

 

 

AB

 

B

 

 

 

 

A

 

 

Ошибка опр. скорости

 

 

 

 

 

 

Скорость определена

 

 

 

 

 

 

7

6

5

4

3

2

1

0

FIFOEN

 

 

 

IDENT

 

IP

Буферы

 

 

Идентиф. прер.

 

Флаг прерывания

 

 

 

включены

 

 

 

события

 

 

 

 

 

 

 

 

U0IER – управление прерывающими событиями

11

10

9

 

8

7

4

3

2

 

1

 

 

 

 

T

 

 

 

LS

 

R

 

 

O

 

 

O

 

 

 

X

 

E

 

 

BE

B

 

 

 

 

H

 

 

A

A

 

 

 

 

 

R

T

 

0 RBR

Ошибка опр. скорости

 

Ошибка в ходе приема

 

 

Данные в буфере приемника

 

 

 

 

 

 

 

Скорость определена

 

Буфер передатчика пуст

 

U0ACR – автоматическое определение скорости

 

 

11

10

 

9

 

 

8

7

4

3

2

 

 

 

1

 

0

 

 

EO r

 

O

 

 

 

to

t

 

de

 

 

t

 

 

T

lr

 

 

u

 

 

 

 

r

 

B

 

l

B

 

 

 

A

tar

 

 

 

a

 

A

 

C

A

tC

 

 

 

o

t

 

 

Int

 

In

 

 

 

S

 

 

M

 

 

S

 

 

 

Сброс флагов

Автоматический повтор

 

 

 

 

 

 

 

 

Запуск

 

 

 

 

 

 

 

 

 

 

прерываний

 

 

 

 

 

Режим

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 1.19.2 – Схема регистров управления приемопередатчиками UART0

Регистры U0DLL, U0DLM задают делитель частоты, определяя битовую скорость приемопередатчика. См. выражения (1.19.1, 1.19.2).

Регистр U0FDR задает делитель частоты для точной настройки.

Биты 0–3 (DivAddVal) — см. выражения (1.19.1, 1.19.2).

Биты 4–7 (MulVal) — см. выражения (1.19.1, 1.19.2).

82

Таблица 1.19.1 – Оптимальные по точности настройки скорости UART

 

 

 

 

МГц

 

 

 

МГц

 

 

 

 

МГц

Стандартная скорость

U0DLL

U0DLM

MulVal

DivAddVal

Отн. погр. скорости, %

U0DLL

U0DLM

MulVal

DivAddVal

Отн. погр. скорости, %

U0DLL

U0DLM

MulVal

DivAddVal

 

Отн. погр. скорости, %

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2400

226

4

4

1

0

113

2

4

1

0

23

1

5

2

 

0,006

4800

113

2

4

1

0

23

1

5

2

0,006

93

0

10

11

 

0,006

9600

23

1

5

2

0,006

93

0

10

11

0,006

71

0

8

3

 

0,032

19200

93

0

10

11

0,006

71

0

8

3

0,032

38

0

7

2

 

0,059

38400

71

0

8

3

0,032

38

0

7

2

0,059

19

0

7

2

 

0,059

57600

31

0

10

11

0,006

19

0

7

5

0,059

12

0

14

5

 

0,059

 

Битовая скорость определяется выражением

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

;

(1.19.1)

или (что то же самое)

, (1.19.2)

где ; ; ; .

При настройке допустимое рассогласование скоростей приемника и передатчика составляет 5%.

В таблице 1.19.1 приведены оптимальные значения величин, задающих скорость приемопередатчика для тактовых частот равных 60, 30 и 15 МГц, которые могут быть получены с кварцевым резонатором 12 МГц.

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

,

(1.19.3)

где обозначают 16-разрядный код, разбитый на два байта. Заметим, что нередко в системах передачи данных используют квар-

цевый резонатор с частотой 11,0592 МГц, которая делится нацело на все стандартные скорости RS-232. При этом в большинстве случаев погрешность задания частоты отсутствует при .

Регистр U0FCR предназначен для управления буфером-очередью.

● Бит 0 (FIFO Enable). Запись единицы включает буферы приемника и передатчика, а также открывает доступ к остальным битам регистра. Для работы приемопередатчика бит должен быть равен единице. Изменение бита сбрасывает буферы.

83

Бит 1 (RX FIFO Reset). Запись единицы приводит к очистке буфера приемника, после чего бит автоматически будет сброшен в ноль.

Бит 2 (TX FIFO Reset). Запись единицы приводит к очистке буфера передатчика. Бит также сбрасывается в ноль автоматически.

Биты 6–7 (RX Trigger Level) — порог буфера. Определяют число принятых байт, при котором вырабатывается прерывание (см. таблицу 1.19.2). Биты должны быть установлены до включения прерывания.

Таблица 1.19.2 – Пороговое значение буфера приемника

RX Trigger Level

Число приятных байт, вызывающих прерывание

00

1

01

4

10

8

11

14

Регистр U0LCR — регистр управления линией.

Биты 0–1 (World Length Select) выбирают разрядность передаваемых

ипринимаемых символов (см. таблицу 1.19.3).

Таблица 1.19.3 – Настройка числа принимаемых и передаваемых бит

World Length Select

Число принимаемых и передаваемых бит

00

5

01

6

10

7

11

8

Биты 4–5 (Parity Select). Настройка контроля четности (в соответствии с таблицей 1.19.4).

Бит 2 (Stop Bit Select). Нулевое значение соответствует одному стоповому биту, единица — двум стоповым битам.

Таблица 1.19.4 – Настройка контроля четности

Parity Select

Настройка бита честности

00

Число двоичных единиц в символе нечетно

01

Число двоичных единиц в символе четно

10

Бит четности всегда равен 1

11

Бит четности всегда равен 0

Бит 3 (Parity Enable). Установка в единицу приводит к формированию бита четности при передаче и контролю четности при приеме.

Бит 6 (Break Control). Запись единицы приводит к установке логического нуля на выходе передатчика TxD. Низкий уровень на линии TxD будет удерживаться пока этот бит равен единице.

Бит 7 (DLAB). Установка единицы открывает доступ к регистрам настройки скорости (см. выше).

Регистр U0LSR индицирует состояние линии.

84

Бит 0 (RDR). Единица показывает, что буфер приемника содержит принятые данные, готовые для считывания через U0RBR. Бит сбрасывается в ноль, когда буфер опустеет.

Бит 1 (OE). Единица устанавливается в случае переполнения буфера приемника, то есть поступлении более 16 символов подряд без извлечения данных из U0RBR. Бит сбрасывается в ноль при чтении регистра U0LSR.

Бит 2 (PE). Единица обозначает возникновение ошибки контроля четности. Значение бита относится к самому «старому» символу в буфереочереди. При извлечении очередного символа буфер сдвигается, и флаг PE обновляется для очередного символа. Бит сбрасывается при чтении U0LSR.

Бит 3 (FE). Единица показывает, что стоповый бит распознан как логический ноль. При возникновении такой ошибки приемник будет пытаться восстановить синхронизацию, считая стоповый бит пропущенным, а нулевой уровень стартовым битом следующего символа. Значение бита также относится к очередному символу в буфере, обновляется при чтении U0RBR и сбрасывается в ноль при чтении U0LSR.

Бит 4 (BI). Устанавливается в единицу, если на протяжении всего символа состояние линии RXD0 неизменно и равно логическому нулю. Чтение U0LSR сбрасывает бит в ноль.

Бит 5 (THRE). Единица показывает, что буфер передатчика пуст и готов принимать данные через U0THR. При записи в U0THR бит сбрасывается в ноль.

Бит 6 (TEMT). Единица показывает, что свободны и буфер передатчика, и сдвиговый регистр передатчика. То есть в настоящий момент передатчик простаивает. Ноль устанавливается, если в буфере или в сдвиговом регистре появляются данные.

Бит 7 (RXFE). Устанавливается в единицу, если в любой из ячеек буфера имеется символ приятный с ошибкой (FE, PE или BI). Бит сбрасывается в ноль при чтении U0LSR при условии все байты, хранящиеся в буфере, приняты без ошибок.

Регистр U0ACR — управление автоматической настройкой скорости.

Бит 0 (Start). Установка в единицу запускает процедуру автоматического определения скорости. По завершении бит автоматически будет сброшен в ноль.

Бит 1 (Mode). Режим 0 (скорость определяется по стартовому биту и младшему биту данных) или режим 1 (скорость определяется только по стартовому биту).

Бит 2 (Auto Restart). Установка единицы приводит к автоматическому перезапуску процедуры в случае неудачи.

Бит 8 (ABEOIntClr). Запись единицы сбросит соответствующий флаг запроса прерывания в регистре U0IIR. Запись нуля не имеет значения.

Бит 9 (ABTOIntClr). Запись единицы сбросит соответствующий флаг запроса прерывания в регистре U0IIR. Запись нуля не имеет значения.

Регистр U0TER предназначен для запрета передачи. Содержит единственный управляющий бит.

85

Бит 7 (TXEN). По умолчанию бит равен единице. Запись нуля запрещает работу передатчика. Если бит сброшен в ноль во время передачи, то она будет завершена, но следующий символ из буфера передаваться не будет до тех пор, пока биту не будет присвоена единица.

Регистр U0IER предназначен для включения прерываний, связанных

ссобытиями в модуле UART0.

Бит 0 (RBR) разрешает формирование запроса прерывания при наличии данных в буфере приемника, которые не были считаны через U0RBR.

Бит 1 (THREE) разрешает запрос прерывания при опустошении буфера передатчика.

Бит 2 (RX Line Status) разрешает прерывание при обнаружении ошибки (OE, PE, FE, BI) в ходе прима данных. Подробней об ошибках см. описание регистра U0LSR.

Бит 8 (ABTO Int En) разрешает запрос прерывания по успешному завершению процедуры автоматического определения скорости.

Бит 8 (ABEO Int En) разрешает запрос прерывания по неудачному завершению процедуры определения скорости.

Регистр U0IIR — идентификатор прерываний UART0. Все прерывающие события, священные с модулем UART0 считаются относящимися к одному источнику. Поэтому требуется алгоритмически определять причину прерывания с помощью следующих битов.

Бит 0 (Interrupt Pending) Равенство единице показывает, что ни одно из прерываний не запрошено.

Биты 1–3 (Interrupt Identification) содержат идентификатор прерывания в соответствии с таблицей 1.19.5.

Таблица 1.19.5 – Идентификация прерываний приемопередатчика UART

U0IIR[0–3]

Значение

Условие сброса в ноль

0001

Прерывание не запрошено

0110

Ошибка в ходе приема

Чтение U0LSR

 

(биты OE, PE, FE, BI в U0LSR)

 

 

0100

Буфер приемника полон

Чтение U0RBR или число байт,

 

в буфере, становится порога

 

 

1100

Буфер частично заполнен и

Чтение U0RBR

 

приемник простаивает

 

 

0010

Буфер передатчика пуст

Чтение U0IIR или запись

 

в регистр THR

 

 

Бит 6–7 (FIFO Enable) Эти биты повторяют бит 0 регистра U0FCR.

Бит 8 (ABEO Int). Единица показывает, что процедура автоматического определения скорости завершена успешно.

Бит 9 (ABTO Int). Единица показывает, скорость не удалось определить автоматически.

Здесь необходимо дать некоторые пояснения. Идентификаторы 0100 и 1100 свидетельствуют о наличии необработанных данных в буфере приемника. Различие состоит в том, что код 0100 устанавливается, когда число байт в

86