Програмування модемів

2.10. Сучасні мікросхеми UART

Фактично мікросхема UART 8250 у її вихідному вигляді використовувалася лише у старих моделях комп'ютерів IBM PC. Сучасні мікросхеми - UART 16450, 16550 і 16550A, виготовлені за новою технологією, дозволяють досягти більш високої швидкості обміну даними, а також мають нові апаратні можливості. У цьому розділі ми розглянемо основні відмінності між 8250 та новими мікросхемами, а також наведемо додаткову інформацію щодо програмування UART 16550A.

Як визначити тип мікросхеми UART

Як визначити, яка з цих мікросхем встановлена ​​на вашому асинхронному адаптері? Крім можливості заглянути в документацію, існує ще один спосіб (для програми цей спосіб єдиний, адже вона не може ознайомитися з документацією). Фактично цей спосіб заснований на відмінностях особливостей мікросхем UART. Нижче наведено особливості мікросхем UART різних типів:

  • UART 8250 не має регістру розширення.
  • UART 16450 не має внутрішніх буферів FIFO.
  • UART 16550 має внутрішні буфери FIFO, але з помилками. Біт D7 регістру управління перериваннями (IIR) дорівнює одиниці, а біт D6 - нулю.
  • UART 16550A не містить помилок під час реалізації FIFO. Біти D7 та D6 регістру управління перериваннями (IIR) дорівнюють одиниці.

Тепер наведемо програму, що реалізує викладений алгоритм. У програмі використовуються створені нами функції is_UART_8250() і is_UART_FIFO(). Перша дозволяє визначити по відсутності регістра розширення мікросхему UART 8250, а друга за особливостями реалізації внутрішнього буфера даних розрізняє інші типи мікросхем.

Зміни в регістрах UART 16550A

У цьому розділі ми розглянемо зміни у форматах регістрів UART 16550 у порівнянні з 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 не використовуються у всіх мікросхемах, що розглядаються.

Отже, регістр управління режимом буферизації має такий формат:

  • 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