Полная версия этой страницы:
SAM PDC
beer_warrior
May 22 2006, 08:15
По сложившейся на 8-битниках практике есть два подхода к чтению UART
1. while(! UART_interrupt_flag), а сразу за ним анализ пришедшего символа.
2.По прерыванию кладем байт в буффер, сдвигаем указатель.
Тут возможны два варианта обработки пакета:
2.1 Счет символов для пакета фиксированной длинны.
2.2 В процедуре прерывания проверка на стартовый или завершающий символ с выставлением флага
Как усложненный вариант - поиск заданной последовательности.
Все эти варианты проходились и для каждого известны стандартные решения.
А вот сейчас понадобился прием сложных пакетов на SAM, очень хочеться воспользоваться PDC,
однако не понятно с какой стороны взяться.
Технически понятно инитим PDC, назначаем буфера, привязываем к UART и все данные
сами падают нам в память...
Однако эти данные потом нужно вытянуть и обработать. К какому событию привязаться, как искать
стартовую последовательность. И не проще ли будет в данном случае воспользоваться старыми добрыми наработками с 51-x и AVR.
За примеры и ссылки буду признателен крайне.
aaarrr
May 22 2006, 10:23
Тут все зависит от формата обмена. Если обмен пакетный - очень удобно привязываться к
RX Timeout. Если же идет поток (например, SLIP) - я предпочитаю складывать данные в
промежуточный FIFO (неважно, с участием PDC, или без), и уже в основной программе заниматься разбором.
beer_warrior
May 22 2006, 11:33
Т.е. в случае пакетного обмена мы взводим US_IER->TIMEOUT и когда нарисуется пауза забираем на обработку?
А ежели нужно выловить в последовательности стартовый символ?
nameless
May 22 2006, 11:48
Прямо сейчас пытаюсь реализовать:
- Делаем кольцевой буфер
- Топ растет с принятыми по прерыванию байтиками
- Топ_шадоу пока нуль
- Ловим момент, когда разность (кол-во прилетевших байт) попадает в разрешенные для пакетов разной длины
- Проверяем (если попадаем) стартовый символ
- Интерпретируем / обрабатываем весь пакет, а если не успеваем по скорости - копируем в буфер
- Приращаем Топ_шадоу на длину пакета.
Уважаемые профи: покритикуйте пожалуйста.
aaarrr
May 22 2006, 11:48
Цитата(beer_warrior @ May 22 2006, 15:33)

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

А ежели нужно выловить в последовательности стартовый символ?
Так как автоматики для поиска символа нет, вариантов два:
- Не использовать PDC
- Искать вручную в буфере
beer_warrior
May 22 2006, 11:55
Спасибо, вопросов больше не имею.
defunct
May 23 2006, 14:22
Цитата(beer_warrior @ May 22 2006, 11:15)

Однако эти данные потом нужно вытянуть и обработать. К какому событию привязаться, как искать
стартовую последовательность. И не проще ли будет в данном случае воспользоваться старыми добрыми наработками с 51-x и AVR.
За примеры и ссылки буду признателен крайне.
imho конкретно в случае с UART'ом лучше воспользоваться старыми наработками варианта 2.2. По причине того, что PDC есть не во всех ARM'ах, да и выделение пакетов, принятых с помощью PDC в итоге займет больше времени чем по прерыванию.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.