SPI

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

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

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

Re: SPI

Сообщение bkolbov »

Роман писал(а): 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 бит, или контролировать всё программно, через прерывания - что вроде как вы и делаете.
Роман
Сообщения: 28
Зарегистрирован: 26 янв 2018, 12:01
Предприятие: ВНИИЭМ

Re: SPI

Сообщение Роман »

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

Re: SPI

Сообщение Константин »

Добрый день!

Подскажите от чего зависит минимальное время ожидания между передачей байтов (при непрерывной передаче кадров)?
На разных частотах оно разное. Каким образом её можно уменьшить?
Вложения
spi.png
spi.png (82.05 КБ) 20380 просмотров
dav
Сообщения: 208
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: SPI

Сообщение dav »

Константин писал(а): 02 окт 2018, 18:16 Добрый день!

Подскажите от чего зависит минимальное время ожидания между передачей байтов (при непрерывной передаче кадров)?
На разных частотах оно разное. Каким образом её можно уменьшить?
Доброго времени суток!
Для непрерывной передачи по SPI перед загрузкой данных в передающий буфер достаточно опрашивать флаг SPI_SPI_SR_TFE_Msk.

Код: Выделить всё

void SPI1_putc (unsigned char ch)
{   
    while(!(NT_SPI1-> SPI_SR & SPI_SPI_SR_TFE_Msk));
    NT_SPI1-> SPI_DR = ch;
}
alen_kray
Сообщения: 7
Зарегистрирован: 13 июл 2017, 15:24
Предприятие: temp_

Re: SPI

Сообщение alen_kray »

Здравствуйте, необходимо реализовать обмен по Spi между двумя мк К1921ВК01Т. Один работает в режиме master, другой - slave. У master линия FSS настроена как GPIO_OUT, у slave - как FSS_INPUT. В документации в пункте 16.2 Функционирование –> Интерфейс SPI есть следующий абзац : "В режиме непрерывной передачи данных при условии SPH = 1 низкий уровень сигнала на линии SPI_FSS не блокирует запись в сдвиговый регистр. Поэтому линия SPI_FSS может оставаться в состоянии нуля в течение передачи всех кадров и переведена в состояние логической единицы только по окончании передачи." Каким образом master может узнать, что передача закончилась, чтобы выставить SPI_FSS в 1 ? Никаких прерываний, на то, что закончилась передача или что буфер передатчика стал пустым нет. Постоянно опрашивать флаг BSY или другие флаги не вариант, потому как мк выполняет множество других задач помимо передачи по Spi. Вообще как корректно организовать обмен между master и slave, ведь фактически их надо каким-то образом синхронизировать, то есть slave должен знать, что можно записывать в буфер для передачи мастеру ?
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Здравствуйте, необходимо реализовать обмен по Spi между двумя мк К1921ВК01Т. Один работает в режиме master, другой - slave. У master линия FSS настроена как GPIO_OUT, у slave - как FSS_INPUT.
Добрый день! Почему принято решение управлять FSS мастера программно?
В документации в пункте 16.2 Функционирование –> Интерфейс SPI есть следующий абзац : "В режиме непрерывной передачи данных при условии SPH = 1 низкий уровень сигнала на линии SPI_FSS не блокирует запись в сдвиговый регистр. Поэтому линия SPI_FSS может оставаться в состоянии нуля в течение передачи всех кадров и переведена в состояние логической единицы только по окончании передачи." Каким образом master может узнать, что передача закончилась, чтобы выставить SPI_FSS в 1 ?
Аппаратный FSS сам будет устанавливать ноль и восстанавливать единицу по передаче всех кадров, как и указано в цитируемом абзаце.
Никаких прерываний, на то, что закончилась передача или что буфер передатчика стал пустым нет. Постоянно опрашивать флаг BSY или другие флаги не вариант, потому как мк выполняет множество других задач помимо передачи по Spi.
Если включен аппаратный FSS, то он установит вывод в 1 после того, как передаст все кадры из буфера (при SPH = 1). Чтобы отловить это событие асинхронно в программе можно, например, настроить прерывание порта по положительному перепаду на пине FSS.
Вообще как корректно организовать обмен между master и slave, ведь фактически их надо каким-то образом синхронизировать, то есть slave должен знать, что можно записывать в буфер для передачи мастеру ?
Вам необходимо придумать программный протокол поверх SPI. Например, в различных датчиках с SPI slave интерфейсом обмен обычно идет так:
- мастер посылает командное слово (пакет), в котором будет указан "виртуальный адрес" регистра/переменной и модификатор чтения/записи
- слэйв его принимает, и если мастер хочет читать - то помещает нужные данные в буфер, если писать - то готовится принять следующий пакет данных
Различных вариаций протокола можно придумать массу. Однако, применительно к К1921ВК01Т могу посоветовать, чтобы пакеты состояли из числа кадров кратным 4-ём - так наиболее удобно будет считывать данные по событию "заполнение буфера на половину".
alen_kray
Сообщения: 7
Зарегистрирован: 13 июл 2017, 15:24
Предприятие: temp_

Re: SPI

Сообщение alen_kray »

Как настроить на мастере fss аппаратно, если fss периферия это input? Возможно,я что-то не понимаю.
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

У SPI - FSS и CLK функционируют одинаково. В режиме ведомого - это входы, в режима мастера - выходы.
alen_kray
Сообщения: 7
Зарегистрирован: 13 июл 2017, 15:24
Предприятие: temp_

Re: SPI

Сообщение alen_kray »

Получается неточности в описании, так как ориентировались на таблицу в документации, так как с CLK там все предельно ясно. Когда можно ожидать обновленное руководство пользователя с исправлениями?
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Да, неточность.
В ближайшее время появится новая версия с исправлениями по февраль текущего года включительно. Но когда ожидать еще более новую версию, где уже и этот этот момент будет исправлен, пока сказать не могу.
Ответить

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