Программная реализация UART.



Мы поможем в написании ваших работ!


Мы поможем в написании ваших работ!



Мы поможем в написании ваших работ!


ЗНАЕТЕ ЛИ ВЫ?

Программная реализация UART.



UART состоит из 12 регистров, к которым можно обратиться по восьми адресам портов ввода-вывода.
Так как индивидуального адреса для каждого регистра не хватает, то используют расщепление адресного пространства с помощью следующих методов:
1.Разделение одного адресного пространства на два регистра по записи/чтению.
По сигналу чтения RD=0 читается один регистр, по сигналу записи WR=0 записывается второй регистр.
То есть данные по одинаковому адресу записываются или читаются с разных регистров.
Таких регистров четыре:
THR, RBR - по адресу UART 00h(A2A1A0=000)
IIR, FOR - по адресу UART 02h(A2A1A0=010)
Эти регистры односторонние, то есть в одни можно только записывать, в другие только читать данные.
2.Использование дополнительного адресного бита
Используют 7-ой бит регистра LCR-находящегося по адресу UART 03h(A2A1A0=011).
Этот бит называют DLAB, если DLAB=0, то для чтения/записи используется один регистр,
если DLAB=1, то для чтения/записи используется второй регистр.
Таких регистров пять:
(THR & RBR),DLL - по адресу UART 00h(A2A1A0=000)
DIM, IER - по адресу UART 01h(A2A1A0=001)

Таблица 3. Регистры UART.
адрес DLAB чтение/запись Название регистра
00h WR THR(Transmit Holding Register)-регистр данных ожидающих передачи
00h RD RBR(Receiver Buffer Register)- буферный регистр приемника
00h RD/WR DLL(Divisor Latch LSB)-младший байт делителя частоты
01h RD/WR DIM(Divisor Latch MSB)-старший байт делителя частоты
01h RD/WR IER(Interrupt Enable Register)-регистр разрешения прерывания
02h х RD IIR(Interrupt Identification Register)-регистр идентифицирующий прерывания
02h х WR FCR(FIFO Control Register)-регистр управления режимом FIFO
03h x RD/WR LCR(Line Control Register)-регистр управления линией связи
04h x RD/WR MCR(Modem Control Register)-регистр управления модемом
05h x RD/WR LSR(Line Status Register)-регистр состояния линии связи
06h x RD/WR MSR(Modem Status Register)-регистр состояния модема
07h x RD/WR SCR(Scratch Pad Register)-регистр временного хранения

Рис.13 Функциональная схема UART PC16550.

THR-регистр данных ожидающих передачи(только для записи)
(Transmit Holding Register)

Рис.14 Регистр THR (Адрес=00h, DLAB=0, WR)

В этот регистр записывают байт данных, определённый как символ (от 5 до 8 бит) который будет передан в линию связи. Символ, принятый в THR передаётся далее в сдвигающий регистр младшем битом вперед (см. рис.5). В начало символа добавляется стартовый бит, в конец символа добавляется стоповый бит. Перед стоповым битом может находиться бит паритета. Если символ короче 8 бит, то старшие биты регистра THR игнорируются (не используются, хотя записываются в этот регистр). Регистр THR может принять всего один байт данных и передать его в регистр последовательного сдвига. В большинстве UART имеется режим FIFO, в котором данные загружаются не в THR, а в регистр FIFO. Например, UART PC16550 имеет регистр FIFO, который может принять 16 байт данных. Кроме этого у некоторых UART существует режим DMA, в этом режиме сдвигающий регистр заполняется байтами данных непосредственно из оперативной памяти без участия микропроцессора.
Для указания того, что регистр THR пуст и в него можно загрузить очередной байт данных используют бит 5 регистра LSR. Этот бит называется THRE(Transmitter Holding Register Empty) -"регистр данных ожидающих передачи пуст". Если THRE=1, то в регистр THR можно посылать очередной байт данных, в режиме FIFO этот бит говорит о том, что регистр FIFO пуст и можно посылать следующий пакет байтов данных. Бит THRE может быть источником прерывания CPU.

