|
STM32F4, DMA GPIO event, нельзя начать транзакцию по событию от GPIO? |
|
|
|
 |
Ответов
|
Sep 10 2014, 13:17
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 10 2014, 15:26
|
Знающий
   
Группа: Свой
Сообщений: 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 раз) ? или вопрос надуманный, и это делается автоматически...?
|
|
|
|
|
Sep 12 2014, 02:52
|
Гуру
     
Группа: Свой
Сообщений: 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 думаю тоже.
|
|
|
|
|
Sep 12 2014, 10:29
|
Знающий
   
Группа: Свой
Сообщений: 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" нет.
|
|
|
|
Сообщений в этой теме
TigerSHARC STM32F4, DMA GPIO event Sep 10 2014, 12:38      adnega Цитата(TigerSHARC @ Sep 10 2014, 19:26) В... Sep 10 2014, 16:01       AHTOXA Цитата(jcxz @ Sep 12 2014, 08:52) Так как... Sep 12 2014, 10:09        adnega Цитата(AHTOXA @ Sep 12 2014, 14:09) Не бо... Sep 12 2014, 10:11        adnega Цитата(TigerSHARC @ Sep 12 2014, 14:29) Т... Sep 12 2014, 11:09         AHTOXA А я б не парился, и сделал запуск DMA-обмена с SPI... Sep 12 2014, 11:28          TigerSHARC Цитата(AHTOXA @ Sep 12 2014, 15:28) А я б... Sep 12 2014, 11:35           AHTOXA Цитата(TigerSHARC @ Sep 12 2014, 17:35) Э... Sep 12 2014, 16:34            adnega Цитата(AHTOXA @ Sep 12 2014, 20:34) Ещё о... Sep 12 2014, 16:45            jcxz Цитата(AHTOXA @ Sep 12 2014, 22:34) Насчё... Sep 12 2014, 19:46             adnega Цитата(jcxz @ Sep 12 2014, 23:46) Вот это... Sep 12 2014, 20:14              jcxz Цитата(adnega @ Sep 13 2014, 02:14) 1. DM... Sep 13 2014, 08:24               adnega До сих пор не ясно нужно ли обрабатывать пришедшие... Sep 13 2014, 08:57               AHTOXA Цитата(jcxz @ Sep 13 2014, 14:24) Вы сейч... Sep 13 2014, 12:04             AHTOXA Цитата(jcxz @ Sep 13 2014, 01:46) Вот это... Sep 13 2014, 06:35 Сергей Борщ А там таймер не может запускать DMA по capture? Sep 12 2014, 11:52 adnega Цитата(Сергей Борщ @ Sep 12 2014, 15:52) ... Sep 12 2014, 12:14 Golikov A. почему 16 раз?
нельзя сказать чтобы ДМА забрало 16... Sep 12 2014, 12:16 adnega Цитата(Golikov A. @ Sep 12 2014, 16:16) п... Sep 12 2014, 13:10 TigerSHARC тема распалась на два вопроса:
1) можно ли решить... Sep 12 2014, 13:17 adnega Цитата1) можно ли решить задачу используя два DMA ... Sep 12 2014, 13:36  TigerSHARC Цитата(adnega @ Sep 12 2014, 17:36) О гот... Sep 12 2014, 14:06   adnega Цитата(TigerSHARC @ Sep 12 2014, 18:06) з... Sep 12 2014, 14:42    TigerSHARC Цитата(adnega @ Sep 12 2014, 18:42) Допус... Sep 12 2014, 14:46     adnega Цитата(TigerSHARC @ Sep 12 2014, 18:46) В... Sep 12 2014, 15:11 Golikov A. В LPC ДМА следит как за флагом готовности данных е... Sep 12 2014, 13:30 TigerSHARC В моей задаче нужно записывать данные в буфер. В м... Sep 13 2014, 11:04 adnega Цитата(TigerSHARC @ Sep 13 2014, 15:04) В... Sep 14 2014, 05:55 Golikov A. АНТОХА вы иногда резковаты, иногда не по делу.
jc... Sep 13 2014, 17:08 jcxz Цитата(Golikov A. @ Sep 13 2014, 23:08) j... Sep 14 2014, 13:52
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|