Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как работать с PDC у SAM7S?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pasha 111
Как я понял, для каждого контроллера (например usart'а) есть 2 буфера приёма и 2 буфера отправки.

Приём данных я делаю так:
Сначала указываю макс. размер данных и адрес памяти, куда класть.
Потом, при приёме данных, смотрю, на сколько изменилось число (на сколько уменьшилось) в регистре, куда я макс. размер данных положил.
Считываю это число байт слева от текущего места записи (т.е. ели массив имеет адрес 0x100, а записалось уже 8 байт, то считываю память по адресу 0x100-0x108).
Также делаю прерывание по переполнению буфера, где переношу указатель справа налево (т.е. зацикливаю запись по кругу). При считывании данных из буфера также учитываю этот момент.

А что делать с записью данных? Писать-то нужно их справа от текущего указателя, а он постоянно и независимо от меня, перемещается. Т.е. я могу записать данные, а часть байт останутся слева от указателя. Как вообще грамотно организовать работу с этими буферами приёма и отправки и зачем сделано по 2 таких буфера?
beer_warrior
Передача.
Делается буфер, в него кладуться данные.В хх_TPR записыватся указатель на буфер, в хх_TCR его размер. Дальше срабатывает автомат.По достижении 0 хх_TCR выставляется флажок ENDTX.
Его можно поллить или запускать прерывание. По его взводу мы принимаем решение о передаче новой посылки или об останове.
Если передаем дальше, заново инитим указатель и размер.
Прием.
Аналогично.В хх_RPR указательна буфер приема, в хх_RCR его размер. После этого разрешаем прием. Прерывание в этом случе можно использовать ENDRX, если посылка фиксированного размера, TIMEOUT, если неизвестного, или отлов символа завершителя или флагов ошибки.
Тут надо обратить внимание, что для разных типов прерываний флажки снимаються по разному.
SpiritDance
Гхм как это по 2 буфера? Нет там такого, буфер на прием, буфер на передачу и все, для каждого модуля: USART0, USART1, DBGU, SPI, SSC. Для АЦП, естественно, только на прием.
vet
SpiritDance
Есть. По 2 штуки на прием и передачу.
SpiritDance
Да что-то я много упускаю из виду, устал наверно. sad.gif
вторые буферы используются когда закончилось место(или данные) в первом, пришли новые данные, а прерывание не было обработано, насколько я понимаю.
aaarrr
Цитата(beer_warrior @ Jul 18 2006, 12:53) *
Передача.
Делается буфер, в него кладуться данные.В хх_TPR записыватся указатель на буфер, в хх_TCR его размер. Дальше срабатывает автомат.По достижении 0 хх_TCR выставляется флажок ENDTX.
Его можно поллить или запускать прерывание. По его взводу мы принимаем решение о передаче новой посылки или об останове.
Если передаем дальше, заново инитим указатель и размер.


Это для случая с использованием одного буфера.
Для двух последовательность действий будет следующая:
1. В хх_TPR и хх_TCR записываем адрес и размер первого буфера, в хх_TNPR и xx_TNCR - второго.
2. Во время передачи одного буфера заполняем второй данными
3. По прерыванию ENDTX обновляем хх_TNPR и xx_TNCR, возвращаемя к п.2
beer_warrior
2 aaarrr:
Спасибо за дополнение.
Может посоветуюте что-н по моему вопросу о AD73311?
Цитата
есть 2 буфера приёма и 2 буфера отправки.

Не путайтесь. Никаких специальных буферов нет, есть 2 пары аппаратных указателей с автоинкрементом.Буфер делается ручками.
Pasha 111
Всем большое спасибо за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.