Это не реализовать. Т.к. надо вычитывать приемный буфер, а канал DMA по приему SPI используется для заполнения передающего FIFO.Роман писал(а): ↑12 фев 2018, 11:40 Было такое предположение (на случай если запуск дма работает по тому же сигналу что контроллер прерываний): записал в передающий фифо 4 элемента, они передались (соответсвенно CS в 1) и ответ оказался в приёмном фифо -> возникло событие (по времени совпадающее с irq), запускающее дма на передачу и т.д.
Т.е. вы записали 4 элемента в передающее фифо, они передались, CS в 1, DMA стартанул по каналу SPI RX и записал новые 4 байта в передающее фифо. При этом данные из SPI не были вычитаны, и запрос к DMA выставляется повторно, в передающее FIFO пишется еще 4 байта сразу же. И дальше он снова будет писать в передающее фифо, пока не выполнит все передачи, т.к. запрос висит. При этом через прерывание SPI вы не успеете опустошить приемное фифо - DMA будет быстрее и успеет несколько раз подряд передать подряд по 4 байта.
А если, скажем, использовать канал DMA - SPI RX для вычитывания буфера куда-нибудь в пустоту, то за счет DMA канала SPI TX необходимое поведение не реализовать.
В итоге, тут необходимо или иметь размер элемента до 32 бит, или контролировать всё программно, через прерывания - что вроде как вы и делаете.