Администрирование Разное Конфигурирование скорости микросхем FTDI Wed, November 13 2019  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Конфигурирование скорости микросхем FTDI Печать
Добавил(а) microsin   

Одна из базовых операций с микросхемами FT232R, FT2232 (в режиме UART) и FT232B это установка скорости виртуального порта UART (Baud Rate). В этом апноуте (перевод [1]) описываются различные способы конфигурирования скоростей чипов FTDI. Также здесь описывается, как использовать нестандартные скорости UART микросхем FTDI, включая так называемую технику псевдонимов (aliasing) для стандартных скоростей, когда одна скорость подменяется на другую.

Второе поколение микросхем FT232B USB UART добавило дополнительную гранулярность для делителя, используемого для генерации требуемой скорости устройства. Это позволило реализовать большее количество возможных скоростей FT232B в сравнении с предыдущей реализацией FT8U232AM.

[Установка Baud Rate]

Когда используются драйверы виртуального COM-порта (FTDI Virtual COM Port, сокращенно VCP), скорость (Baud Rate) может быть установлена в Менеджере Устройств операционной системы Windows, или из приложения, которое работает с COM-портом. Когда Baud Rate устанавливается из программы приложения, то это делается так же, как и для стандартного COM-порта Windows - путем простой передачи требуемого значения Baud Rate в порт с помощью вызова Windows VCOMM API функции или с помощью библиотеки COM-порта. Этим способом могут быть установлены как стандартные, так и нестандартные значения Baud Rate.

При использовании драйвера прямого доступа D2XX компании FTDI функция FT_SetBaudRate [] может быть использована для установки как как стандартных, так и нестандартных значений Baud Rate.

Если нужна нестандартная скорость Baud Rate, то требуется определить по формуле (она приведена в этом апноуте), можно ли достичь нужной скорости с определенной точностью. Если требуемое значение Baud Rate установить можно, то оно просто предается драйверу как обычное значение скорости, и требуемый делитель будет вычислен драйвером самостоятельно. Для D2XX больше не требуется обязательное использование функции FT_SetDivisor, однако её реализация оставлена для сохранения обратной совместимости с уже готовым ПО.

Вычисление Baud Rate. Скорость виртуального COM-порта для микросхем FT232R, FT2232 (в режиме UART) или FT232B генерируется с использованием внутренней тактовой частоты чипа 48 МГц. Это входная частота для внутренней схемы генератора Baud Rate, где она делится на 16 и затем поступает на прескалер как частота тактов 3 МГц. Затем 3 МГц делится с нужным коэффициентом, чтобы получить требуемую скорость Baud Rate для встроенной схемы UART. Значение делителя определяется целым коэффициентом плюс дополнительным дробным коэффициентом. Старая реализация FT8U232AM допускала только три возможных дробных коэффициента делителя - 0.125, 0.25 или 0.5. Более современные микросхемы FT232R, FT2232 (в режиме UART) и FT232B поддерживают еще 4 дополнительных дробных коэффициента прескалера - 0.375, 0.625, 0.75 и 0.875. Таким образом получаются следующие возможные для делителя Baud Rate (здесь n целое число в диапазоне от 2 до 16384):

Делитель = n + 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875

Замечание: если Делитель равен 1 и 0, то это специальные случаи. Делитель = 0 даст скорость 3 MBaud, Делитель = 1 даст скорость 2 MBaud. Использование дробных коэффициентов между значениями Делителя 0 .. 2 не допускается.

Таким образом, необходимое значение делителя для определенного значения Baud Rate находят путем деления 3000000 на значение Baud Rate.

Точное значение Baud Rate может быть недостижимо, однако пока реальное используемое значение Baud Rate находится в пределах точности +/-3% от требуемого Baud Rate, то последовательный линк связи должен работать без ошибок. Если драйверу передается значение Baud Rate, которое не позволяет применить точный коэффициент деления, то выбирается максимально близкий коэффициент из возможных, чтобы полученная скорость Baud Rate находилась в пределах погрешности +/-3% от требуемой.

Пример: требуется нестандартная скорость 490000 бод. Требуемое значение делителя:

3000000 / 490000 = 6.122

Ближайшее допустимое значение делителя 6.125, что даст реальную скорость 3000000 / 6.125 = 489795.9, что хорошо укладывается в предел возникновения ошибок +/-3%. Таким образом, можно передать драйверу 490000, и устройство будет осуществлять безошибочный обмен данными.

[Aliasing Baud Rates]

