|
SPI по DMA на разные м/с |
|
|
|
Jun 6 2017, 14:11
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Rash @ Jun 6 2017, 17:04)  scifi, если есть что-то по делу, расскажите, нет зачем тему засорять. По делу: "работает - не трогай". Вы будете смеяться, но это очень дельный совет. Если это такое улучшательство ради улучшательства, лучше бросьте. Тем более, что на 407 это неблагодарное занятие. На более поздних STM32 вроде бы всякие приятные мелочи появились, но не уверен, что конкретно для этой задачи и там что-то удобное есть.
|
|
|
|
|
Jun 6 2017, 21:06
|

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, где можно творить какой угодно сериальный стрим.
|
|
|
|
|
Jun 6 2017, 21:55
|
Гуру
     
Группа: Свой
Сообщений: 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 лень.  Ещё можно придумать разные фокусы с подсчётом SCLK вашего SPI каким-то таймером и формированию события по достижении некоего числа SCLK (например - фронта CS, или опять-же - event к DMA).
|
|
|
|
|
Jun 7 2017, 03:07
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612

|
Цитата(jcxz @ Jun 7 2017, 01:55)  ну если из любви к искусству и если Вы действительно так въедливы как пишете, то изучите от корки до корки всю периферию своего камня и думаю сможете что-нить придумать. Думаю, что более просто будет так: При условии, что CS-ы посажены на один порт. Задействовать 1 дополнительный канал DMA, который будет синхронно писать данные в регистр BSRR соответствующего порта, тем самым дергая нужные CS.
|
|
|
|
|
Jun 7 2017, 09:06
|
Гуру
     
Группа: Свой
Сообщений: 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? Цитата(AlexandrY @ Jun 7 2017, 09:34)  Tiva уже проверять не стал. Предлагаю вам самим сознаться что немного пофантазировали.  Насчёт Tiva - да я возможно перепутал - там я это не использовал. Но OMAP-L и XMC4xx - точно есть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|