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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Пауза между байтами в SPI DMA, STM32F4xx
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

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:34
Рейтинг@Mail.ru


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