|
|
  |
DMA + SPI, в STM32F103 |
|
|
|
Mar 9 2011, 11:25
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(777777 @ Mar 9 2011, 12:07)  Нужно по SPI считывать данные с АЦП и складывать в память. Как это сделать с помощью DMA? Во-первых непонятно с самим SPI, там почему-то биты приема и передачи отдельные, хотя в SPI это невозможно. Во-вторых, как я понял DMA запускается по появлению бита RXNE, но кто запустит SPI? Его надо запустить по появлению сигнала готовности АЦП, программно это можно сделать записав ноль в SPI_DR, но кто это сделает если работать в DMA? 1. Берутся два канала DMA: один для передачи по SPI, другой - для приема. 2. Тот, который для передачи, толкается разок программно. 3. Если TXE установлен/установился, DMA передачи запускает (очередную) транзакцию, что приводит и к "втягиванию" данных извне со входа SPI. 4. Как только RXNE установится, DMA приема "слизнет" SPI->DR в память. 5. Возвращаемся к пункту 3, пока счетчик DMA не закончится. 6. Обрабатываем прерывание по завершению приема, переходим к пункту 2.
|
|
|
|
|
Mar 9 2011, 13:17
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(KnightIgor @ Mar 9 2011, 14:25)  1. Берутся два канала DMA: один для передачи по SPI, другой - для приема. 2. Тот, который для передачи, толкается разок программно. 3. Если TXE установлен/установился, DMA передачи запускает (очередную) транзакцию, что приводит и к "втягиванию" данных извне со входа SPI. 4. Как только RXNE установится, DMA приема "слизнет" SPI->DR в память. 5. Возвращаемся к пункту 3, пока счетчик DMA не закончится. 6. Обрабатываем прерывание по завершению приема, переходим к пункту 2. Предложение интересное, но беда в том, что оцифровка должна происходить со строго определенным интервалом, задаваемым таймером, а здесь он будет задаваться фактически скоростью SPI.
|
|
|
|
|
Mar 9 2011, 14:24
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(777777 @ Mar 9 2011, 14:17)  Предложение интересное, но беда в том, что оцифровка должна происходить со строго определенным интервалом, задаваемым таймером, а здесь он будет задаваться фактически скоростью SPI. Все зависит от алгоритма работы системы оцифровки и временнЫх диаграмм АЦП. Вы выложили слишком мало информации, чтобы судить, что быстро, а что нет, и предложить разумную аппаратную-алгоритмическую поддержку. Если предположить, что внешний АЦП запускается снаружи и затем сообщает назад о завершении преобразования сигналом прерывания, то DMA совместно с SPI позволит лишь быстро "выдрать" готовые данные из АЦП. Такая транзакция будет запускаться прерыванием по готовности АЦП, а прерывание завершения транзакции сообщит о готовности всех данных. Иначе - делайте все программно, без DMA.
|
|
|
|
|
Mar 9 2011, 18:34
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(KnightIgor @ Mar 9 2011, 17:24)  Если предположить, что внешний АЦП запускается снаружи Практически да, он запускается таймером Цитата(KnightIgor @ Mar 9 2011, 17:24)  и затем сообщает назад о завершении преобразования сигналом прерывания, то DMA совместно с SPI позволит лишь быстро "выдрать" готовые данные из АЦП. Такая транзакция будет запускаться прерыванием по готовности АЦП Каким образом сигнал готовности АЦП может запустить DMA? Или SPI? Цитата(KnightIgor @ Mar 9 2011, 17:24)  Иначе - делайте все программно, без DMA. Не хотелось бы, период оцифровки 2 мкс, тогда придется постоянно висеть на опросе готовности.
|
|
|
|
|
Mar 9 2011, 20:02
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(777777 @ Mar 9 2011, 19:34)  Практически да, он запускается таймером А таймер чей? Цитата Каким образом сигнал готовности АЦП может запустить DMA? Или SPI? Например, если АЦП имеет линию прерывания, её можно завести на линию порта процессора и воспользоваться EXTI: из прерывания по изменению на линии запустить DMA. Цитата период оцифровки 2 мкс... Напряг...
|
|
|
|
|
Mar 10 2011, 15:15
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073

|
Цитата 1. Берутся два канала DMA: один для передачи по SPI, другой - для приема. 2. Тот, который для передачи, толкается разок программно. 3. Если TXE установлен/установился, DMA передачи запускает (очередную) транзакцию, что приводит и к "втягиванию" данных извне со входа SPI. 4. Как только RXNE установится, DMA приема "слизнет" SPI->DR в память. 5. Возвращаемся к пункту 3, пока счетчик DMA не закончится. 6. Обрабатываем прерывание по завершению приема, переходим к пункту 2. Цитата Предложение интересное, но беда в том, что оцифровка должна происходить со строго определенным интервалом, задаваемым таймером, а здесь он будет задаваться фактически скоростью SPI. Так в п.3 надо заменить запуск от TXE на запуск от другого события. От EXTI дма запускаться не умеет, но должно получиться с таймером. Хотя при 2мкс должно хватить времени на вариант с прерыванием.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|