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

 
 
> STM32F4: по EXTI запускать чтение SPI по DMA, чтение из внешнего ацп по сигналу DRDY
kostyan
сообщение Dec 17 2014, 09:35
Сообщение #1


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Народ помогите разобраться! Готовность данных во внешнем АЦП сигнализируется перепадом в ноль на пине. После этого надо прочитать из АЦП 3 байта, и далее ждать следующей оцифровки. Есть какой то механизм в STM32F4 чтобы по перепаду на пине запускать чтение SPI через DMA, не пользуя прерывание?

Сообщение отредактировал kostyan - Dec 17 2014, 09:36
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
scifi
сообщение Dec 17 2014, 09:53
Сообщение #2


Гуру
******

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



Я бы сделал запуск таймера по сигналу от АЦП, а таймер может выдавать нужное чисто запросов DMA с нужными интервалами через каналы Compare, к примеру. В свою очередь, DMA может запускать SPI.
Короче, всё можно сделать. Нужно просто правильно состыковать все кусочки.
Go to the top of the page
 
+Quote Post
kostyan
сообщение Dec 17 2014, 11:08
Сообщение #3


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



спасибо, начал гуглить в заданном направлении, наткнулся на местную тему http://electronix.ru/forum/index.php?showt...02445&st=15 , в теме нашел пример, который в данный момент и медитирую.
Go to the top of the page
 
+Quote Post
kostyan
сообщение Dec 17 2014, 12:23
Сообщение #4


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Так, "многоходовочка" вроде бы вырисовывается: настраиваем таймер TIM1_CH1 на падающий фронт; таймер генерит запрос на DMA2_Stream6 Channel_0, который настроен на передачу по SPI1 трех нулевых байтов, плюс настроен еще DMA2_Stream3 Channel_3 на чтение из SPI1, которое начинается по записи в передатчик SPI1 первого байта.
В оконцове цепочки мы прочитаем 3 байта из внешнего АЦП - 24х битное значение и получим прерывание об окончании чтения (если настроим его естественно) . А хотелось бы прочитать кучу значений АЦП в десятки кБ, и только потом получить прерывание какое то об достигнутом. Можно это реализовать?
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 17 2014, 13:32
Сообщение #5


Гуру
******

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



В этой теме задача практически такая же.
Цитата
есть внешний АЦП. передает данные по SPI. О готовности данных сообщает отрицательным фронтом на ноге.

Последовательность работы должна быть такая:
1)каждые 10мкс приходит отрицательный фронт на ногу
2) с приходом каждого фронта один канал DMA пишет в SPI_TX несколько байт
3) другой канал DMA натсроен на событие от SPI_RX и принимает столько данных сколько отправили в SPI_TX.

В SPI_TX отправляются dummy данные, так как это нужно лишь для приёма данных от SPI_TX
Go to the top of the page
 
+Quote Post
kostyan
сообщение Dec 18 2014, 04:08
Сообщение #6


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



спасибо за наводку, буду медитировать это:

Цитата
Я бы предложил так:
1. Настраиваем один DMA на передачу 16 байт по событиям от SPI_TX.
2. Настраиваем другой DMA на прием N*2*16 байт по событиям от SPI_RX в кольцевой буфер с генерацией прерываний при заполнении и полузапонении.
3. Настраиваем таймер на одиночный запуск по спаду на ноге.
4. Первый канал совпадения таймера настраиваем на запись через еще один канал DMA числа 16 для NDTR первого DMA (M2M).
5. Второй канал совпадения таймера настраиваем на запись через еще один канал DMA управляющего слова (регистр CR) для первого DMA для запуска передачи (M2M).
6. Разрешаем таймер.
7. Имеем каждые N срабатываний готовности одно прерывание с данными в кольцевом буфере. Пока шаманим с этими данными, заполняется вторая часть кольцевого буфера - никто не потеряется.


Сообщение отредактировал kostyan - Dec 18 2014, 04:11
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 18 2014, 08:19
Сообщение #7


Гуру
******

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



Цитата(kostyan @ Dec 18 2014, 07:08) *
спасибо за наводку, буду медитировать это:

Там можно много вариантов придумать, в том числе каскады таймеров. Конкретно этот вариант как-то странно выглядит. Ну да ладно, вдруг что-то получится.
Go to the top of the page
 
+Quote Post
kostyan
сообщение Dec 29 2014, 11:04
Сообщение #8


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Подходит время расставлять точки над Ё:

Цитата
3. Настраиваем таймер на одиночный запуск по спаду на ноге.

Я правильно понимаю, что надо настроить таймер на режим захвата? Какой то минимальный пример или сцылу на пример бы...
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 29 2014, 11:43
Сообщение #9


Гуру
******

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



Цитата(kostyan @ Dec 29 2014, 15:04) *
Я правильно понимаю, что надо настроить таймер на режим захвата? Какой то минимальный пример или сцылу на пример бы...

Не совсем. У таймеров есть внешний вход "ETR". По фронту этого сигнала можно начать счет установкой "Trigger Mode" в поле "SMS" регистра "TIMx_SMCR".
Go to the top of the page
 
+Quote Post
kostyan
сообщение Dec 30 2014, 04:30
Сообщение #10


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



А вроде даже и заработало, но есть нюанс!

В доках написано: "TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. " То есть нарастающий фронт ловится, а мне надо спадающий faling edges. Как то можно крутануть в контроллере это дело?

А пардон, сам нашел в доках.

Заработал таймер, теперь на повестке:

Цитата
4. Первый канал совпадения таймера настраиваем на запись через еще один канал DMA числа 16 для NDTR первого DMA (M2M).
5. Второй канал совпадения таймера настраиваем на запись через еще один канал DMA управляющего слова (регистр CR) для первого DMA для запуска передачи (M2M).


Вопрос один - собственно КАК? Как от одного таймера настроить два запроса на разные каналы ДМА? Каплю кода бы в пример...

Сообщение отредактировал kostyan - Dec 30 2014, 08:58
Go to the top of the page
 
+Quote Post
kostyan
сообщение Jan 22 2015, 04:11
Сообщение #11


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

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Сделал в итоге через EXTI, как уже ранее предлагалось:
Цитата(AHTOXA @ Sep 12 2014, 16:28) *
А я б не парился, и сделал запуск DMA-обмена с SPI в прерывании от EXTI.
Хотя в качестве разминки для мозгов такие комбинации наверное полезны, даsm.gif

Способ запуска одного дма через 2 других М2М дма не подходит, ибо помимо установки регистров DMA1_Stream4->NDTR и DMA1_Stream4->CR, необходимо еще устанавливать регистр DMA1->HIFCR.

И вроде вполне все бодро крутится - проц готов к свершениям помимо данной задачи. Тему можно закрывать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:13
Рейтинг@Mail.ru


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