SPI

32-разрядные микроконтроллеры разработки ОАО "НИИЭТ"

Модераторы: pip, _sva_

bkolbov
Сообщения: 115
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov » 14 фев 2018, 13:15

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

В итоге, тут необходимо или иметь размер элемента до 32 бит, или контролировать всё программно, через прерывания - что вроде как вы и делаете.

Роман
Сообщения: 16
Зарегистрирован: 26 янв 2018, 12:01
Предприятие: ВНИИЭМ

Re: SPI

Сообщение Роман » 14 фев 2018, 19:04

Спасибо за ответ, в принципе будь даже прерывание быстрей, сама необходимость его использования нивелирует преимущества дма. В описании spi есть фразы про запрос передачи отдельного слова и запрос блочного обмена данными, будь запрос передачи отдельного слова отключаем а размер блока для блочного обмена задаваем эта задача решалась бы?
P.S. Конкретно в этом случае даже хорошо что размер посылки такой, допустим был-бы это один max7301 - в этом случае cs в 1 д.б. каждые 16 бит, но обмен с ним работает только при SPH = 1 и SPO = 1 (проверял управляя CS в gpio), т.е. в фифо пришлось бы писать по 4-е бита, что совсем уж плохо.

Ответить

Вернуться в «32-разрядные микроконтроллеры на ядре ARM Cortex»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость