SPI

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

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

bkolbov
Сообщения: 126
Зарегистрирован: 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-е бита, что совсем уж плохо.

Константин
Сообщения: 3
Зарегистрирован: 18 сен 2018, 11:26
Предприятие: МНИТИ

Re: SPI

Сообщение Константин » 02 окт 2018, 18:16

Добрый день!

Подскажите от чего зависит минимальное время ожидания между передачей байтов (при непрерывной передаче кадров)?
На разных частотах оно разное. Каким образом её можно уменьшить?
Вложения
spi.png
spi.png (82.05 КБ) 177 просмотров

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

Re: SPI

Сообщение dav » 05 окт 2018, 14:41

Константин писал(а):
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;
}

Ответить

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

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

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