RBR- буферный регистр приемника(только для чтения)
(Receiver Buffer Register)

Рис.15 Регистр RBR (Адрес=00h, DLAB=0, RD)

В этот регистр байты(символы) принимаются из приемного сдвигающегося регистра. Регистр RBR может принять только один байт из сдвигающего приемного регистра. Аналогично передающей части UART здесь есть регистр FIFO, который может принимать больше одного байта данных минуя регистр RBR. К моменту заполнения сдвигающего приёмного регистра регистр RBR должен быть освобожден для приема очередного байта, иначе произойдет ошибка переполнения. Освобождение регистра RBR происходит, когда данные из него читаются микропроцессором. О том, что символ потерян в результате переполнения сообщает бит 1 регистра LSR. Этот бит называется ОЕ (Overrun Error)-"ошибка переполнения", OE=1 означает что один из переданных символов потерян.
О том, что байт готов к прочтению микропроцессором (т.е. полностью выгрузился из приемного сдвигающегося регистра или FIFO) сообщает бит 0 регистра LSR. Этот бит называется DR (Receiver Data Ready) -"Данные приёмника готовы". DR=1 говорит о том, что регистр RBR(или FIFO) содержит принятый байт и его необходимо прочитать, DR сбрасывается в ноль после прочтения регистра RBR микропроцессором. Это бит также может инициировать прерывание микропроцессора.

DLL-младший байт делителя частоты :16 (чтение/запись)
(Divisor Latch LSB)

Рис.16 Регистр RBR (Адрес=00h, DLAB=1, RD/WR)

В это регистре находится младший байт делителя частоты деленного на 16.

DIM-старший байт делителя частоты :16 (чтение/запись)
(Divisor Latch MSB)

Рис.17 Регистр RBR (Адрес=01h, DLAB=1, RD/WR)

В этом регистре находится старший байт делителя частоты деленного на 16.
В микросхеме UART частота задающего кварца делится на делитель частоты(Decimal Divisor),который получается из двухбайтового числа (DIM,DLL) умноженного на 16. Таким образом делитель частоты задает скорость обмена данных через UART.
Записью в регистры DIM и DLL старшего и младшего байта этого двухбайтового числа вы зададите скорость обмена СОМ-порта в бит/сек.
Для кварца UART частотой f=1,8432 МГц, делитель частоты:16 считается по формуле:

D=115200/V, где V-скорость в бит/сек, D=делитель частоты:16

Для кварца UART частотой f=24 МГц, делитель частоты:16 считается по формуле:

 

D=1 500 000/V, где V-скорость в бит/сек, D=делитель частоты:16

Таблица 4. Делитель частоты для UART PC16550.
  1,8432 МГц 24 МГц
Скорость, бит/сек делитель:16 DIM DLL делитель:16 DIM DLL
09h 00h 75h 30h
06h 00h 4Eh 20h
41h 07h 35h 44h
03h 00h 27h 10h
01h 80h 13h 88h
00h C0h 09h C4h
1 200 00h 60h 04h E2h
1 800 00h 40h 03h 41h
2 000 00h 3Ah 02h EEh
2 400 00h 30h 02h 71h
3 600 00h 20h 0h A1h
4 800 00h 18h 01h 38h
7 200 00h 10h 00h D0h
9 600 00h 0Ch 00h 9Ch
14 400 00h 08h 00h 68h
19 200 00h 06h 00h 4Eh
28 800 00h 04h 00h 34h
38 400 00h 03h 00h 27h
57 600 00h 02h 00h 1Ah
115 200 00h 01h 00h 0Dh
250 000 x x x 00h 06h
300 000 x x x 00h 05h
375 000 x x x 00h 04h
500 000 x x x 00h 03h
750 000 x x x 00h 02h
1 500 000 x x x 00h 01h


Как видно из таблицы 4, СОМ порт ПК (с UART 16550 и выше) может работать на скорости до 1,5Mb/s.

