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

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

Почему нету? По таймеру происходит опрос абонентов. Вручную только переключение CS и запуск DMA. Все данные передаются / принимаются без участия CPU.
scifi
Можно попробовать замутить хитрую схему с таймерами. Таймеры могут формировать CS на своих выходах и запускать DMA.
Но не проще ли на прерываниях?
Rash
nanorobot,
Смысла нет передавать 2-3 байта через DMA.

scifi
Вот только как этот процесс синхронизировать и сделать нужную задержку после опроса датчиков?
nanorobot
Цитата(Rash @ Jun 6 2017, 16:18) *
nanorobot,
Смысла нет передавать 2-3 байта через DMA.


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

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

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

А я бы выбрал другой МК - получше, умеющий управлять несколькими CS в процессе обмена. Если так уж нужно laughing.gif
Rash
это не вариант, проще сделать опрос полингом, как он сейчас и сделан.
nanorobot
Цитата(Rash @ Jun 6 2017, 17:16) *
это не вариант, проще сделать опрос полингом, как он сейчас и сделан.


В STM32F4xx минимум 3 штуки SPI, как мне кажется. Используйте парочку по таймеру и с ДМА.
scifi
Цитата(Rash @ Jun 6 2017, 15:16) *
это не вариант, проще сделать опрос полингом, как он сейчас и сделан.

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

Ну если так нужно, то что-ж, когда с AVR слазили, не выбрали подходящий МК где это можно сделать?
Rash
А при чём здесь AVR? И чем архитектура не подошла?
Захотелось улучшить процесс опроса. Сам пока не дошёл как, поинтересовался и коллег, может кто делал или видит способ.
jcxz
Цитата(Rash @ Jun 6 2017, 15:18) *
А при чём здесь AVR? И чем архитектура не подошла?

Вы когда с AVR слазили, выбирали новый МК. Почему тогда не выбрали МК, который умеет управлять несколькими CS в одном SPI?
Rash
Управлять несколькими CS аппаратно не является приоритетной задачей, что бы ради неё выбирать контроллер. Можно - хорошо, нельзя - есть другие способы.
Вопрос в первом сообщение не о выборе архитектуры.
scifi
Цитата(Rash @ Jun 6 2017, 16:03) *
То что нужно каждые 2.5 мсек по таймеру читать новое значение (этим временем не ограничен).

И что? Не сами же считываете, а микроконтроллер. Или боитесь, что он перетрудится? А не боитесь его без работы оставить своим излишним усердием? biggrin.gif
Rash
Ну да, сам, побитно ручками вынимаю.
scifi, если есть что-то по делу, расскажите, нет зачем тему засорять.
scifi
Цитата(Rash @ Jun 6 2017, 17:04) *
scifi, если есть что-то по делу, расскажите, нет зачем тему засорять.

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

Чего там узнавать? Мануал - вот он перед глазами. Не военная тайна же.
Все такие обидчивые, блин...
AlexandrY
Цитата(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, где можно творить какой угодно сериальный стрим.
jcxz
Цитата(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).
amiller
Цитата(jcxz @ Jun 7 2017, 01:55) *
ну если из любви к искусству и если Вы действительно так въедливы как пишете, то изучите от корки до корки всю периферию своего камня и думаю сможете что-нить придумать.

Думаю, что более просто будет так:
При условии, что CS-ы посажены на один порт.
Задействовать 1 дополнительный канал DMA, который будет синхронно писать данные в регистр BSRR соответствующего порта, тем самым дергая нужные CS.
AlexandrY
Цитата(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
jcxz
Цитата(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 - точно есть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.