реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Пауза между байтами в SPI DMA, STM32F4xx
Rash
сообщение Sep 19 2013, 07:25
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Приветствую.
Может кто нибудь подсказать возможно ли сделать паузу между байтами в SPI при использовании DMA, STM32F4xx? например совместно с каким либо таймером. А то многие медленные мс требуют паузы между байтами несколько сотен нсек и для работы с ними по DMA приходится понижать частоту до 1-2 МГц, хотя сами они держат до 8 МГц при побайтовом вычитывании. Мк STM32F4xx.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 19 2013, 07:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Таймеры вполне способны генерировать запросы DMA с нужным интервалом и в нужном числе.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 19 2013, 08:05
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



а примера случаем нет такого для настройки?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 08:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 19 2013, 11:25) *
А то многие медленные мс требуют паузы между байтами несколько сотен нсек.

Это какие, например?
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 13:30
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 19 2013, 12:15) *
Это какие, например?

например CMX608/CMX618/CMX638
tNXT Inter-Byte time 200 – – ns

Не пойму причем тут таймер, если Вы передаете через DMA. Таймером можно запустить передачу, но не вставить паузу между байтами в пакете. Это работа модуля SPI - поддержка защитных интервалов между байтами, пакетами и пр.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 19 2013, 13:36
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



одна из микр это CMX618 имено эти 200 нсек и нужно сделать.
но насколько я понял поддержку защитных интервалов между байтами при использовании DMA не сделаешь?
Или есть варианты?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 13:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(DmitryM @ Sep 19 2013, 17:30) *
например CMX608/CMX618/CMX638
tNXT Inter-Byte time 200 – – ns

Если внимательно посмотреть картинку, то tNXT расстояние между двумя соседними ФРОНТАМИ тактового сигнала.
При этом на максимальной частоте tNXT = tCK, т.е. никакой дополнительной задержки вставлять не нужно.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 19 2013, 13:52
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



это зависимости на какой частоте запустить SPI. При частотах > 4МГц, этого значения не будет хватать.
adnega, Вопрос не в том как обойти какие либо ограничения, а в том возможно ли сделать поддержку защитных интервалов между байтами при использовании DMA
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 19 2013, 13:53
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Rash @ Sep 19 2013, 17:36) *
Или есть варианты?


там от фронта последнего бита N байта до первого бита N+1 должно быть не менее 200нс, а это 5МГц тактовой
я бы сделал 4МГц и не парился


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 13:55
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 19 2013, 17:48) *
Если внимательно посмотреть картинку, то tNXT расстояние между двумя соседними ФРОНТАМИ тактового сигнала.
При этом на максимальной частоте tNXT = tCK, т.е. никакой дополнительной задержки вставлять не нужно.

Нужно как минимум один такт клока, а SPI может передавать байты сплошным потоком бит без всякой задержки.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 14:22
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 19 2013, 17:52) *
это зависимости на какой частоте запустить SPI. При частотах > 4МГц, этого значения не будет хватать.
adnega, Вопрос не в том как обойти какие либо ограничения, а в том возможно ли сделать поддержку защитных интервалов между байтами при использовании DMA

С помощью таймера, SPI, DMA и какой-то матери конечно можно сделать.
Но тут вопрос в другом: интерфейс SPI настолько "дубовый", что делать какие-либо задержки между байтами,
это на мой взгляд нарушение основной его идеологии. Пока не видел ни одного устройства (и которые Вы
привели в пример тоже к ним относятся), которым бы требовалась задержка ежду байтами.
Чисто формально можно называть такие интерфейсы не SPI, а например C-Bus, но в SPI никаких задержек не требуется.
Если один интерфейс для управляемый светодиодных лент, где пауза соответствует защелкиванию данных, но между
байтами поток непрерывный.

Так как будем интерфейс называть?

Цитата(DmitryM @ Sep 19 2013, 17:55) *
Нужно как минимум один такт клока, а SPI может передавать байты сплошным потоком бит без всякой задержки.

Повторяю, задержка не нужна - посмотрите внимательно, что такое tNXT по диаграмме (а не по переводу с английского).

