-Музыка

Нестандартные скорости UART MSCOMM32

Воскресенье, 18 Июня 2017 г. 17:06 + в цитатник

Удалось связаться с AVR по UART через MSCOMM32.OCX на скорости 250000 бод. Частота кварца избыточная - 16 МГц. Действительно и для Arduino. Как? Подсказка на VBForums, используем Win32 API SetCommState и GetCommState из Kernel32. Немного костылей в выборе менюшки скоростей, т.е. для галочки открываем порт на допустимой стандартной скорости 115200, а затем уже задаём любую, вплоть до 2МБит.


AVR software uart 250000 baud (452x115, 5Kb)
MSComm 250000baud (206x172, 13Kb)

Сразу оговорюсь, что UART со стороны AVR программный, поэтому скорость такая низкая. Схемотехнически у меня программный RX/TX висит на свободных ногах ATMega328P, потому как аппаратный занят шиной данных с NAND флешкой.



Итак, управляющая программа на VB6 использует компонент MSComm и разрешает из коробки подключаться только на следующих скоростях (бит/с, бод): 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200, 128000, 256000. Успехом увенчалась попытка подключения на 128000, а 256000 уже не приводила к желанному результату увидеть ответ устройства по UART. Возможно, дело в том, что если для аппаратного приёмопередатчика UART можно запросто подобрать скорость UART в зависимоти от частоты задающего генератора, то для программного, который зависит от кучи прерываний и лагов обработчика, высокие частоты упираются уже не в последнюю милю кабеля и разводку с экранировкой, а в специфику работы программного UART. Боюсь предположить, но аппаратный UART на AVR в теории может давать бодрейт до 2 МБит/с, т.е. 2000000. Разумеется, со стороны компьютера я ловлю его не через родной COM-порт материнки, а через преобразователь CH340G, который стоит в каждой ардуине, и его предел аппаратных возможностей с подобающей обвязкой по даташиту заканчивается как раз таки на 2 Mbps. Это ограничение уже упирается в физическую реализацию последней мили - длину проводов USB, разводку на плате, конденсаторы и качество кабеля.



Что я получил на скоростях 250 КБит/с? Чтение блока с флешки (135168 байт) за 6,16 секунд. Запись, правда, до сих пор ограничивается скоростью в 135168 байт за 35,9 сек, что обусловлено моей осторожностью и программными задержками при записи в NAND flash. Однако мой любимый дисплейчик ❤️️ LCD 160x128 16 битного цвета заполняется из флешки полностью картинкой за 215 мс, то есть можно глядеть кино с FPS ~5 кадров/сек., что я считаю пределом для 16 МГц, софтварном SPI через дрыганье ногами и попутном чтении с флешки, то смею предположить, что видеобуфер (ОЗУ дисплея) составляет 40 960 байт, и по UART напрямую при скорости 250 КБит заполнится за 2 секунды. Всё равно медленно, чтение флешки размером в 1 ГБ (NAND flash K9K8G08U0M-PIB0) займёт 14 часов.


Однако команда CLS, оформленная AVR-ASM просто дёрганьем CLK дисплея при постоянной единице на шине DATA очищает 160х128 за 0,105 сек, то есть за 105 мс., что как бы намекает на непредельность скорости. То есть используя полупрограммный-полуаппаратный SPI из-за того, что 9-й бит приходится дёргать вручную, остальные 8 будет слать аппаратный SPI, при быстром ОЗУ контроллера я бы смог добиться скорости вывода одного экрана (не пустого) за 105 мс при скорости UART в 1,5...2 МБит. Без промежуточной флешки, а картинку бы формировал на стороне компьютера. Тогда и кино в 10 FPS можно было бы крутить.


AVR Parallel output for Nokia 1616 LCD (700x451, 108Kb)

А самым забавным решением было бы применение внешнего аппаратного SPI, который из параллельной шины делает последовательную, и клок дёргать вручную. Однако это то же самое, что и полупрограммный SPI, потому как совсем блокируется возможность передавать данные в обратную сторону от дисплея (читать ОЗУ дисплея, SPFD54124B это позволяет). Но это уже больная фантазия.

Рубрики:  этот удивительный мир вокруг нас
Метки:  



 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку