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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> STM32F4, DMA GPIO event, нельзя начать транзакцию по событию от GPIO?
TigerSHARC
сообщение Sep 10 2014, 12:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Читаю TRM на STM32F4X9. Ужаснулся когда увидел отсутствие GPIO в "DMA request mappining". Как быть если надо по внешнему событию запускать транзакцию?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 10 2014, 12:45
Сообщение #2


Гуру
******

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



Цитата(TigerSHARC @ Sep 10 2014, 16:38) *
Читаю TRM на STM32F4X9. Ужаснулся когда увидел отсутствие GPIO в "DMA request mappining". Как быть если надо по внешнему событию запускать транзакцию?

Можно таймер задействовать.
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 10 2014, 12:47
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(adnega @ Sep 10 2014, 16:45) *
Можно таймер задействовать.

Я правильно понял: вход таймера использовать как вход внешнего события?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 10 2014, 13:00
Сообщение #4


Гуру
******

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



Цитата(TigerSHARC @ Sep 10 2014, 16:47) *
Я правильно понял: вход таймера использовать как вход внешнего события?

А вы могли бы озвучить задачу полностью?
Зачем DMA? Почему не прерывание по EXTI?
С какой частотой планируются запросы? Какими данными будут оперировать DMA (кто источник, кто приемник данных)?
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 10 2014, 13:17
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(adnega @ Sep 10 2014, 17:00) *
А вы могли бы озвучить задачу полностью?
Зачем DMA? Почему не прерывание по EXTI?
С какой частотой планируются запросы? Какими данными будут оперировать DMA (кто источник, кто приемник данных)?

есть внешний АЦП. передает данные по SPI. О готовности данных сообщает отрицательным фронтом на ноге. На OMAP-L138 такое решается на раз (есть GPIO event mode)

Последовательность работы должна быть такая:
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
adnega
сообщение Sep 10 2014, 13:42
Сообщение #6


Гуру
******

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



Цитата(TigerSHARC @ Sep 10 2014, 17:17) *
есть внешний АЦП. передает данные по SPI. О готовности данных сообщает отрицательным фронтом на ноге. На OMAP-L138 такое решается на раз (есть GPIO event mode)

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

В SPI_TX отправляются dummy данные, так как это нужно лишь для приёма данных от SPI_TX

Можно сделать через прерывание EXTI для ноги, на которую приходит сигнал готовности. В обработчике прерывания настраивать два канала DMA для SPI_TX и SPI_RX.

Можно попробовать сделать и полностью аппаратное решение на таймере. Сколько байт нужно принимать каждые 10мкс?
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 10 2014, 15:26
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(adnega @ Sep 10 2014, 17:42) *
Можно сделать через прерывание EXTI для ноги, на которую приходит сигнал готовности. В обработчике прерывания настраивать два канала DMA для SPI_TX и SPI_RX.

Можно попробовать сделать и полностью аппаратное решение на таймере. Сколько байт нужно принимать каждые 10мкс?


16 байт

Сейчас подумал:
1) пришло прерывание, нужно забрать 16 байт
2) для этого нужно эти 16 байт отправить

Вопрос: как DMA отправляет данные в SPI_TX, если нужно ещё какое-то время чтобы данные отправились. Т.е. как DMA получит уведомление что байт ушёл и можно копировать следующий байт (и так 16 раз) ? или вопрос надуманный, и это делается автоматически...?
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 10 2014, 16:01
Сообщение #8


Гуру
******

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



Цитата(TigerSHARC @ Sep 10 2014, 19:26) *
Вопрос: как DMA отправляет данные в SPI_TX, если нужно ещё какое-то время чтобы данные отправились. Т.е. как DMA получит уведомление что байт ушёл и можно копировать следующий байт (и так 16 раз) ? или вопрос надуманный, и это делается автоматически...?

Когда инициализируете поток, указываете сколько транзакций совершить.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 12 2014, 02:52
Сообщение #9


Гуру
******

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



Цитата(TigerSHARC @ Sep 10 2014, 21:26) *
Сейчас подумал:
1) пришло прерывание, нужно забрать 16 байт
2) для этого нужно эти 16 байт отправить
Вопрос: как DMA отправляет данные в SPI_TX, если нужно ещё какое-то время чтобы данные отправились. Т.е. как DMA получит уведомление что байт ушёл и можно копировать следующий байт (и так 16 раз) ? или вопрос надуманный, и это делается автоматически...?

