Вот отрывок кода предварительного чтения dma-канала:
Код
pdca_channel->mar = (unsigned long)addr; //загрузка указателя данных
pdca_channel->tcr = size; // длина передачи
pdca_channel->cr = AVR32_PDCA_TEN_MASK; // задействовать канал приёма
pdca_channel->cr = AVR32_PDCA_TDIS_MASK; // отключить канал приёма
Как-то не очень похоже на очищение буфера spi, видимо таким образом очищается буфер dma (какой ещё буфер???) Пока не прочитаю в даташите, что это так, не поверю... В описании регистра PDCA Control Register биты TransferEnable и TransferDisable (AVR32_PDCA_TEN_MASK и AVR32_PDCA_TDIS_MASK в коде) соответственно включают и выключают передачу по DMA. Про очитску буферов ничего нет.
Цитата
• TEN: Transfer Enable
0 = No Effect.
1 = Enable transfer for DMA channel.
• TDIS: Transfer Disable
0 = No Effect.
1 = Disable transfer for DMA channel.
Хотя, с другой стороны включение dma-передачи разрешает каналу считать данные из регистра данных приёмника SPI. Но тогда и впрямь простое чтение регистра данных должно быть равносильно активации/декативации канала dma! Попробую всё же ещё раз проверить завтра этот вариант на свежую голову.