Файл настроек драйвера FTDIPORT.INF содержит записи, которые используются в качестве делителей для стандартных скоростей. Путем изменения этих значений можно устроить псевдоним (alias) стандартных скоростей, которые в реальности будут функционировать с нестандартными значениями скорости. Например, таким способом можно заменить стандартную скорость 115 kBaud на 512 kBaud. Тогда пользователи FT232R, FT2232 (в режиме UART) или FT232B для работы на скорости 512 kBaud должны выбрать стандартную скорость 115 kBaud. Технология подмены скоростей называется псевдонимами скоростей (Aliasing Baud Rates, алиасинг скорости).

Алиасинг с использованием оригинальных дробных делителей. Есть две секции файла FTDIPORT.INF, которые можно поменять - одна для Windows 98 и Windows Millennium Edition (Windows ME), и другая для Windows 2000 и Windows XP. Запись для Windows XP показана ниже, где соответствующие поля показаны жирным шрифтом. Запись для Windows 98/Windows ME примерно такая же, и она меняется теми же самыми, описанными ниже шагами. Запись с коэффициентами скоростей находится под заголовком FtdiPort232.HW.AddReg.

[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,01,00,3F,3F,10,27,88,13,C4,09,E2,04,71,02,38,41,9c,80,4E,C0,34,00,1A,00,
0D,00,06,40,03,80,00,00,d0,80

Каждое поле состоит из пары байтов, указанных в порядке Byte0,Byte1. Биты от 13 до 0 задают целочисленный коэффициент, в то время как биты 16 .. 14 задают дробный коэффициент следующим образом:

15,14 = 00 дробная часть делителя 0
15,14 = 01 дробная часть делителя 0.5
15,14 = 10 дробная часть делителя 0.25
15,14 = 11 дробная часть делителя 0.125

Коэффициент может быть распакован из каждой записи несколькими простыми шагами, как показано в примере ниже для последовательности байт 9c,80:

Шаг 1 - преобразуем байты в 16-битное слово, меняя порядок их следования: 9c,80 => 809c Hex
Шаг 2 - извлекаем дробную часть делителя: 15 = 1, 14 = 0 => дробная часть делителя = 0.25
Шаг 3 - извлекаем целую часть делителя: 13:0 = 009c Hex = 156 Dec
Шаг 4 - комбинируем целую и дробную части делителя: 156.25 Dec
Шаг 5 - делим 3000000 на делитель => 3000000/156.25 = 19200 baud

Список значений для стандартных скоростей:

10,27 => делитель = 10000, скорость = 300 бод
88,13 => делитель = 5000, скорость = 600 бод
C4,09 => делитель = 2500, скорость = 1200 бод
E2,04 => делитель = 1250, скорость = 2400 бод
71,02 => делитель = 625, скорость = 4800 бод
38,41 => делитель = 312.5, скорость = 9600 бод
9C,80 => делитель = 156, скорость = 19230 бод
4E,C0 => делитель = 78, скорость = 38461 бод
34,00 => делитель = 52, скорость = 57692 бод
1A,00 => делитель = 26, скорость = 115384 бод
0D,00 => делитель = 13, скорость = 230769 бод
06,40 => делитель = 6.5, скорость = 461538 бод
03,80 => делитель = 3.25, скорость = 923076 бод
00,00 => ЗАРЕЗЕРВИРОВАНО
D0,80 => делитель = 208.25, скорость = 14406 бод

[920 kbaud для 56 kbaud]

Чтобы задать алиас скорости 920 килобод для стандартной скорости 56 килобод в Windows: поменяйте запись 34,00 на 03,80 (см. значения байт из списка выше).

[197 kbaud для 4800 baud]

Чтобы задать алиас скорости 197 килобод для стандартной скорости 4800 бод в Windows: найдите ближайший подходящий делитель, проверьте точность, с которой этот делитель обеспечивает требуемую скорость, и после этого измените соответствующую запись в INF-файле.

3000000/197000 = 15.228. Самый подходящий делитель 15.25.

3000000/15.25 = 196,721. 196721/197000 соответствует точности 99.8%. Это хорошо укладывается в требуемый допуск 3%.

Установите биты 15:14 в значение 10 для дробной части делителя 0.25, и младшие биты в 0F. После этого замените запись 71,02 на 0F,80.

В результате этих двух изменений запись в FTDIPORT.INF станет следующей:

[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,01,00,3F,3F,10,27,88,13,C4,09,E2,04,0F,80,38,41,9C,80,4E,C0,03,80,1A,00,
0D,00,06,40,03,80,00,00,00,00

Эта запись предназначена для Windows 2000 и Windows XP, те же самые изменения должны быть также повторены в записи для Windows 98/ME.

Алиасинг с использованием дополнительных дробных делителей FT232B. Стандартная таблица скоростей ConfigData файла FTDIPORT.INF поддерживает только оригинальные дробные прескалеры FT8U232AM, но не дополнительные, которые были добавлены с новой реализацией FT232B. Чтобы можно было использовать дополнительные дробные прескалеры, необходима другая запись ConfigData:

[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,
41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,
00,00,00,00,D0,80,00,00

Примечание: разработчик должен скопировать эту запись, и вставить её вместо старой записи в FTDIPORT.INF.

В новой версии ConfigData каждое поле стандартной скорости состоит из 4 байт, расположенных следующим образом: Byte0,Byte1,Byte2,Byte3. Биты 13..0 как и раньше определяют целочисленную часть делителя, а биты 16, 15 и 14 определяют дробную часть делителя следующим образом:

16,15,14 = 000 дробная часть делителя 0
16,15,14 = 001 дробная часть делителя 0.5
16,15,14 = 010 дробная часть делителя 0.25
16,15,14 = 011 дробная часть делителя 0.125
16,15,14 = 100 дробная часть делителя 0.375
16,15,14 = 101 дробная часть делителя 0.625
16,15,14 = 110 дробная часть делителя 0.75
16,15,14 = 111 дробная часть делителя 0.875

Обратите внимание, что новый вариант ConfigData отличается от старой только тем, что каждая запись скорости содержит 4 байта вместо 2 байт. Выделенный красным шрифтом байт в ConfigData (пример выше) это байт Flags, и формат этого поля определяется битом 4 байта Flags. В вышеприведенном примере байт Flags = 11 означает, что бит 4 установлен, и используется 4-байтная запись для установки скорости вместо 2-байтной.

Полный делитель может быть извлечен следующими простыми шагами, как показано ниже на примере для последовательности байт 35,40,01,00:

Шаг 1 - изменение порядка байт: 35,40,01,00 => 00014035 Hex
Шаг 2 - извлечение дробной части; 16 = 1, 15 = 0, 14 = 1 => sub-integer = 0.625
Шаг 3 - извлечение целой части: 13:0 = 0035 Hex = 53 Dec
Шаг 4 - комбинирование друг с другом целой и дробной части делителя: 53.625 Dec
Шаг 5 - деление 3000000 на делитель => 3000000/53.625 = 55944 бод

Список значений для стандартных скоростей:

10,27,00,00 => делитель = 10000, rate = 300
88,13,00,00 => делитель = 5000, rate = 600
C4,09,00,00 => делитель = 2500, rate = 1200
E2,04,00,00 => делитель = 1250, rate = 2400
71,02,00,00 => делитель = 625, rate = 4800
38,41,00,00 => делитель = 312.5, rate = 9600
9C,80,00,00 => делитель = 156, rate = 19230
4E,C0,00,00 => делитель = 78, rate = 38461
34,00,00,00 => делитель = 52, rate = 57692
1A,00,00,00 => делитель = 26, rate = 115384
0D,00,00,00 => делитель = 13, rate = 230769
06,40,00,00 => делитель = 6.5, rate = 461538
03,80,00,00 => делитель = 3.25, rate = 923076
00,00,00,00 => ЗАРЕЗЕРВИРОВАНО
D0,80,00,00 => делитель = 208.25, rate = 14406

[920 kbaud для 56 kbaud]

Чтобы задать алиас скорости 920 килобод для стандартной скорости 56 килобод в Windows: поменяйте запись 34,00,00,00 на 03,80,00,00 (см. значения байт из списка выше).

[197 kbaud для 4800 baud]

Чтобы задать алиас скорости 197 килобод для стандартной скорости 4800 бод в Windows: найдите ближайший подходящий делитель, проверьте точность, с которой этот делитель обеспечивает требуемую скорость, и после этого измените соответствующую запись в INF-файле.

3000000/197,000 = 15.228. Самый лучший делитель из имеющихся 15.25.

3000000/15.25 = 196721 бод. 196721/197000 = 99.8%. Это в пределах допуска 3%.

Установите биты 16:15:14 в 010 для дробной части делителя 0.25, и младшие биты в 0F. Получится двоичное число 0000 0000 0000 0000 1000 0000 0000 1111, или шестнадцатеричное 0x0000800F. Переставьте байты обратно 0F,80,00,00, и замените на эти байты старое значение 71,02,00,00.

Фрагмент файла FTDIPORT.INF, где жирным шрифтом показаны внесенные изменения:

[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,0F,80,00,00,38,
41,00,00,9C,80,00,00,4E,C0,00,00,03,80,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,
00,00,00,00,D0,80,00,00

Эта запись предназначена для Windows 2000 и Windows XP, те же самые изменения должны быть также повторены в записи для Windows 98/ME.

[Ссылки]

1. AN232B-05 Configuring FT232R, FT2232 and FT232B Baud Rates site:ftdichip.com.
2. Дополнительные функции драйвера FTDI.

 

Добавить комментарий


Защитный код
Обновить

Top of Page