Цитата(sifadin @ May 31 2014, 20:35)

SPI железный, в режиме SLAVE, фифо есть он выключен
байты группируются в кадры по 12штук, те 3три 32бит слова
Зачем выключен FIFO???
Цитата(sifadin @ May 31 2014, 20:35)

между кадрами интервал 30мкс
частота spi 2мгц
проц 10мгц
DMA-контроллер скорей всего тактируется от тех-же 10МГц и шина внутри МК - тож.
А 2МГц - это уже в таком случае должно хорошо нагружать шину.
По-крайней мере у меня на LPC1758 SPI на 2МГц работающий через DMA и CPU на 6МГц уже возникали иногда
overflow SPI.FIFO. И это при том что у меня FIFO включен! Правда у меня ещё параллельно несколько каналов DMA
работало. Но всё равно - пришлось снизить частоту SPI - помогло.
Какой у вашего CPU приоритет доступа к шине и какой приоритет у DMA-контроллера?
Подумайте что будет, если у CPU приоритет доступа выше, он делает fetching блока инструкций (из-за выполнения инструкции перехода например),
а в это время DMA надо в память записать, а вы ещё и FIFO отключили...
Ещё неизвестно - на какой шине сидит ваш SPI, и к каким шинам обращается CPU - возможно к низкочастотным и из-за этого
могут возникать ожидания. А у вас DMA-контроллеру срочно записать данные надо.
И вообще - вы обрабатываете события переполнения SPI?
Совет (в порядке убывания важности):
сделайте приоритет доступа к шине для DMA выше чем для CPU (если это позволяет SAM4L),
включайте FIFO, повышайте частоту CPU (шины), если есть возможность - понижайте частоту SPI.
PS: Да, у вас-же два DMA-канала используются - для SPI.TX и для SPI.RX. Надеюсь для TX-канала Вы поставили приоритет ниже, чем для RX-канала?
PPS: Также полезно строить циклы ожидания флага не так как у вас -
while(!blocktowrite) - это-же загружает шину непрерывными бессмысленными транзакциями чтения -
одно только это может забивать шину (если у CPU приоритет доступа к шине выше чем у DMA).
Полезно в таком цикле выполнять инструкцию WFE (или WFI) если уж у вас без ОС. Или использовать ОС, выполняющую в Idle-процессе эти же WFE/WFI.