Цитата(uriy @ Jun 1 2018, 08:26)

Arlleex и haker_fox раскажите подробней как вы синхронизируете ChipSelect с DMA. Пару лет назад нужно было это сделать на STM32. Я не придумал как это сделать и оставил SPI на прерываниях.
Вот в
этой теме воевал с STM32.
Идея следующая. Смотрим картинку.
Используем один аппаратный таймер. Один канал сравнения настраиваем на переключение ножки по событию сравнения (для этого CS должен быть заведен на аппаратный вывод OC микроконтроллера), а также на формирование запроса DMA по этому сравнению, а второй канал сравнения просто будет формировать сигналы для DMA.
Допустим, теперь, хотим начать принимать много данных от АЦП (у меня задача была именно такая). У него только MISO, CLK, CS. То есть придется отправлять пустые данные и принимать уже нужные отсчеты.
Для этого настраиваю период пересчета таймера, например, на 45мкс, время срабатывания первого канала сравнения 5мкс, второго - 10мкс (на рисунке момент времени 1).
Через 5мкс таймер аппаратно опустит CS в 0, активизируя подчиненное устройство (момент времени 2). В этот же момент DMA, получив сигнал сравнения от таймера, осуществляет пересылку числа 40 в регистр сравнения первого канала. В момент времени 3 таймер досчитал до значения сравнения канала 2, и по этому событию DMA отправляет очередной пустой байт/слово в SPI. В момент времени 4 срабатывает DMA на прием по SPI, который складывает принятые данные в кольцевой буфер. Как только буфер заполнится - мне выдается прерывание, а DMA продолжает молотить. В момент времени 5 таймер досчитал до 40, и здесь снова аппаратно переключается ножка CS, а DMA отправляет в регистр сравнения первого канала снова число 5. И так до бесконечности.
Получается, что автомат построен по чисто аппаратному таймеру и DMA, а с программной точки зрения это выглядит прозрачно, как будто кто-то толкает SPI и принимает от него данные
Сделано, конечно, все равно через одно место, если так подумать... Но за неимением другого варианта, приходится изобретать разные механизмы. В других МК с этим было бы куда проще.
Естественно, в моей схеме таймер и модуль SPI должны быть одновременно доступны в одном модуле DMA (я имею ввиду то, что DMA должен быть физически подключен и к таймеру и к SPI, что накладывает небольшие ограничения на вариации Timer<->SPI).