Добавлю: тут недавно обсуждали DMA + SPI на STM. Картина не такая уж и радужная. Гарантировать интервал в 200нс с помощью DMA, таймеров
и прочего, по-моему, не получится. Относитесь к DMA как сущности, которая может быстро и без участия CPU передать БОЛЬШОЙ кусок данных.
Как только речь заходит о единичных транзакциях начинаются проблемы. Время между DMA-запросом и DMA-транзакцией далеко не ноль, "но это
еще пол беды, вся беда в том, что" это время не постоянно.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 14:36
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 19 2013, 18:22) *
Повторяю, задержка не нужна - посмотрите внимательно, что такое tNXT по диаграмме (а не по переводу с английского).

Задержка нужна, проверено на собственно опыте, иначе мсх (в моем случае CMX638) не дает верные данные. Да можно понизить частоту клока и тем самым выдержать эти несчастные 200нс. В моем случа все решалось просто, у атмела sam7s все это умеет делать модуль SPI, задал параметры и все. В случае с стм32 этого сделать нельзя при работе через DMA, а поллингом как-то некузяво, итак есть чем заниматься. Здесь по-моему только снижением частоты клока.
ЗЫ. Разработчики мсх специально указали Inter-Byte time, могли бы вообще не указывать, tCK сказали, что не меньше такого то и все, ан нет, указали, обратили внимание.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 19 2013, 14:42
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



adnega, Задержка байтами в SPI нужна конечно меньше чем tNXT расстояние между двумя соседними ФРОНТАМИ, но если посылать SCK постоянно (при использовании DMA) например с частотой 5МГц, то время tNXT уже не уложиться в требуемые 200 нсек, и часть данных изказиться. Но если Читать данные без DMA с проверкой флагов состояния SPI, на всё тех же 5 МГц, то все данные будут правильные, т.к. есть время на выполнение ассемблерных инструкций и всё укладывается в 200 нсек. Проверено лог. анализатором. Есть ещё и другие микросхемы для которых это время должно быть > 250 нсек.
Также в SPI есть чёткие предделители частоты. И получается большой шаг между выбором частоты SCK.
В результате при использовании DMA для таких микр. получается время вычитывания будет в несколько раз > если это сделать по прерываниям или с ожиданием флагов.

А теперь давайте по существу вопроса. Я просил рассказать какие есть возможности сделать задержку между байтами (если они есть), а не разъяснить как работать с какой либо микрой. Я таких возможностей пока не нашёл.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 14:45
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Rash @ Sep 19 2013, 18:42) *
А теперь давайте по существу вопроса. Я просил рассказать какие есть возможности сделать задержку между байтами (если они есть), а не разъяснить как работать с какой либо микрой. Я таких возможностей пока не нашёл.

В STM32F4 при SPI c DMA этого сделать нельзя, по крайней мере я смотрел STM32F407. В SAM7S как я уже писал выше - можно.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 15:08
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 19 2013, 18:42) *
А теперь давайте по существу вопроса. Я просил рассказать какие есть возможности сделать задержку между байтами (если они есть), а не разъяснить как работать с какой либо микрой. Я таких возможностей пока не нашёл.

У STM я таких возможностей не видел.

Добавлю: сейчас посмотрел на STM32F3xx (у них SPI другой)
Цитата
SPI special features
26.4.1 NSS pulse mode
This mode is activated by the NSSP bit in the SPIx_CR1 register and it takes effect only if
the SPI interface is configured as Motorola SPI master with capture on the first edge
(SPIx_CR1 CPHA = 0). When activated, an NSS pulse is generated between two
consecutive data frame transfers when NSS stays at high level for the duration of one clock
period at least. This mode allows the slave to latch data. NSSP pulse mode is designed for
applications with a single master-slave pair.


На картинке таки вставляет один пробел в SCK, но не знаю будет ли работать с DMA.
Могу как-нить попробовать, или F3 для Вас не вариант.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 19:45
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Попробовал. Получилось))
Правда, на STM32F303 (с новым SPI).