IER-регистр разрешения прерывания(чтение/запись)
(Interrupt Enable Register)

Рис.18 Регистр IER (Адрес=01h, DLAB=0, RD/WR)

Регистр разрешения прерываний дает разрешения определённым событиям вызывать прерывание микропроцессора.
Бит 0. RxD_IЕ — если RxD_IЕ=1,то разрешено прерывание для приема данных,это прерывание возникает когда необходимо принять символ из регистра RBR (в режиме FIFO — прерывание по тайм-ауту).

Бит 1. TxD_IE — если TxD_IEЕ=1,то разрешено прерывание для передачи данных, это прерывание возникает когда передающий буфер пуст и необходимо загрузить байт в регистр THR.

Бит 2. RxL_IЕ — если RxL_IЕ=1,то разрешено прерывание при обрыве линии связи или ошибке в приёме данных, это прерывание возникает когда в регистре состояния линии связи LSR будут выставлены биты этих ошибок.

Бит 3. Mod_IЕ— если Mod_IЕ =1,то разрешено прерывание при изменении состояния любого из входных сигналов RST,CTS,DCD,RI, это прерывание возникает когда состояние входных сигналов COM-порта изменились.

Бит 4..7. Не используются и всегда равны 0.

IIR-регистр идентифицирующий прерывания (чтение)
(Interrupt Identification Register)

Рис.19 Регистр IIR (Адрес=02h, RD)

Чтобы минимизировать программное обеспечение, UART располагает по приоритетам прерывания в четыре уровня и делает запись этих прерываний в IIR. Четыре уровня прерывания располагаются в порядке приоритета условий прерывания заданных регистрами - RLS; RDR; THR; и MSR. Когда CPU обращается к IIR, UART замораживает все прерывания и указывает самое высокое приоритетное отложенное прерывание для CPU. Во время обработки прерывания, UART делает запись новых прерываний, но не изменяет их текущий признак, до полной обработки.

Бит 0. IP(Interrupt Pending)— если IP=1, то все прерывания обработаны. Если IP=0,то есть необработанные прерывания.

Бит 1. I_ID0(Interrupt ID Bit0)- нулевой бит идентификатора прерываний
Бит 2. I_ID1(Interrupt ID Bit1)- первый бит идентификатора прерываний
Бит 3. I_ID2(Interrupt ID Bit2)- второй бит идентификатора прерываний

Таблица 5. Идентификация прерывания (обычный режим)
I_ID2 I_ID1 I_ID0 Приоритет идентификация
x Четвертый Изменилось состояние модема, сбрасывается прочтением регистра MSR.
x Третий Регистр THR пуск, ожидается байт от CPU. Сбрасывается записью байта в THR.
x Второй Принят байт данных в регистр RBR, сбрасывается чтением регистра RBR.
x Наивысший Обрыв линии или ошибка на линии, сбрасывается прочтением регистра LSR.

 

Таблица 6. Идентификация прерывания (режим FIFO)
I_ID2 I_ID1 I_ID0 Прирритет идентификация
Четвертый Изменилось состояние модема, сбрасывается прочтением регистра MSR
Третий Буферный регистр передачи FIFO пуск, ожидается данные от CPU. Сбрасывается записью в передающий буфер FIFO
Второй Приемный буфер FIFO заполнился, сбрасывается чтением приемного буфера FIFO.
Наивысший Обрыв линии или ошибка на линии, сбрасывается прочтением регистра LSR
   
   
Второй индикатор тайм-аута (за 4-кратный интервал времени символа не передано и не принято ни одного символа, хотя в буфере FIFO имеется, по крайней мере, один символ). Сброс выполняется чтением приемного буфера FIFO.
   


Бит 4..5.Зарезервированны

Бит 6. FE_ID0(FIFOs Enabled ID Bit0)- нулевой бит идентификатора режима FIFO
Бит 7. FE_ID1(FIFOs Enabled ID Bit1)- первый бит идентификатора режима FIFO

Таблица 7. Идентификация режима FIFO
FE_ID1 FE_ID0 Режим
обычный режим работы, данные передаются побайтно через регистры THR и RBR.
 
