Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM PDC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
beer_warrior
По сложившейся на 8-битниках практике есть два подхода к чтению UART
1. while(! UART_interrupt_flag), а сразу за ним анализ пришедшего символа.
2.По прерыванию кладем байт в буффер, сдвигаем указатель.
Тут возможны два варианта обработки пакета:
2.1 Счет символов для пакета фиксированной длинны.
2.2 В процедуре прерывания проверка на стартовый или завершающий символ с выставлением флага
Как усложненный вариант - поиск заданной последовательности.
Все эти варианты проходились и для каждого известны стандартные решения.
А вот сейчас понадобился прием сложных пакетов на SAM, очень хочеться воспользоваться PDC,
однако не понятно с какой стороны взяться.
Технически понятно инитим PDC, назначаем буфера, привязываем к UART и все данные
сами падают нам в память...
Однако эти данные потом нужно вытянуть и обработать. К какому событию привязаться, как искать
стартовую последовательность. И не проще ли будет в данном случае воспользоваться старыми добрыми наработками с 51-x и AVR.
За примеры и ссылки буду признателен крайне.
aaarrr
Тут все зависит от формата обмена. Если обмен пакетный - очень удобно привязываться к
RX Timeout. Если же идет поток (например, SLIP) - я предпочитаю складывать данные в
промежуточный FIFO (неважно, с участием PDC, или без), и уже в основной программе заниматься разбором.
beer_warrior
Т.е. в случае пакетного обмена мы взводим US_IER->TIMEOUT и когда нарисуется пауза забираем на обработку?
А ежели нужно выловить в последовательности стартовый символ?
nameless
Прямо сейчас пытаюсь реализовать:

- Делаем кольцевой буфер
- Топ растет с принятыми по прерыванию байтиками
- Топ_шадоу пока нуль
- Ловим момент, когда разность (кол-во прилетевших байт) попадает в разрешенные для пакетов разной длины
- Проверяем (если попадаем) стартовый символ
- Интерпретируем / обрабатываем весь пакет, а если не успеваем по скорости - копируем в буфер
- Приращаем Топ_шадоу на длину пакета.

Уважаемые профи: покритикуйте пожалуйста.
aaarrr
Цитата(beer_warrior @ May 22 2006, 15:33) *
Т.е. в случае пакетного обмена мы взводим US_IER->TIMEOUT и когда нарисуется пауза забираем на обработку?

Да, именно так.

Цитата(beer_warrior @ May 22 2006, 15:33) *
А ежели нужно выловить в последовательности стартовый символ?

Так как автоматики для поиска символа нет, вариантов два:
- Не использовать PDC
- Искать вручную в буфере
beer_warrior
Спасибо, вопросов больше не имею.
defunct
Цитата(beer_warrior @ May 22 2006, 11:15) *
Однако эти данные потом нужно вытянуть и обработать. К какому событию привязаться, как искать
стартовую последовательность. И не проще ли будет в данном случае воспользоваться старыми добрыми наработками с 51-x и AVR.
За примеры и ссылки буду признателен крайне.

imho конкретно в случае с UART'ом лучше воспользоваться старыми наработками варианта 2.2. По причине того, что PDC есть не во всех ARM'ах, да и выделение пакетов, принятых с помощью PDC в итоге займет больше времени чем по прерыванию.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.