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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> SPI по DMA на разные м/с
Rash
сообщение Jun 6 2017, 10:54
Сообщение #1


Знающий
****

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



Добрый день.
Подскажите, возможно, ли опрашивать последовательно несколько м/с по SPI переключать при этом CS и использовать DMA и таймер(ы)? Если да, то как?
МК STM32F401, два датчика: акселерометр и гироскоп подключены параллельно с раздельным CS. Частота опроса 400 Гц. Последовательность следующая: выбор и опрос датчик1, выбор и опрос датчик2, ожидание готовности данных, и т.д. Таким образом делать N-выборок без участия CPU.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jun 6 2017, 11:00
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Rash @ Jun 6 2017, 15:54) *
Добрый день.
Подскажите, возможно, ли опрашивать последовательно несколько м/с по SPI переключать при этом CS и использовать DMA и таймер(ы)? Если да, то как?
МК STM32F401, два датчика: акселерометр и гироскоп подключены параллельно с раздельным CS. Частота опроса 400 Гц. Последовательность следующая: выбор и опрос датчик1, выбор и опрос датчик2, ожидание готовности данных, и т.д. Таким образом делать N-выборок без участия CPU.

переключать CS только "вручную". То есть сначала выставляем CS в активное состояние, затем запускаем DMA , в прерывании по его окончанию снимаем CS и повторяем процесс для всех абонентов.

Сообщение отредактировал nanorobot - Jun 6 2017, 11:03
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 11:11
Сообщение #3


Знающий
****

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



CS в ручную это понятно, тогда от DMA толку нет, весь смысл процесс автоматизировать. Запустить DMA на N выборок с частотой 400 Hz и каким то образом (таймером) их переключать.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jun 6 2017, 11:16
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Rash @ Jun 6 2017, 16:11) *
CS в ручную это понятно, тогда от DMA толку нет, весь смысл процесс автоматизировать. Запустить DMA на N выборок с частотой 400 Hz и каким то образом (таймером) их переключать.

Почему нету? По таймеру происходит опрос абонентов. Вручную только переключение CS и запуск DMA. Все данные передаются / принимаются без участия CPU.

Сообщение отредактировал nanorobot - Jun 6 2017, 11:17
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 6 2017, 11:16
Сообщение #5


Гуру
******

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



Можно попробовать замутить хитрую схему с таймерами. Таймеры могут формировать CS на своих выходах и запускать DMA.
Но не проще ли на прерываниях?
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 11:18
Сообщение #6


Знающий
****

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



nanorobot,
Смысла нет передавать 2-3 байта через DMA.

scifi
Вот только как этот процесс синхронизировать и сделать нужную задержку после опроса датчиков?
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jun 6 2017, 11:24
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Rash @ Jun 6 2017, 16:18) *
nanorobot,
Смысла нет передавать 2-3 байта через DMA.


все равно лишниий раз не обслуживать прерывание от SPI. А вообще я бы RTOS прикрутил. ChibiOs например. Кроме любых синхронизаций и задержек там великолепный HAL имеется для STM32. Попробуйте, не пожалеете.

Сообщение отредактировал nanorobot - Jun 6 2017, 11:28
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 11:27
Сообщение #8


Знающий
****

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



Цитата(nanorobot @ Jun 6 2017, 14:24) *
все равно лишниий раз не обслуживать прерывание от SPI.

там SPI 10МГц, поэтому быстрее дождаться окончания передачи, нежели прерывания обрабатывать или DMA запускать.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jun 6 2017, 11:31
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Rash @ Jun 6 2017, 16:27) *
там SPI 10МГц, поэтому быстрее дождаться окончания передачи, нежели прерывания обрабатывать или DMA запускать.

Возможно. Вам виднее конечно. Я предпочитаю избегать любых ожиданий. Перезапуск DMA - пара тройка команд.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 6 2017, 12:01
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(nanorobot @ Jun 6 2017, 13:24) *
все равно лишниий раз не обслуживать прерывание от SPI. А вообще я бы RTOS прикрутил. ChibiOs например. Кроме любых синхронизаций и задержек там великолепный HAL имеется для STM32. Попробуйте, не пожалеете.

А я бы выбрал другой МК - получше, умеющий управлять несколькими CS в процессе обмена. Если так уж нужно laughing.gif
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 12:16
Сообщение #11


Знающий
****

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



это не вариант, проще сделать опрос полингом, как он сейчас и сделан.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jun 6 2017, 12:44
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Rash @ Jun 6 2017, 17:16) *
это не вариант, проще сделать опрос полингом, как он сейчас и сделан.