режим FIFO для UART 16550.
режим FIFO для UART 16550A.

 

FCR-регистр управления режимом FIFO (запись)
(FIFO Control Register)

Рис.20 Регистр FCR (Адрес=02h, WR)

Это регистр используется только для записи, его данные расположены как в регистре IIR. Этот регистр используется, чтобы разрешить режимы FIFO, очистить буферы FIFO, задать уровень заполнения буферов FIFO, и выбрать тип DMA(прямого обращения к памяти).

Бит 0. TRFIFOE(Transmit And Receive FIFO Enable)— Запись 1 в этот бит допускает оба режима FIFO передатчика(XMIT) и приемника(RCVR). Сброс бита в 0 очистит все байты в обоих буферов FIFO. При изменении режима FIFO к 16450 и наоборот, буферы FIFO автоматически очищаются. Этот бит должен быть в 1, когда производится запись других битов регистра FCR, иначе они не будут запрограммированы.

Бит 1. RESETRF(Reset Receiver FIFO)-Запись 1 в этот бит очищает все байты в приемном буфере FIFO и сбрасывает его счетчик в 0. Сдвиговый регистр при этом не очищается. После этого 1 в этом бите сбрасывается в 0.

Бит 2. RESETTF(Reset Transmitter FIFO)- Запись 1 в этот бит очищает все байты в передающем буфере FIFO и сбрасывает его счетчик в 0. Сдвиговый регистр при этом не очищается. После этого 1 в этом бите сбрасывается в 0.

Бит 3. DMAE(DMA Enabled)- Запись 1 в этот бит приводит к изменению сигналов UART RxRDY и TxRDY с 0 к 1,при условии что FCR(bit0)=1. Эти аппаратные сигналы используются для организации правильной работы режима DMA в микропроцессорной системе.

Бит 4..5.Зарезервированные.

Бит 6. ITL_ID0 (Interrupt Trigger Level ID bit0) - нулевой бит идентификатора триггера уровня прерывания.
Бит 7. ITL_ID1(Interrupt Trigger Level ID bit1)- первый бит идентификатора триггера уровня прерывания.
В этих двух битах задается идентификатор, который задает уровень при котором будет вырабатываться прерывание при приеме данных в режиме FIFO. Уровень задается количеством байт в приемном(RCVR) буфере FIFO.

Таблица 8. Идентификация тригера уровня прерывания
ITL_ID1 ITL_ID0 уровень прерывания, байт

 

LCR-регистр управления линией связи(запись/чтение)
(Line Control Register)

Рис.21 Регистр LCR (Адрес=03h, RD/WR)

Данный регистр служит для определения(задания) формата асинхронного обмена передачи данных. Также в этом режиме устанавливается бит DLAB, который позволяет программисту записывать и читать данные из нужных регистров.. Программист может не только записывать, но и читать содержимое регистра LCR. Способность чтения упрощает системное программирование и устраняет потребность в отдельной области в системной памяти для хранения характеристик линии.

Бит 0. SDB_ID0(Serial Data Bits ID0)- нулевой бит идентификатора количества бит в передаваемом символе.
Бит 1. SDB_ID1(Serial Data Bits ID1)- первый бит идентификатора количества бит в передаваемом символе.
С помощью этих битов задают количество бит в передаваемом или принимаемом символе.

Таблица 9. Количество бит в символе данных
SDB_ID1 SDB_ID0 количество бит в символе


Бит 2. STOP_B(Stop Bits)- Этот бит определяет число стоповых битов, переданных или полученных в каждом последовательном символе. Если бит STOP_B=0, то передается один стоповый бит. Если бит STOP_B=1, то стоповый бит равен двум для 6,7,8 битовых символов и полтора стоповых бита для 5-ти битовых символов. Приемник проверяет только первый стоповый бит, независимо от выставленных стоповых битов.

Бит 3. PAREN(Parity Enable) -Если PAREN=1, то разрешено использование бита паритета и данный бит вставляется между последним битом данных и стоповым битом. Если PAREN=0, то бит паритета не выставляется и не входит в состав передаваемого символа.

Бит 4. EVENPAR(Even Parity Select) - Бит выбора типа контроля паритета. Если EVENPAR=1, то происходит проверка на четность. Если EVENPAR=0, то происходит проверка на нечетность.

Бит 5. STICPAR (Sticky Parity)- Если STICPAR=0, то бит паритета бит генерируется в соответствии с паритетом выводимого символа. Если STICPAR=1, то постоянное значение контрольного бита: при EVENPAR=1 — нулевое, при EVENPAR=0 — единичное.

Бит 6. BRCON(Break Control)- Управляющий бит обрыва связи. Если BRCON=1, то вслучае возникновения перерыва в приеме данных, передатчик UART начнёт передавать в линию нули.

Бит 7. DLAB(Divisor Latch Access Bit)- Этот бит доступа к делителю частоты. Если DLAB=1, то можно обратиться к регистрам DIM, DLL в которых хранятся младший и старший байт делителя частоты :16.Если DLAB=0, то можно обратиться к регистрам THR,RBR,IER.

MCR-регистр управления модемом (запись/чтение)
(Modem Control Register)

Рис.22 Регистр MCR (Адрес=04h, RD/WR)

Этот регистр управляет интерфейсом модема или периферийным устройством.

Бит 0. DTR(Serial Data Bits ID0)(Data Terminal Ready)- Этот бит управляет выходным сигналом DTR (Готовность терминала данных).
Когда бит DTR=1, вывод DTR UART устанавливается в логический 0, в IBM XT этот сигнал инвертируется буферным инвертором DS1488(см.рис.12) в логическую 1 т.е. U= +12в (сигнал DTR COM-порта считается включенным)
Соответственно когда бит DTR=0, сигнал DTR COM-порта U= -12в логический 0 (сигнал DTR считается выключенным)

Бит 1. RTS(Request To Send )- Этот бит управляет выходным сигналом RTS (Запрос на передачу).
Когда бит RTS=1, вывод RTS UART устанавливается в логический 0, в IBM XT этот сигнал инвертируется буферным инвертором DS1488(см.рис.15) в логическую 1 т.е. U= +12в (сигнал RTS COM-порта считается включенным)
Соответственно когда бит RTS=0, сигнал RTS COM-порта U= -12в логический 0 (сигнал RTS считается выключенным)

Бит 2. OUT1(OUT1 Bit Control) - Управление вспомогательным выходом OUT1.

Бит 3. OUT2(OUT2 Bit Control) - Управление вспомогательным выходом OUT2.

Бит 4. LOOP(Loopback Mode Enable)-Бит режима диагностики. Если LOOP=0, то UART работает в обычном режиме. Если LOOP=1, то URAT работет в режиме диагностики с обратной связью, в этом режиме используются вспомогательные сигналы OUT1 и OUT2.

Бит 5..7. Зарезервированы.

LSR -регистр состояния линии связи (запись/чтение)
(Line Status Register)

Рис.23 Регистр LSR (Адрес=05h, RD/WR)

Данный регистр показывает состояние приемопередатчика.

Бит 0. DR(Receiver Data Ready) — Готовность данных приемника.DR=1 информирует о том, что данные приняты и загружены в регистр RBR или приемный буфер FIFO. Бит сбрасывается в ноль, когда все данные будут прочитаны CPU из регистра RBR или буфера FIFO.

Бит 1. OE(Overrun Error) — Бит ошибки переполнения. Бит указывает, что данные в регистре RBR не были прочитаны CPU прежде, чем следующий символ был передан в RBR, что привело к потере предыдущего символа. Бит устанавливается в OE=1 после обнаружения ошибки переполнения и сбрасывать всякий раз, когда SPU читает содержание регистра LSR.

Бит 2. PE(Parity Error) —Бит ошибки контрольного бита паритета.PE=1 если символ принят с ошибкой паритета.