Код
void init_SPI2(void)
{
    SPI2->CR1 =
            (1 << SPI_CR1_SSM)
        | (1 << SPI_CR1_SSI)
        | (0 << SPI_CR1_SPE)
        | (2 << SPI_CR1_BR)
        | (1 << SPI_CR1_MSTR);

    SPI2->CR2 =
            (1 << SPI_CR2_SSOE)
        | (7 << SPI_CR2_DS)
        | (0 << SPI_CR2_FRF)
        | (1 << SPI_CR2_NSSP)          // ВСТАВИТЬ ПАУЗЫ
        | (0 << SPI_CR2_TXDMAEN);

    SPI2->CR1 =
            (1 << SPI_CR1_SSM)
        | (1 << SPI_CR1_SSI)
        | (1 << SPI_CR1_SPE)
        | (2 << SPI_CR1_BR)
        | (1 << SPI_CR1_MSTR);
}

Передача:
        SPI2->CR2 =
                (1 << SPI_CR2_SSOE)
            | (7 << SPI_CR2_DS)
            | (0 << SPI_CR2_FRF)
            | (1 << SPI_CR2_NSSP)
            | (0 << SPI_CR2_TXDMAEN);

        DMA1_Channel5->CCR =
                (DMA_PL_HIGH << DMA_CCR_PL)
            | (DMA_SIZE_BYTE << DMA_CCR_MSIZE)
            | (DMA_SIZE_BYTE << DMA_CCR_PSIZE)
            |    (1 << DMA_CCR_DIR)
            | (1 << DMA_CCR_MINC)
            | (0 << DMA_CCR_EN);

        DMA1_Channel5->CPAR = (DWORD)&SPI2->DR8;
        DMA1_Channel5->CMAR = (DWORD)&val;
        DMA1_Channel5->CNDTR = 8;

        DMA1->IFCR = (0x0F << 16);

        DMA1_Channel5->CCR =
                (DMA_PL_HIGH << DMA_CCR_PL)
            | (DMA_SIZE_BYTE << DMA_CCR_MSIZE)
            | (DMA_SIZE_BYTE << DMA_CCR_PSIZE)
            |    (1 << DMA_CCR_DIR)
            | (1 << DMA_CCR_MINC)
            | (1 << DMA_CCR_EN);

        SPI2->CR2 =
                (1 << SPI_CR2_SSOE)
            | (7 << SPI_CR2_DS)
            | (0 << SPI_CR2_FRF)
            | (1 << SPI_CR2_NSSP)
            | (1 << SPI_CR2_TXDMAEN);


Частота SPI 72Мгц/8/2 = 4.5МГц.
Пауза между битами 540нс.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 20:00
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 19 2013, 23:45) *
Попробовал. Получилось))

Это не вариант. Снятие nSS означает завершение транзакции, а не паузу между "байтами"!!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 20:01
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(DmitryM @ Sep 20 2013, 00:00) *
Это не вариант. Снятие nSS означает завершение транзакции, а не паузу между "байтами"!!!!

Дык, NSS-ом в STM обычно софтово машут.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 20:07
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 20 2013, 00:01) *
Дык, NSS-ом в STM обычно софтово машут.

А, я все больше по старинке (FPGA) на железку полагаюсь wink.gif Нафига лишний боян. машет nSS, ну и пусть машет.
А топикпастреру, следуюший алгоритмтм, но без DMA: послал, узнал что отправилось, взвел таймер, по истечению таймера запустил на один байт и т.д.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 20:25
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(DmitryM @ Sep 20 2013, 00:07) *
А, я все больше по старинке (FPGA) на железку полагаюсь wink.gif Нафига лишний боян.

)) Сравнили.
В МК чем-то нужно жертвовать. Из всех зол, это меньшее. Но ТС вряд ли подойдет, т.к. семейство другое...

PS. На большом отрезке любопытно наблюдать динамику в ST.
Как переделали AFIO в новых процах (большое за это спасибо), в новых SPI поддерживаются посылки от 4 до 16 бит
(и паузы вставлять можно), появились 32-битные таймеры и т.п. Но на мой взгляд плохо, что переделали RTC (навороченный календарь
вместо счетчика секунд), плохо что вынесли GPIO из bit-band региона((
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 20:32
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 20 2013, 00:25) *
в новых SPI поддерживаются посылки от 4 до 16 бит (и паузы вставлять можно)

Как? Именно об этом спрашивает Rash.
ЗЫ. Легко это сделал на SAM7
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 20:58
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(DmitryM @ Sep 20 2013, 00:32) *
Как? Именно об этом спрашивает Rash.
ЗЫ. Легко это сделал на SAM7

Дык, ответ в сообщении 16.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2013, 21:03
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 20 2013, 00:58) *
Дык, ответ в сообщении 16.

