Рекомендации по переходу с RS-232 на USB
Источники
- Технические требования к универсальной последовательной шине USB, версия 2.0.
- Определение класса коммуникационного устройства (CDC) универсальной последовательной шины, версия 1.1.
- Демонстрационная программа класса коммуникационного устройства USB.
Сокращения
- USB – универсальная последовательная шина
- CDC – класс коммуникационного устройства
- ACM – абстрактная модель управления
- VID – идентификатор производителя
- PID – идентификатор продукта
Введение
В компьютерном мире наблюдается тенденция исчезновения COM-портов особенно среди портативных компьютеров. На смену им приходит USB-связь. Однако большинство приложений продолжают использовать стандарт RS-232. В этом случае на помощь может прийти одно решение, которое позволяет использовать USB как порт RS-232. Можно выделить следующие преимущества такого решения:
- Нет необходимости изменять программу на персональном компьютере
- Несложные программные и аппаратные изменения во внешнем устройстве
Данным документом преследуется две цели:
- Описание перехода с RS-232 на USB в программе микроконтроллера с использованием библиотеки Atmel USB RS232 виртуального COM-порта.
- Описание методики построения моста USB <-> RS-232 с использованием библиотеки Atmel.
Обзор
Многие приложения используют коммуникационный порт RS-232 для связи между компьютером и внешним устройством.
Рисунок 1 – Исходное приложение
Переход на использование USB-порта характеризуется следующими преимуществами:
- USB присутствует на всех новых компьютерах, а RS-232 уже нет
- Конечное приложение может использовать гибкость USB: буферизация данных, отсутствие потерь данных, автоматическое управление потоком данных и др.
- USB позволяет запитать подключаемое устройство
Многие из этих преимуществ станут доступными при переключении с RS-232 на USB. Но при этом также целью выполнения данного переключения являются минимальные затраты времени и сил.
Архитектура программного обеспечения
Целью реализации виртуального COM-порта является переход с реальной УАПП-системы к УАПП/USB-системе:
Данная архитектура требует очень немного модификаций.
Со стороны ПК не требуется выполнение каких-либо изменений! Доступ к USB-порту происходит через драйвер COM-порта, поэтому, нет необходимости изменять имеющуюся управляющую программу для компьютера.
Со стороны приложения драйвер УАПП необходимо заменить на драйверы УАПП USB. В этом случае вместо вызова функций УАПП необходимо вызывать УАПП-USB функции.
Класс USB CDC
В данном документе описывается подход для реализации класса коммуникационного устройства (CDC) USB, как ISDN-модемов, виртуальных COM-портов и т.д. Более подробная информация по данному классу может быть найдена на www.usb.org .
В целях соответствия COM-порту USB-устройство объявляет 2 интерфейса:
- Модель связи абстрактного управления с одной входной точкой прерывания
- Абстрактная модель управления данными с одной поточной входящей и одной поточной выходящей конечными точками
Загрузка драйвера CDC под Windows®
Класс CDC поддерживается всеми версиями Windows, начиная с Windows 98SE до Windows XP.
После подключения нового USB-устройства Windows проверяет все имеющиеся INF-файлы для загрузки соответствующего драйвера. INF-файл содержит идентификационные данные о производителе и продукте или определение класса USB. Если идентификационные данные или определение класса USB подключенного USB-устройства совпадает с одним из INF-файлов, то Windows загрузит драйвер описанный в этом файле.
Т.к. Microsoft не поддерживает стандартный INF-файл для CDC-драйвера, то Atmel предоставляет INF-файл, который позволяет загрузить этот драйвер под ОС Windows 2000 и Windows XP. После первого подключения пользователь должен указать данный INF-файл, чтобы операционная система определила какой драйвер необходимо загрузить.
Производители USB-продукции могут указывать собственные идентификационные данные (VID – код производителя и PID – код продукции). Для этого необходимо отредактировать данные значения в самом USB-устройстве(config.h) и в INF-файле (см. пример ниже).
Пример INF-файла
; Установочный файл под Windows 2000 и XP для AT89C5131
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%ATMEL%
LayoutFile=layout.inf
DriverVer=10/15/1999,5.0.2153.1
[Manufacturer]
%ATMEL%=ATMEL
[ATMEL]
%ATMEL_CDC%=Reader, USB\VID_03EB&PID_2009
[Reader_Install.NTx86]
;Windows2000
[DestinationDirs]
DefaultDestDir=12
Reader.NT.Copy=12
[Reader.NT]
CopyFiles=Reader.NT.Copy
AddReg=Reader.NT.AddReg
[Reader.NT.Copy]
usbser.sys
[Reader.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[Reader.NT.Services]
AddService = usbser, 0x00000002, Service_Inst
[Service_Inst]
DisplayName = %Serial.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbser.sys
LoadOrderGroup = Base
[Strings]
ATMEL = "ATMEL, Inc."
ATMEL_CDC = "AT89C5131 CDC USB to UART"
Serial.SvcDesc = "USB Serial emulation driver"
|
Библиотека УАПП USB
Элементарные функции
uart_usb_test_hit() |
bit uart_usb_test_hit (void); |
Проверяет принятие хотя бы одной кодовой посылки. |
uart_usb_getchar() |
char uart_usb_getchar (void); |
Возвращает принятый байт в буфере FIFO конечной точки (OUT), если в буфере FIFO имеется хотя бы один байт. Если в стеке нет данных, то данная функция ожидает получение новых данных через USB-порт. |
uart_usb_putchar() |
char uart_usb_putchar (char); |
Записывает байт в буфер FIFO конечной точки (IN). Если данная конечная точка заполняется, то данная функция отправляет весь буфер FIFO главному. |
uart_usb_tx_ready() |
bit uart_usb_tx_ready (void); |
Проверяет возможность записи байта в буфер FIFO конечной точки (IN). |
uart_usb_flush() |
bit uart_usb_flush (void); |
Если в буфере FIFO конечной точки (IN) имеются данные, то данная функция отправляет их. Использование этой функции предотвращает ожидание заполнения буфера FIFO конечной точки (IN) перед отправлением главному (хосту). |
Пример реализации преобразователя USB в RS232
Целью данного примера является реализация очень простого преобразователя USB <-> RS-232:
Прим.: В данном примере не может быть изменена конфигурация УАПП.
Архитектура программы внешнего устройства:
В данной реализации все принятые от УАПП посылки запоминаются в промежуточном буфере во избежание потери данных, когда USB не может обрабатывать данные.
if (uart_test_hit())
{ buff[uart_usb_index++]=uart_getchar();
if (uart_usb_tx_ready())
{ for (j=0;j<uart_usb_index;j++) {uart_usb_putchar (buff[j]); }
uart_usb_index=0;
}
}
if (Uart_tx_ready())
{ if (uart_usb_test_hit()) { uart_putchar(uart_usb_getchar()); } }
|
Пример передачи сообщения "Hello World"
Если в файле config.h определено HELLO_WORLD_DEMO, то стандартные функции STDIO относятся к USB, а не к УАПП. В программе можно использовать непосредственно функцию “printf()”, например, для записи в USB-порт. Сообщение “HELLO WORLD” непрерывно отправляется, если нажать на кнопку INT0 на демонстрационной плате AT89C5131.
Посылка, отправленная в AT89C5131 через виртуальный COM-порт, отображается на экране.
if (P3_2 == 0) { printf ("Hello World\r\n"); }
if (test_hit()) { putchar (_getkey()); }
|
Документация:
|
|
84 Kb Engl Исходный документ |
|
|
96 Kb Engl Примеры программ |
|
|
Rus AT89STK-05 - Starter Kit |
|
|
Rus Интерфейс USB |
|