Так как в STM32 в каналах SPI нет буферизации, то одним DMA здесь не обойтись.
Можно сделать примерно так:
Таймер1 получает внешний сигнал, пинает DMA-канал1, который конфигурит другой таймер2, который в свою очередь начинает выдавать события (16 штук) на пересылки DMA-канал2->SPI,
последним блоком (в STM32 есть DMA-передачи свЯзным списком типа L137/L138 или NXP LPC17xx?) DMA-канал2 конфигурит таймер2 (выключает его).
Всю эту кухню можно сделать работающей в пинг-понг (без перепрограммирования CPU на каждый цикл).
Если в DMA STM32 нет возможности передач связным списком, то функцию выключения таймера2 можно также возложить на таймер1+DMA-канал1
(в таймере1 делаем два события по совпадению: одно - сразу после старта, второе - через определённый промежуток времени, достаточный
для генерации таймером2 16 событий).

Если-бы в SPI STM32 было FIFO на 16*8бит, то можно было-бы обойтись одним DMA и таймером - сразу загонять в FIFO 16*8бит, а уже он, с установленной частотой выдавал бы их наружу.
Опять-же - на LPC17xx такое возможно (там есть требуемый объём FIFO) и на L137/L138 думаю тоже.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 12 2014, 10:09
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(jcxz @ Sep 12 2014, 08:52) *
Так как в STM32 в каналах SPI нет буферизации, то одним DMA здесь не обойтись.

Не болтайте ерундой, всё прекрасно делается только на DMA. Один канал на передачу, второй на приём.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 12 2014, 10:11
Сообщение #11


Гуру
******

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



Цитата(AHTOXA @ Sep 12 2014, 14:09) *
Не болтайте ерундой, всё прекрасно делается только на DMA. Один канал на передачу, второй на приём.

+1.
Что-то ТС пропал, видимо, уже все сделал)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 12 2014, 10:29
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(jcxz @ Sep 12 2014, 06:52) *
Так как в STM32 в каналах SPI нет буферизации, то одним DMA здесь не обойтись.
Можно сделать примерно так:
Таймер1 получает внешний сигнал, пинает DMA-канал1, который конфигурит другой таймер2, который в свою очередь начинает выдавать события (16 штук) на пересылки DMA-канал2->SPI,
последним блоком (в STM32 есть DMA-передачи свЯзным списком типа L137/L138 или NXP LPC17xx?) DMA-канал2 конфигурит таймер2 (выключает его).
Всю эту кухню можно сделать работающей в пинг-понг (без перепрограммирования CPU на каждый цикл).
Если в DMA STM32 нет возможности передач связным списком, то функцию выключения таймера2 можно также возложить на таймер1+DMA-канал1
(в таймере1 делаем два события по совпадению: одно - сразу после старта, второе - через определённый промежуток времени, достаточный
для генерации таймером2 16 событий).

Если-бы в SPI STM32 было FIFO на 16*8бит, то можно было-бы обойтись одним DMA и таймером - сразу загонять в FIFO 16*8бит, а уже он, с установленной частотой выдавал бы их наружу.
Опять-же - на LPC17xx такое возможно (там есть требуемый объём FIFO) и на L137/L138 думаю тоже.

это конечно тот ещё винигрет

Цитата(adnega @ Sep 12 2014, 14:11) *
+1.
Что-то ТС пропал, видимо, уже все сделал)

ТС тут. старт реализации задумки намечен не ранее чем через 2 недели.
пока курю даташит...

Цитата(AHTOXA @ Sep 12 2014, 14:09) *
Не болтайте ерундой, всё прекрасно делается только на DMA. Один канал на передачу, второй на приём.

наверное, в моём случае, не только на DMA, но и на одном таймере, так как "DMA GPIO event" нет.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 12 2014, 11:09
Сообщение #13


Гуру
******

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



Цитата(TigerSHARC @ Sep 12 2014, 14:29) *
ТС тут. старт реализации задумки намечен не ранее чем через 2 недели.
пока курю даташит...

Я бы предложил так:
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 срабатываний готовности одно прерывание с данными в кольцевом буфере. Пока шаманим с этими данными, заполняется вторая часть кольцевого буфера - никто не потеряется.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 12 2014, 11:28
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А я б не парился, и сделал запуск DMA-обмена с SPI в прерывании от EXTI.
Хотя в качестве разминки для мозгов такие комбинации наверное полезны, даsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Sep 12 2014, 11:35
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



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

Это как в прерывании дёргать пин чтобы меандр нужной частоты получить
без прерывваний экономичнее получается (в плане расхода процессорного времени).
Go to the top of the page
 
+Quote Post

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

 


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


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