Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1768 DMA DMX512
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
theBMV
Немного оффтопну сначала:
Юзал LPC2129, ну и пересев на LPC1768, перекинул рутину приема DMX оттуда туда. Ну а что, одинаковая периферия, подумал я. Не заработало. Оказывается в LPC1768 флаг BI поднимается вместе с флагом FE. В LPC2129 поднимался только BI.

А теперь к вопросу:
Хочу заюзать DMA для приема DMX512. Но нужно отлавливать начало, т.е. break-импульс. Как сделать? Софтварно ловить break и включать DMA на прием 512 байтов? А что, если ошибка? Или есть возможность заставить DMA хватать LSR помимо RBR и софтварно уже анализировать массив LSRов? Тогда этот метод ничуть не лучше обычного софтварного.

Может есть какие-то решения? Прошу поделиться.
vladec
По отзывам нашего имбедедного программиста - UART у NXP-шных Кортексов очень плохо приспособлен для DMX512 именно по отработке Брейка и приходится работать по таймеру на высокой частоте прерываний. По его отзывам намного лучше UART у Кортексов от Luminary (TI).
theBMV
ну, сейчас проблем с приемом нет. просто хочется заюзать DMA, раз уж он есть. а ворочать вручную поток 250kbod не так уж накладно по ресурсам.
KnightIgor
Цитата(theBMV @ Sep 28 2011, 08:11) *
ну, сейчас проблем с приемом нет. просто хочется заюзать DMA, раз уж он есть. а ворочать вручную поток 250kbod не так уж накладно по ресурсам.


DMA хорошо пользовать, если известно, сколько байт принимать. В общем случае DMX пакет вовсе не обязательно 513 байт длиной: он может быть и короче. Да и сам BREAK распознавать только по уставлению флагов, которые сигнализируют 11 нулевых битов, также не совсем корректно: согласно спецификации BREAK имеет длину не менее 88us, что следовало бы распознавать, списывая все остальные отклонения на помехи. Но все зависит от заказчика и конкретного приложения.

На мой взгляд, наиболее эффективным был бы комбинированный прием: UART (если возможно), генерирует прерывание только по "ошибке", то есть FE и/или BREAK, а там (пере)программируется и (пере)запускается DMA на прием 513 байт. Если пакет окажется короче, последующий BREAK переинициализирует DMA и, если предусмотрена двойная буферизация, запустит процесс перекачки принятого буфера в рабочий, и т.д.
theBMV
Цитата(KnightIgor @ Sep 28 2011, 11:38) *
Да и сам BREAK распознавать только по уставлению флагов, которые сигнализируют 11 нулевых битов, также не совсем корректно: согласно спецификации BREAK имеет длину не менее 88us, что следовало бы распознавать, списывая все остальные отклонения на помехи.


Флагов вполне хватает. Исытывалось на огромной линейке управляющего оборудования, проблем с распознаванием никогда не было. Прочие ошибки контролируются флагом FE, если поднимается без BI.

Еще идея: нельзя ли разделить? По статусу линии - вызывать прерывание, по приходу данных генерить DMA запрос? Регистр IIR, биты 3-1 (RLS/RDA)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.