Бит 3. FE(Framing Error) — ошибка кадра (неверный стопбит).

Бит 4. BD(Break Detected) — индикатор обрыва линии (вход приемника находится в состоянии 0 не менее чем время посылки символа).

Бит 5. THRE(Transmitter Holding Register Empty) — регистр передатчика готов принять байт для передачи. В режиме FIFO указывает на отсутствие символов в FIFO-буфере передачи. Может являться источником прерывания.

Бит 6. TEMPT(Transmitter Empty Status) — регистр передатчика пуст (нет данных для передачи ни в сдвиговом регистре, ни в буферных регистрах THR или FIFO).

Бит 7. FIFOE(FIFO Error Status) —ошибка принятых данных в режиме FIFO (буфер содержит хотя бы один символ, принятый с ошибкой формата, паритета или обрывом). В не FIFO-режиме всегда 0.

MSR-регистр состояния модема
(Modem Status Register)

Рис.24 Регистр MSR (Адрес=06h, RD/WR)

Этот регистр позволяет CPU контролировать текущее состояние линий управления модема или периферийного устройства. В дополнение к этому , четыре бита (0..3) регистра MSR контролируют изменения сигналов на входах CTS,RTS,RI,DCD микросхемы и вырабатывают прерывание микропроцессора.

Бит 0. DCTS(Delta Clear To Send) — Изменение состояния сигнала CTS(очищен для передачи).Бит устанавливается в DCTS=1 при изменении сигнала CTS на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора.

Бит 1. DDSR(Delta Data Set Ready) — Изменение состояния сигнала DSR(установка данных готова).Бит устанавливается в DDSR=1 при изменении сигнала DSR на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора.

Бит 2. ТЕRI(Trailing Edge Of Ring Indicator) — Детектор заднего фронта сигнала RI(индикатор звонка). Бит устанавливается в TERI=1, когда сигнал на выводе микросхемы RI изменяет свой уровень с низкого на высокий. Бит сбрасывается в TERI=0 при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора.

Бит 3. DDCD(Delta Data Carrier Detect) — Изменение состояния сигнала DCD(обнаружен носитель информации).Бит устанавливается в DDCD=1 при изменении сигнала DCD на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора.

Бит 4. CTS(Clear To Send) — Состояние линии CTS. Если CTS=1, то на вход CTS СОМ-порта подано напряжение +12в(сигнал CTS активен).Если CTS=0, то вход СОМ-порта подано напряжение -12В(сигнал CTS пассивен). В режиме диагностики этот бит эквивалентен биту RTS регистра MCR.

Бит 5. DSR(Data Set Ready) — Состояние линии DSR. Если DSR=1, то на вход DSR СОМ-порта подано напряжение +12в(сигнал DSR активен).Если DSR=0, то вход СОМ-порта подано напряжение -12В(сигнал DSR пассивен). В режиме диагностики этот бит эквивалентен биту DTR регистра MCR.

Бит 6. RI(Ring Indicator) — Состояние линии RI. Если RI=1, то на вход DSR СОМ-порта подано напряжение +12в(сигнал RI активен).Если RI=0, то вход СОМ-порта подано напряжение -12В(сигнал RI пассивен). В режиме диагностики этот бит эквивалентен биту OUT1 регистра MCR.

Бит 7. DCD(Data Carrier Detect) — Состояние линии DCD. Если DCD=1, то на вход DCD СОМ-порта подано напряжение +12в(сигнал DCD активен).Если DCD=0, то вход СОМ-порта подано напряжение -12В(сигнал DCD пассивен). В режиме диагностики этот бит эквивалентен биту OUT2 регистра MCR.

SCR-регистр временного хранения (чтение/запись)
(Scratch Pad Register)

Рис.25 Регистр SCR (Адрес=07h, RD/WR)

Регистр временного хранения, на работу UART не влияет, предназначен для временного хранения данных (в UART i8250 отсутствует).

 




Последнее изменение этой страницы: 2016-04-21; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 35.172.136.29 (0.015 с.)