[an error occurred while processing this directive] [an error occurred while processing this directive]
Вопросы о работе с RS-портом в ДОС-ских программах (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Беня 26 октября 2001 г. 15:37

Есть программа под DOS (запускается она из-под Windows), которая работает с RS-232. Хочется попробовать сделать прием и передачу с использованием аппаратной буферизации. По правилам хорошего тона, нужно вначале определить, а есть ли в данном UART-е аппаратная буферизация. Есть следующие типы UART :
UART 8250 не имеет регистра расширения.
UART 16450 не имеет внутренних буферов FIFO.
UART 16550 имеет внутренние буфера FIFO, но с ошибками.
UART 16550A не содержит ошибок при реализации FIFO.

Знания по этой теме я черпал из книги Фроловых "Программирование модемов" из серии "Библиотека системного программиста" (это том 4). Эта книга доступна на http://beda.stup.ac.ru/psf/ziss/wmaster/books/frolov/bsp/V04/HOME.HTM
(ее можно Телепортом скачать) или же то же самое в книге "Модемы и факс-модемы. Программирование для MS-DOS и Windows" (это том 16), хотя его на этом сайте нет.
(http://beda.stup.ac.ru/psf/ziss/wmaster/index.htm - вся коллекция WEB-мастера).

На сайте доступны и исходники программ, которые поставлялись к книгам на дополнительной дискете. Там Фроловы приводят описание метода определения типа UART и уже готовую программу.
У меня довольно современный Pentium 3, у которого явно UART не столетней давности с ошибками, а какой-то новый.
Так вот программа (запускается под WIN 98) после анализа выдает довольно странные результаты :
1. COM1 = UART 16450, COM2 = UART 8250 (разные !!!)
2. После разных перезапусков Windows, были получены другие результаты : COM1 = UART 16450, COM2 = UART 16450 (уже лучше !!!)
3. Выключил компьютер и загрузился с загрузочной дискетки, получил :
COM1 = UART 8250, COM2 = UART 8250 (стало хуже !!!)

Так вот вопрос - что бы это значило и как все-таки можно определить тип UART ? А может просто уже выпущен какой-то поновее UART, который "не поддается" анализу, описанному в книге Фроловых ?


P.S. Метод определения (цитата из книги):
Согласно особенностям микросхем UART возможен следующий алгоритм определения их типа:

Читаем и сохраняем значение регистра расширения. Адрес регистра расширения определяем как базовый адрес плюс семь (base_adr + 7)
Записываем в регистр расширения какое-либо число, например 0A5h
Снова считываем значение регистра расширения и сравниваем его с числом, ранее записанным в него (0A5h). Если эти значения не равнозначны, значит регистр расширения отсутствует и, следовательно, тестируемая микросхема - UART 8250
Затем опять запоминаем в регистре расширения другое число, например 5Ah
Снова считываем значение регистра расширения и сравниваем его с ранее записанным числом. Если эти значения не одинаковы, значит регистр расширения отсутствует и следовательно, тестируемая микросхема - UART 8250
Восстанавливаем величину, изначально хранившуюся в регистре расширения
Считываем и сохраняем регистр управления прерываниями
Запоминаем единицу в регистре FCR (регистр управления режимом буферизации, подробно описан ниже)
Считываем значение регистра управления прерываниями. Если бит D7 сохраненного регистра управления прерываниями очищен, запоминаем единицу в регистре FCR
Если бит D6 регистра управления прерываниями содержит единицу, тестируемая микросхема - UART 16550A
Если бит D7 регистра управления прерываниями содержит единицу, тестируемая микросхема - UART 16550
В противном случае тестируемая микросхема - UART 16450.

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

Ответы



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

E-mail: info@telesys.ru