Опять? nSS нельзя снимать.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 19 2013, 22:30
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(DmitryM @ Sep 20 2013, 01:03) *
Опять? nSS нельзя снимать.

По второму кругу. Не используйте аппаратное управление NSS и будет Вам счастье.
Не понимаю, что мешает опустить NSS перед передачей и поднять когда все закончится?
Более того, когда будете подключать SD-карту по SPI при чтении сектора данные идут не сразу,
нужно засылать FF пока не придет ответ со статусом, затем с помощью DMA можно прочитать
сразу сектор. В таких случаях только софтовое управление NSS или я чего-то упустил в этой жизни...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 06:24
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(adnega @ Sep 20 2013, 02:30) *
В таких случаях только софтовое управление NSS или я чего-то упустил в этой жизни...

Ой-ёй.
bb-offtopic.gif ИМХО, то что можно/нужно сделать аппаратно - нужно делать аппаратно. Незачем программе считать задержки после выставления nSS и перед началом тактирования. Там где нельзя - приходится делать программно.
FF для SD карты формируем по прерыванию TXRDY, а потом читаем с помощью DMA. Ногодрыг вещь конечно хорошая, но занимает процессорное время. Зачем?
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Sep 20 2013, 06:54
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Вы хоть понимаете о чём идёт речь??? rolleyes.gif
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 06:59
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



NSS и так программный, ибо в STM аппаратный он вроде только для slave режима. Переключать его внутри посылки думаю не правильно, поэтому F3 не вариант. Да и F4 заложен на дальнейшее макс. использование его возможностей, т.к. цена этого мк в данной случае не жмёт. Вот если бы возможно было бы сделать отправку каждого байт в SPI по тайм-ауту таймера и всё это без использование ресурсов мк, был бы реально мощный SPI в STM (даже пусть ещё таймер один забрался, всё равно их куча ещё). А так получается мощные и быстрые контролеры должны по старинке то ли через прерывания, то ли по ожиданию флагов читать данные из периферии по SPI.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Sep 20 2013, 07:34
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Rash @ Sep 20 2013, 09:59) *
Вот если бы возможно было бы сделать отправку каждого байт в SPI по тайм-ауту таймера и всё это без использование ресурсов мк, был бы реально мощный SPI в STM (даже пусть ещё таймер один забрался, всё равно их куча ещё).

Ещё во втором посте вам выдали самое ценное... идею, реализацию...
Потрудитесь хоть немножко поработать головой и руками... там текста... несколько строчек... ничего особенного...
Настраиваете таймер, настраиваете ДМА... Запускаете ДМА, запускаете таймер...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 07:41
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(HHIMERA @ Sep 20 2013, 11:34) *
Ещё во втором посте вам выдали самое ценное... идею, реализацию...
Потрудитесь хоть немножко поработать головой и руками... там текста... несколько строчек... ничего особенного...
Настраиваете таймер, настраиваете ДМА... Запускаете ДМА, запускаете таймер...

DMA на один байт? А зачем он тогда нужен?
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Sep 20 2013, 07:51
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(DmitryM @ Sep 20 2013, 10:41) *
DMA на один байт? А зачем он тогда нужен?

Ысчо разз!!!
Вы точно в теме??? rolleyes.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2013, 07:53
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Rash @ Sep 20 2013, 10:59) *
Вот если бы возможно было бы сделать отправку каждого байт в SPI по тайм-ауту таймера и всё это без использование ресурсов мк, был бы реально мощный SPI в STM (даже пусть ещё таймер один забрался, всё равно их куча ещё).

Вы вообще читаете ответы на ваши вопросы? Я именно такой вариант и предложил с самого начала. И да, ничего невозможного в этом нет.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 08:13
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



не разобрался я как через таймер DMA запускать. Понял пока, что как то через триггерный режим.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2013, 08:16
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Rash @ Sep 20 2013, 12:13) *
не разобрался я как через таймер DMA запускать. Понял пока, что как то через триггерный режим.