В STM32F4xx минимум 3 штуки SPI, как мне кажется. Используйте парочку по таймеру и с ДМА.

Сообщение отредактировал nanorobot - Jun 6 2017, 12:45
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 6 2017, 12:48
Сообщение #13


Гуру
******

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



Цитата(Rash @ Jun 6 2017, 15:16) *
это не вариант, проще сделать опрос полингом, как он сейчас и сделан.

И что не устраивает?
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 13:03
Сообщение #14


Знающий
****

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



То что нужно каждые 2.5 мсек по таймеру читать новое значение (этим временем не ограничен). Так было ещё во времена AVR.
А так можно было бы запустить N выборок и получить только одно прерывание по окончанию всего процесса.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 6 2017, 13:09
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Rash @ Jun 6 2017, 15:03) *
Так было ещё во времена AVR.
А так можно было бы запустить N выборок и получить только одно прерывание по окончанию всего процесса.

Ну если так нужно, то что-ж, когда с AVR слазили, не выбрали подходящий МК где это можно сделать?
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 13:18
Сообщение #16


Знающий
****

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



А при чём здесь AVR? И чем архитектура не подошла?
Захотелось улучшить процесс опроса. Сам пока не дошёл как, поинтересовался и коллег, может кто делал или видит способ.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 6 2017, 13:28
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Rash @ Jun 6 2017, 15:18) *
А при чём здесь AVR? И чем архитектура не подошла?

Вы когда с AVR слазили, выбирали новый МК. Почему тогда не выбрали МК, который умеет управлять несколькими CS в одном SPI?
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 13:41
Сообщение #18


Знающий
****

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



Управлять несколькими CS аппаратно не является приоритетной задачей, что бы ради неё выбирать контроллер. Можно - хорошо, нельзя - есть другие способы.
Вопрос в первом сообщение не о выборе архитектуры.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 6 2017, 13:47
Сообщение #19


Гуру
******

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



Цитата(Rash @ Jun 6 2017, 16:03) *
То что нужно каждые 2.5 мсек по таймеру читать новое значение (этим временем не ограничен).

И что? Не сами же считываете, а микроконтроллер. Или боитесь, что он перетрудится? А не боитесь его без работы оставить своим излишним усердием? biggrin.gif
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 14:04
Сообщение #20


Знающий
****

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



Ну да, сам, побитно ручками вынимаю.
scifi, если есть что-то по делу, расскажите, нет зачем тему засорять.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 6 2017, 14:11
Сообщение #21


Гуру
******

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



Цитата(Rash @ Jun 6 2017, 17:04) *
scifi, если есть что-то по делу, расскажите, нет зачем тему засорять.

По делу: "работает - не трогай". Вы будете смеяться, но это очень дельный совет.
Если это такое улучшательство ради улучшательства, лучше бросьте. Тем более, что на 407 это неблагодарное занятие. На более поздних STM32 вроде бы всякие приятные мелочи появились, но не уверен, что конкретно для этой задачи и там что-то удобное есть.
Go to the top of the page
 
+Quote Post
Rash
сообщение Jun 6 2017, 14:31
Сообщение #22


Знающий
****

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



Вы меня наверное с кем то путаете.
Да я не первый год в теме и если бы бросал чем то заниматься, как только, что-то запустилось, то много бы не узнал.
МК 401, а не 407, но в SPI без разницы, вот таймеров меньше и работать с GPIO через DMA можно только одним таймером TIM1.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 6 2017, 18:59
Сообщение #23


Гуру
******

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



Цитата(Rash @ Jun 6 2017, 17:31) *
Да я не первый год в теме и если бы бросал чем то заниматься, как только, что-то запустилось, то много бы не узнал.

Чего там узнавать? Мануал - вот он перед глазами. Не военная тайна же.
Все такие обидчивые, блин...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 6 2017, 21:06
Сообщение #24


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Rash @ Jun 6 2017, 13:54) *
Добрый день.
Подскажите, возможно, ли опрашивать последовательно несколько м/с по SPI переключать при этом CS и использовать DMA и таймер(ы)? Если да, то как?
МК STM32F401, два датчика: акселерометр и гироскоп подключены параллельно с раздельным CS. Частота опроса 400 Гц. Последовательность следующая: выбор и опрос датчик1, выбор и опрос датчик2, ожидание готовности данных, и т.д. Таким образом делать N-выборок без участия CPU.

На серии Kinetis от NXP это делается элементарно в одной пересылке DMA. Там вместе с данными в буфер записывается состояние CS.
А в STM32 вижу да, дикая проблема. Даже сцепленных DMA структур не имеет.
Как выход можно было бы применить промежуточный контроллер из серии Kinetis.
Скажем серия KS22 имеет и SPI с аппаратным управлением более 16-ю CS-ами, и DMA со сцепленными блоками и еще такую фичу, как FlexIO, где можно творить какой угодно сериальный стрим.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 6 2017, 21:55
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Jun 6 2017, 23:06) *
На серии Kinetis от NXP это делается элементарно в одной пересылке DMA. Там вместе с данными в буфер записывается состояние CS.

Такое управление CS-ами есть и в Infineon и в Tiva и в OMAP-L. Нету только в STM32, так как его периферию упростили по самое нехочу.

Цитата(Rash @ Jun 6 2017, 16:31) *
Да я не первый год в теме и если бы бросал чем то заниматься, как только, что-то запустилось, то много бы не узнал.
МК 401, а не 407, но в SPI без разницы, вот таймеров меньше и работать с GPIO через DMA можно только одним таймером TIM1.

ну если из любви к искусству и если Вы действительно так въедливы как пишете, то изучите от корки до корки всю периферию своего камня и думаю сможете что-нить придумать.
Тут подобные темы уже не раз обсасывались - поднимите историю.
Как зацепка Вам:
Выделяете один канал DMA, синхронизируемый событиями от таймера, который при каждом event-е от таймера засылает блок конфигурации в регистры другого DMA-канала. А уже тот второй DMA-канал выполняет пересылки память-память, программируя различную периферию и другие DMA-каналы.
Если DMA-контроллер вашего STM может по событию таймера выполнить пересылку блока байт память-память, а по следующему событию таймера - следующего блока из списка в памяти по тому-же целевому адресу, то должно получиться. Мне открывать мануал на периферию STM лень. wink.gif
Ещё можно придумать разные фокусы с подсчётом SCLK вашего SPI каким-то таймером и формированию события по достижении некоего числа SCLK (например - фронта CS, или опять-же - event к DMA).
Go to the top of the page
 
+Quote Post
amiller
сообщение Jun 7 2017, 03:07
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(jcxz @ Jun 7 2017, 01:55) *
ну если из любви к искусству и если Вы действительно так въедливы как пишете, то изучите от корки до корки всю периферию своего камня и думаю сможете что-нить придумать.

Думаю, что более просто будет так:
При условии, что CS-ы посажены на один порт.
Задействовать 1 дополнительный канал DMA, который будет синхронно писать данные в регистр BSRR соответствующего порта, тем самым дергая нужные CS.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 7 2017, 07:34
Сообщение #27


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Jun 7 2017, 00:55) *
Такое управление CS-ами есть и в Infineon и в Tiva и в OMAP-L. Нету только в STM32, так как его периферию упростили по самое нехочу.

В каких Infineon вы такое видели? В их серии XMC4xxx нет даже SPI отдельного как такового, а есть некий Universal Serial Interface Channel (USIC) на котором делают все подряд: UART, SPI, I2C, I2S...
Это скорее похоже на FlexIO у Kinetis. Управления CS как в Kinetis там конечно нет.
Tiva уже проверять не стал. Предлагаю вам самим сознаться что немного пофантазировали. biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2017, 09:06
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Jun 7 2017, 09:34) *
В каких Infineon вы такое видели?

Я это не видел. Я с этим сейчас работаю. И управляю двумя CS-ами на XMC4700.

Цитата(AlexandrY @ Jun 7 2017, 09:34) *
В их серии XMC4xxx нет даже SPI отдельного как такового, а есть некий Universal Serial Interface Channel (USIC) на котором делают все подряд: UART, SPI, I2C, I2S...

И что? Этот USIC может быть запрограммирован в одном из режимов UART/SPI/I2C/I2S. От этого SPI не перестаёт быть SPI. Подобная организация портов встречается и в других МК.

Цитата(AlexandrY @ Jun 7 2017, 09:34) *
Это скорее похоже на FlexIO у Kinetis. Управления CS как в Kinetis там конечно нет.

Да ладно. А чего именно нет? Что такое уникальное есть в Kinetis? cool.gif

Цитата(AlexandrY @ Jun 7 2017, 09:34) *
Tiva уже проверять не стал. Предлагаю вам самим сознаться что немного пофантазировали. biggrin.gif

Насчёт Tiva - да я возможно перепутал - там я это не использовал. Но OMAP-L и XMC4xx - точно есть.
Go to the top of the page
 
+Quote Post

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

 


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


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