|
|
  |
Как работать с PDC у SAM7S? |
|
|
|
Jul 18 2006, 07:13
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
Как я понял, для каждого контроллера (например usart'а) есть 2 буфера приёма и 2 буфера отправки.
Приём данных я делаю так: Сначала указываю макс. размер данных и адрес памяти, куда класть. Потом, при приёме данных, смотрю, на сколько изменилось число (на сколько уменьшилось) в регистре, куда я макс. размер данных положил. Считываю это число байт слева от текущего места записи (т.е. ели массив имеет адрес 0x100, а записалось уже 8 байт, то считываю память по адресу 0x100-0x108). Также делаю прерывание по переполнению буфера, где переношу указатель справа налево (т.е. зацикливаю запись по кругу). При считывании данных из буфера также учитываю этот момент.
А что делать с записью данных? Писать-то нужно их справа от текущего указателя, а он постоянно и независимо от меня, перемещается. Т.е. я могу записать данные, а часть байт останутся слева от указателя. Как вообще грамотно организовать работу с этими буферами приёма и отправки и зачем сделано по 2 таких буфера?
Сообщение отредактировал Pasha 111 - Jul 18 2006, 07:14
|
|
|
|
|
Jul 18 2006, 08:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Передача. Делается буфер, в него кладуться данные.В хх_TPR записыватся указатель на буфер, в хх_TCR его размер. Дальше срабатывает автомат.По достижении 0 хх_TCR выставляется флажок ENDTX. Его можно поллить или запускать прерывание. По его взводу мы принимаем решение о передаче новой посылки или об останове. Если передаем дальше, заново инитим указатель и размер. Прием. Аналогично.В хх_RPR указательна буфер приема, в хх_RCR его размер. После этого разрешаем прием. Прерывание в этом случе можно использовать ENDRX, если посылка фиксированного размера, TIMEOUT, если неизвестного, или отлов символа завершителя или флагов ошибки. Тут надо обратить внимание, что для разных типов прерываний флажки снимаються по разному.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 18 2006, 09:22
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Гхм как это по 2 буфера? Нет там такого, буфер на прием, буфер на передачу и все, для каждого модуля: USART0, USART1, DBGU, SPI, SSC. Для АЦП, естественно, только на прием.
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Jul 18 2006, 09:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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
|
|
|
|
|
Jul 18 2006, 09:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
2 aaarrr: Спасибо за дополнение. Может посоветуюте что-н по моему вопросу о AD73311? Цитата есть 2 буфера приёма и 2 буфера отправки. Не путайтесь. Никаких специальных буферов нет, есть 2 пары аппаратных указателей с автоинкрементом.Буфер делается ручками.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|