Ну так разбирайтесь. Я запускал, работает в соответствии с мануалом.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 08:34
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 20 2013, 12:13) *
не разобрался я как через таймер DMA запускать. Понял пока, что как то через триггерный режим.

Все просто: DMA натравливаете на буфер памяти и на SPI->DR.
Но выбираете канал, который управляется событием по таймеру, а не канал для SPI_TX.
Настраиваете таймер с нужной частотой, разрешаете ему генерировать DMA-запросы.
Если CPU у Вас работает на 168МГц, то ничего страшного. Если частота ниже, то будут
неприятности связанные с тем, что между DMA-запросом и DMA-транзакцией проходит от 12 тактов.

Позже попробую, покажу в чем может быть затык.
Какая частота CPU (168МГц), шины для SPI (168/2)?
Номер SPI (SPI2)?
Какая частота у SPI_SCK (5.25МГц = 168/32)?
Какая задержка tNXT (250нс)?
Какая длина посылки?
Какой таймер свободен?
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 08:45
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



* частота CPU = 168МГц
* Номер - SPI2, SPI3
* частота у SPI_SCK подбирается автоматом при настройке (определяется предделитель в зависимости от частоты шины), минимальная от максимально заданной.
* задержка tNXT 200нс и 250нс
* длина посылки - от 20 до 100 байт
* занят только TIM7, но не принципиально
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2013, 08:46
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(adnega @ Sep 20 2013, 12:34) *
Настраиваете таймер с нужной частотой, разрешаете ему генерировать DMA-запросы.

Ну да, а чтобы запросы не генерировались бесконечно, нужен второй таймер, чтобы всё это в нужный момент остановилось, причём сделать можно без прерываний и вообще вмешательств процессора: запустил и забыл.
Update:
Пардон, DMA и сам умеет останавливаться после заданного числа посылок.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 08:51
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(scifi @ Sep 20 2013, 12:46) *
Ну да, а чтобы запросы не генерировались бесконечно, нужен второй таймер, чтобы всё это в нужный момент остановилось, причём сделать можно без прерываний и вообще вмешательств процессора: запустил и забыл.
Update:
Пардон, DMA и сам умеет останавливаться после заданного числа посылок.

Все хитрее, по прерыванию DMA_TC разрешаем прерывание от TIM.
В прерывании от TIM считаем, что последний байт передан полностью, можно взводить NSS и запрещать TIM.

Нужна только передача, как я понял?
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 08:54
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(HHIMERA @ Sep 20 2013, 11:51) *
Ысчо разз!!!
Вы точно в теме??? rolleyes.gif

Точно. По моему мы разговариваем на разных языках wink.gif
1. Можно запустить ДМА по таймеру, но нельзя приостановить передачу после каждого байта для выдержки inter-byte time. Т.е. как только SPI TXE будет выставлен, ДМА загрузит новый байт (если есть) и SPI продолжит непрерывную передачу.
2. Можно использовать Single Mode DMA, но смысл? Это ничем не будет отличаться от записи в SPI DR.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 08:54
Сообщение #39


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата
Нужна только передача, как я понял?

нужна и передача, и приём. Только прерывания от таймера, это задействование процессорного времени
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 20 2013, 08:55
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(adnega @ Sep 20 2013, 12:51) *
Все хитрее, по прерыванию DMA_TC разрешаем прерывание от TIM.
В прерывании от TIM считаем, что последний байт передан полностью, можно взводить NSS и запрещать TIM.

Можно ещё хитрее: сигнал NSS вырабатывать на аппаратном выходе таймера. Эти таймеры можно каскадировать самым причудливым образом. Но по возможности надо избегать, иначе голова закружится :-)
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Sep 20 2013, 09:04
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(adnega @ Sep 20 2013, 11:51) *
Все хитрее, по прерыванию DMA_TC разрешаем прерывание от TIM.

Не нужны там никакие прерывания... думайте...

Цитата(DmitryM @ Sep 20 2013, 11:54) *
По моему мы разговариваем на разных языках wink.gif

