Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DMA + SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
777777
Нужно по SPI считывать данные с АЦП и складывать в память. Как это сделать с помощью DMA? Во-первых непонятно с самим SPI, там почему-то биты приема и передачи отдельные, хотя в SPI это невозможно. Во-вторых, как я понял DMA запускается по появлению бита RXNE, но кто запустит SPI? Его надо запустить по появлению сигнала готовности АЦП, программно это можно сделать записав ноль в SPI_DR, но кто это сделает если работать в DMA?
KnightIgor
Цитата(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.
777777
Цитата(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.
KnightIgor
Цитата(777777 @ Mar 9 2011, 14:17) *
Предложение интересное, но беда в том, что оцифровка должна происходить со строго определенным интервалом, задаваемым таймером, а здесь он будет задаваться фактически скоростью SPI.

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

Практически да, он запускается таймером
Цитата(KnightIgor @ Mar 9 2011, 17:24) *
и затем сообщает назад о завершении преобразования сигналом прерывания, то DMA совместно с SPI позволит лишь быстро "выдрать" готовые данные из АЦП. Такая транзакция будет запускаться прерыванием по готовности АЦП

Каким образом сигнал готовности АЦП может запустить DMA? Или SPI?

Цитата(KnightIgor @ Mar 9 2011, 17:24) *
Иначе - делайте все программно, без DMA.

Не хотелось бы, период оцифровки 2 мкс, тогда придется постоянно висеть на опросе готовности.
KnightIgor
Цитата(777777 @ Mar 9 2011, 19:34) *
Практически да, он запускается таймером

А таймер чей?
Цитата
Каким образом сигнал готовности АЦП может запустить DMA? Или SPI?

Например, если АЦП имеет линию прерывания, её можно завести на линию порта процессора и воспользоваться EXTI: из прерывания по изменению на линии запустить DMA.
Цитата
период оцифровки 2 мкс...

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

Цитата
Предложение интересное, но беда в том, что оцифровка должна происходить со строго определенным интервалом, задаваемым таймером, а здесь он будет задаваться фактически скоростью SPI.


Так в п.3 надо заменить запуск от TXE на запуск от другого события. От EXTI дма запускаться не умеет, но должно получиться с таймером.
Хотя при 2мкс должно хватить времени на вариант с прерыванием.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.