прямая запись в порты что говорит?(+).Теряются только при приеме или и при отправке тоже?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено goshka 02 июля 2003 г. 09:44
В ответ на: Процедура возвращающая статус говорит все оК отправлено kos 02 июля 2003 г. 09:28


Изменения в регистрах UART 16550A

В этой главе мы рассмотрим изменения в
форматах регистров UART 16550A по сравнению
с UART 8250.

Начнем с регистра идентификации
прерывания. Этот регистр доступен
только для чтения. По сравнению с UART 8250
в нем добавлены два бита - D6 и D7, которые
показывают статус буфера FIFO.

Если биты D7 и D6 оба равны единице, то
разрешено использование буферизации
(FIFO). Если же только бит D7 содержит
единицу, это означает, что вы имеете
дело с микросхемой UART 16550. В ней режим
буферизации реализован с ошибками, и
использовать его не надо.

Бит D3 используется для сигнализации
таймаута. Он устанавливается в том
случае, если буфер FIFO содержит данные,
которые необходимо прочитать. Это
случается после небольшого промежутка
времени, если в буфер не поступают
новые символы.

Если бит D3 содержит единицу, то бит D2
также содержит единицу. Это означает,
что буфер приемника содержит данные.

Для микросхем UART 8250 и 16450 биты D3, D6 и D7
всегда содержат нули. Биты D4 и D5 не
используются во всех рассматриваемых
микросхемах.

Для управления режимом буферизации UART
16550A имеет дополнительный регистр -
регистр управления буферизацией FIFO.
Этот регистр разделяет общий адрес с
регистром идентификации прерываний -
base_adr + 2. Но в отличие от регистра
идентификации прерываний, доступного
только для чтения, этот регистр
доступен только для записи.

Итак, регистр управления режимом
буферизации имеет следующий формат:
7 6 5 4 3 2 1 0
--T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
¦ ¦ LT- ¦ ¦ ¦ L= Разрешение буферизации. При D0, равном
¦ ¦ ¦ ¦ ¦ ¦ единице, буферизация разрешена
¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ L=== Сброс приемного буфера
¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ L===== Сброс буфера передатчика
¦ ¦ ¦ ¦
¦ ¦ ¦ L======= Выбор режима прямого доступа
¦ ¦ ¦
¦ ¦ L========== Не используются
¦ ¦
¦ L============= Триггер приемника (LSB)
¦
L=============== Триггер приемника (MSB)

* D0. Установка этого бита в единицу
разрешает использование буферизации
для принимаемых и передаваемых данных.
Этот бит должен содержать единицу, если
какой-либо из других битов содержит
единицу.
* D1. При установке этого бита в единицу
буфер приемника очищается. Затем бит
автоматически сбрасывается в ноль.
* D2. При установке этого бита в единицу
буфер передатчика очищается. Затем бит
автоматически сбрасывается в ноль.
* D3. Бит не используется на большинстве
последовательных асинхронных
адаптерах.
* D7, D6. Управление прерываниями от
приемника. Если буферизация
отсутствует, то прерывание происходит
всякий раз при приеме нового символа. С
разрешенной буферизацией UART может
генерировать прерывание при получении
заданного количества символов:


Биты D7 D6Количество символов 001 байт014
байта108 байт1114 байт

Как использовать буферизацию?

Обычно без использования буферизации
UART генерирует прерывание всякий раз,
когда передается или принимается
очередной символ. В результате при
скорости 2400 бод прерывания происходят
с частотой 240 прерываний за одну
секунду. Это не очень много, но при
увеличении скорости до максимально
возможной - 115200 бод за секунду -
происходит уже 11520 прерываний. 11520
прерываний за одну секунду - это уже
много. При использовании буферизации
при той же скорости количество
прерываний можно резко сократить. Так,
при генерации прерываний каждые 14
символов (бит регистра управления
буферизацией D7 = 1, D6 = 1) за секунду
произойдет только 822,86 прерываний.

При приеме данных наблюдается
аналогичная картина, за исключением
того, что можно изменить число
символов, которое необходимо получить
для генерации прерывания. Когда
принимается необходимое число
символов генерируется прерывание, но
все остальные символы, поступающие в
приемник, также размещаются в буфере.
При этом прерывание при получении
данных не очищается до тех пор, пока в
буфере не станет меньше символов, чем
определено битами D7, D6.

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

¦ Когда для определения причины
прерывания считывается регистр
идентификации прерывания, надо
использовать только три младших бита.
Для этого можно замаскировать
полученное значение числом 07h

¦ После обычной инициализации UART надо
разрешить использование буферизации,
записав в регистр управления
буферизацией число 0C7h. При этом будет
разрешено использование буферизации,
произведена очистка буферов приемника
и передатчика, а также вызвана
генерация прерываний при записи в
буфер приемника больше 14 символов.
После этого следует прочитать
содержимое регистра идентификации
прерываня (по тому же адресу). Если бит D6
этого регистра не установлен, то ваша
микросхема UART не является 16550A. И вам
следует запретить использование
буферизации, записав ноль в регистр
управления буферизацией.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru