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

 
 
> DMA и FreeRTOS
Jenya7
сообщение May 31 2018, 04:55
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Мне нужно переслать по SPI пакет данных 4K при помощи DMA.
Если произошла смена таска DMA умеет продолжить после того как вернулся таск? Или ему не важна смена таска?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rudy_b
сообщение Jun 1 2018, 11:16
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Можно чуть иначе. Начало передачи определяется командой или таймером. В этот момент ставится CS и запускается таймер на фиксированное время - слейву на подготовку данных к передаче и запуска своего DMA на прием/передачу. По истечении таймера (прерывание) мастер запускает свой DMA на прием/передачу и разрешает прерывание по завершению приема по DMA. По этому прерыванию он снимает CS - цикл передачи завершен.

Слейв по переднему фронту CS (прерывание по ноге) готовит данные, запускает свой DMA на прием/передачу и разрешает прерывание завершения приема DMA. По этому прерыванию обрабатывает полученные данные.

Состояние CS используется только если нужно навесить несколько слейвов - тогда по переднему фронту CS считывается адрес (доп. ноги) и, если он совпадает - готовится передача и нога MISO включается как выход. По снятию CS (прерывание по заднему фронту) эта нога переключается во вход.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jun 1 2018, 16:05
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(rudy_b @ Jun 1 2018, 15:16) *
Можно чуть иначе.

Это в случае, если подчиненное устройство допускает одну фазу CS для многих байт данных. Но многие (почти все) АЦП/ЦАП, работающие по SPI, должны дергать CS каждый байт/слово. А если это делать в прерываниях, это равносильно ручному дерганию (в прерывании все равно присутствует код переключения ножки). Это не есть комильфо, ведь цель не достигнута получается (от программного руления ножкой не избавились). В моем же случае все делается автоматически - главное успевай данные обрабатывать. Я оцифровывал на 10кГц, соответственно при программном управлении CS в прерывании мне надо было бы входить в прерывание 20 000 раз в секунду. Для меня, даже несмотря на 180МГц работающий CPU, это видится неприемлимым (не хочу насиловать МК такими частотами прерываний, особенно если от этого можно гибко увильнуть).

Цитата
я не понимаю. а почему нельзя опустить CS - запустить DMA - а в прерывании по окончанию транзакции DMA поднять CS.

Я причину описал выше. Многим подчиненным смена CS жизненно важна для каждого передаваемого единичного объекта данных (байт, полуслово, слово и т.д.).
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Jun 1 2018, 18:12
Сообщение #4


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

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(Arlleex @ Jun 1 2018, 22:05) *
Это в случае, если подчиненное устройство допускает одну фазу CS для многих байт данных. Но многие (почти все) АЦП/ЦАП, работающие по SPI, должны дергать CS каждый байт/слово.

У spi есть два режима cs - Motorola и TI режим, и я их постоянно путаю.
Один из них может активировать cs, но не может его снять - предназначен для работы с потоком.
Второй дёргает ногу cs с каждой 4-16 битной одноразовой передачей данных. Размер данных задаётся отдельно.

Меня другое волнует, они уже давно придумали fifo буфер и ещё кучу полезностей, но отчего-то размер данных ограничен в 16 бит...
Go to the top of the page
 
+Quote Post



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

 


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


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