Похоже... вы пытаетесь мне что-то объяснить/доказать... а мне не нужно... у меня всё давно работает...

Цитата(scifi @ Sep 20 2013, 11:55) *
Эти таймеры можно каскадировать самым причудливым образом. Но по возможности надо избегать, иначе голова закружится :-)

Это дело привычки... зато какая сила!!! STM'у респект!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 09:05
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 20 2013, 12:54) *
нужна и передача, и приём. Только прерывания от таймера, это задействование процессорного времени

Всего на посылку будет возникать два прерывания: одно от DMA, второе от таймера.
Песле посылки очередного байта прерывания не будет. Прерывание нужно только в самом конце
- освободить NSS сразу после передачи последнего байта.

Хотя, если делать прием, то завершение посылки можно настроить по второму DMA_TC, настроеному на события SPI_RX.
Прерывания от таймера в таком случае не понадобится.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 09:10
Сообщение #43


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(adnega @ Sep 20 2013, 12:05) *
Всего на посылку будет возникать два прерывания: одно от DMA, второе от таймера.
Песле посылки очередного байта прерывания не будет. Прерывание нужно только в самом конце
- освободить NSS сразу после передачи последнего байта.

Хотя, если делать прием, то завершение посылки можно настроить по второму DMA_TC, настроеному на события SPI_RX.
Прерывания от таймера в таком случае не понадобится.

NSS я и освобождаю в прерывании по DMA.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 09:15
Сообщение #44


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(HHIMERA @ Sep 20 2013, 13:04) *
а мне не нужно... у меня всё давно работает...

у меня тоже, но не на СТМ и без использования таймеров, на голом SPI.


PS. Собственно все сводится к уменьшению частоты SPI, а отчего запускать ДМА - от таймера или от SPI без разницы.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 20 2013, 09:46
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ДМА посылающий 1 байт не тоже самое что самому положить этот байт в СПИ.

В случае руками
таймер генерит прерывание
вы реагируете на прерывание и прерываете программу
попадаете в обработчик
там кладете байт в СПИ
выходите

В Случае ДМА
таймер генерит прерывание
но обработчик прерывания не вызывается и вы не прерываете программу
ДМА сам по сигналу кладет байт в СПИ

Согласитесь что во втором варианте ресурсы процессора, основной программы не трогаются, она не останавливается.


Дальше если таймер щелкает постоянно генеря прерывания(на которые мы не реагируем, они для ДМА) то и ДМА будет запускаться периодически с заданными задержками. Подобрав время равное (длина посылки байта + пауза), получается выдержать паузу между байтами. Есть проблема со стартом ДМА, так что задержка должна быть чуть больше.

А ДМА как я понимаю послав один байт перенастраивается на следующий, и таким образом происходит посылка группы байт через ДМА, но критерий посылки следующего байта не готовность буфера, а таймер.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 10:12
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Golikov A. @ Sep 20 2013, 13:46) *
А ДМА как я понимаю послав один байт перенастраивается на следующий, и таким образом происходит посылка группы байт через ДМА, но критерий посылки следующего байта не готовность буфера, а таймер.

Именно!
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 20 2013, 11:29
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Golikov A. @ Sep 20 2013, 13:46) *

Да, Вы правы, в таком варианте будет работать. Придется конечно поизвращаться со стартом транзакции, но это не сложно.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 13:48
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Ну собственно работа SPI с TIM и DMA.
Обращаю внимание на последнюю картинку. Желтый фронт - событие таймера (считай запуск DMA), но сама посылка начинается значительно позже. И время не стабильно. Поэтому зазор tNXT плавает приблизительно от 170нс до 290нс. И я об этом с самого начала предупреждал. Так сойдет?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 20 2013, 14:11
Сообщение #49


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



плавая пауза между байтами думаю не проблема, главное что бы минимальная пауза была регулируемая в понятных приделах
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 20 2013, 14:43
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну это понятно ДМА то надо дождаться свободной шины, но гарантированный минимум спокойно получится... это в разы лучше чем полингом тупить...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 20 2013, 15:17
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Rash @ Sep 20 2013, 18:11) *
плавая пауза между байтами думаю не проблема, главное что бы минимальная пауза была регулируемая в понятных приделах

Тогда вот:
CODE

//-----------------------------------------------------------------------------
// void __inline init_SPI2(void)
//-----------------------------------------------------------------------------
void __inline init_SPI2(void)
{
SPI2->CR1 =
(0 << SPI_CR1_SPE)
| (0 << SPI_CR1_DFF)
| (1 << SPI_CR1_SSM)
| (1 << SPI_CR1_SSI)
| (1 << SPI_CR1_MSTR)
| (2 << SPI_CR1_BR);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (1 << SPI_CR2_SSOE);

SPI2->CR1 =
(1 << SPI_CR1_SPE)
| (0 << SPI_CR1_DFF)
| (1 << SPI_CR1_SSM)
| (1 << SPI_CR1_SSI)
| (1 << SPI_CR1_MSTR)
| (2 << SPI_CR1_BR);
}

//-----------------------------------------------------------------------------
// void __inline init_TIMER3(void)
//-----------------------------------------------------------------------------
void __inline init_TIMER3(void)
{
TIM3->PSC = 0;
TIM3->CR1 = 0;
TIM3->ARR = 147 - 1; // ПЕРИОД СЛЕДОВАНИЯ ТУТ
TIM3->CCR1 = 10; // для отладки "желтый фронт"
TIM3->CCR4 = 1;
TIM3->CCMR1 = (OC_MODE_PWM1 << TIM_CCMR1_OC1M);
TIM3->CCER = (1 << TIM_CCER_CC1E) | (1 << TIM_CCER_CC4E);
TIM3->SMCR = 0;
TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (0 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);
}

Еще нужно разрешить прерывание для DMA1_Stream3.

void DMA1_Stream3_IRQHandler(void) __attribute__((interrupt("IRQ")));
void DMA1_Stream3_IRQHandler(void)
{
if(DMA1->LISR & (1 << 27))
{
TIM3->CR1 = 0;
GPIOB->BSRRL = (1 << 12); // NSS=1
DMA1->LIFCR = (1 << 27);
}
}

Запускаем так:

TIM3->CR1 = 0;
TIM3->CNT = 0;

TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (0 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (0 << SPI_CR2_RXDMAEN)
| (1 << SPI_CR2_SSOE);

DMA1->LIFCR = 0x0F7D0000;

DMA1_Stream2->CR =
(2 << DMA_SCR_PL)
| (5 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (1 << DMA_SCR_DIR)
| (0 << DMA_SCR_EN);
DMA1_Stream2->PAR = (DWORD)&SPI2->DR;
DMA1_Stream2->M0AR = (DWORD)&spi_tx[0];
DMA1_Stream2->NDTR = SPI_DATA_SIZE;
DMA1_Stream2->CR =
(2 << DMA_SCR_PL)
| (5 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (1 << DMA_SCR_DIR)
| (1 << DMA_SCR_EN);

DMA1_Stream3->CR =
(3 << DMA_SCR_PL)
| (0 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (0 << DMA_SCR_DIR)
| (0 << DMA_SCR_EN)
| (1 << DMA_SCR_TCIE);
DMA1_Stream3->PAR = (DWORD)&SPI2->DR;
DMA1_Stream3->M0AR = (DWORD)&spi_rx[0];
DMA1_Stream3->NDTR = SPI_DATA_SIZE;
DMA1_Stream3->CR =
(3 << DMA_SCR_PL)
| (0 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (0 << DMA_SCR_DIR)
| (1 << DMA_SCR_EN)
| (1 << DMA_SCR_TCIE);

GPIOB->BSRRH = (1 << 12);

SPI2->CR2 =
(0 << SPI_CR2_RXNEIE)
| (0 << SPI_CR2_TXDMAEN)
| (1 << SPI_CR2_RXDMAEN)
| (1 << SPI_CR2_SSOE);

TIM3->DIER =
(0 << TIM_DIER_CC1IE)
| (1 << TIM_DIER_CC4DE)
| (0 << TIM_DIER_UIE);

TIM3->CR1 = (1 << TIM_CR1_CEN);
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 23 2013, 06:37
Сообщение #52


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



adnega, спасибо буду пробовать
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th August 2025 - 07:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.02045 секунд с 7
ELECTRONIX ©2004-2016