Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: XMEGA DMA+SPI?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pimen
Стал осваивать XMEGу. очень понравилось, что были исправлены недочеты (например в таймерах).
Особенно порадовался новой схеме смены частоты тактирования ядра.
Но уперся в DMA.
необходимо сделать очень быстрый SPI-master : частота CLK SPI 16 МГц, 4 посылки по 24 бита за минимальное время.
потратил уже несколько дней, но прогресса не вижу, хотя 1 байт по SPI на 16 МГц гоняю уже давно.
Если кто настраивал DMA для SPI, поделитесь секретом.
EWENT system нужно задействовать?
V_G
Использую UART в режиме SPI + DMA. Что-то не понравился мне тогда чистый SPI (возможно, трудно поженить его было с DMA). И первые инженерные образцы, по моему, некорректно работали, когда делитель скорости выставлял по минимуму (0). Пришлось ставить 1. Или наоборот, уже не помню, т.к. серийные образцы этого глюка вроде не имеют.
pimen
Цитата(V_G @ Sep 16 2010, 02:22) *
Использую UART в режиме SPI + DMA. Что-то не понравился мне тогда чистый SPI (возможно, трудно поженить его было с DMA). И первые инженерные образцы, по моему, некорректно работали, когда делитель скорости выставлял по минимуму (0). Пришлось ставить 1. Или наоборот, уже не помню, т.к. серийные образцы этого глюка вроде не имеют.

а не могли бы Вы привести код по настройке DMA?
xelax
Народ, вы даташиты вообще читаете?

Цитата
DMA support on the SPI module is only available in Slave mode.
V_G
Цитата(xelax @ Sep 16 2010, 16:58) *
Народ, вы даташиты вообще читаете?

Мало того, что мы даташиты читаем, мы еще и на практике что-то программируем. Потому и написал, что использую не чистый SPI, а UART в SPI режиме. А это две небольшие разницы. Даже ножки для SPI почему-то Атмел использует хоть и с теми же номерами и для UART-SPI, но перемешал их функции.

2pimen
Понятно, что DMA по-разному работает при передаче и при приеме (при приеме сложнее). Ниже код для передачи. Работаю на ассемблере, не обессудьте

CODE
.equ DMA_SPI_TxADDRCTRL= DMA_CH_SRCRELOAD_gm|DMA_CH_SRCDIR0_bm|DMA_CH_DESTRELOAD_gm
.equ DMA_SPI_RxADDRCTRL= DMA_CH_DESTRELOAD_gm|DMA_CH_DESTDIR0_bm
.equ DMA_SPI_TxTRIGSRC = DMA_CH_TRIGSRC_USARTD1_DRE_gc
.equ DMA_SPI_RxTRIGSRC = DMA_CH_TRIGSRC_USARTD1_RXC_gc

SetupDMA0Tx:
LDI r16,DMA_SPI_TxADDRCTRL
STS DMA_CH0_ADDRCTRL,r16
LDI r16,DMA_SPI_TxTRIGSRC
STS DMA_CH0_TRIGSRC,r16
RET

StartDMASyntez: ;запуск передачи 3 байт в синтезатор частот из SPI_TxBuffer
CBI PORTC,ENS
StartDMA_Tx3bytes:
LDI r16,3
StartDMA_TxNbytes:
STS DMA_CH0_TRFCNT,r16
StartDMASPI_TX:
CLR r16
STS DMA_CH0_TRFCNT+1,r16
LDI r16,low(SPI_TxBuffer)
STS DMA_CH0_SRCADDR0,r16
LDI r16,high(SPI_TxBuffer)
STS DMA_CH0_SRCADDR1,r16
CLR r16
STS DMA_CH0_SRCADDR2,r16
LDI r16,low(USARTD1_DATA)
STS DMA_CH0_DESTADDR0,r16
LDI r16,high(USARTD1_DATA)
STS DMA_CH0_DESTADDR1,r16
CLR r16
STS DMA_CH0_DESTADDR2,r16
StartDMASPI:
RCALL EnaSPI_DMA_Ints
LDI r16,Start_DMA
STS DMA_CH0_CTRLA,r16
SEI
RET
xelax
Цитата(V_G @ Sep 16 2010, 15:53) *
Мало того, что мы даташиты читаем, мы еще и на практике что-то программируем.


Знание через руки, тоже знание. biggrin.gif
А ещё предлагаю перечитать Вам Сообщение #2
Тренеруйте память.
pimen
2xelax
проморгал (
попробовал через USART SPI mode, стало получаться
спасибо за помощь
V_G
Цитата(xelax @ Sep 17 2010, 01:23) *
Знание через руки, тоже знание. biggrin.gif
А ещё предлагаю перечитать Вам Сообщение #2
Тренеруйте память.

Никак не могу понять, что же я забыл из своего же сообщения #2, видать, совсем отупел...
И через руки это знание тоже пропускал во вторую очередь, сначала все-таки изучил даташит, и сразу предпочел USART-SPI + DMA. И было это почти два года назад.
eastwind
Цитата(V_G @ Sep 16 2010, 17:53) *
Понятно, что DMA по-разному работает при передаче и при приеме (при приеме сложнее).

Если кто то настраивал USART в режиме SPI, подскажите, как настраивать DMA на прием?
С передачей проблем не возникло, а вот с приемом что то подзастрял...
При источнике события DMA_CH_TRIGSRC_USARTD1_RXC и настройке DMA канала на прием трансфер не стартует.
На линии SCK клока нет.
V_G
SCK обязан вырабатывать мастер. В режиме приема я использую прерывание по DRE для выдачи произвольного (мне нравится 0xAA) байта в SPI и выдачи сигнала тактирования, а также для сброса чипселекта по окончании DMA
eastwind
Цитата(V_G @ Sep 27 2010, 16:39) *
SCK обязан вырабатывать мастер. В режиме приема я использую прерывание по DRE для выдачи произвольного (мне нравится 0xAA) байта в SPI и выдачи сигнала тактирования, а также для сброса чипселекта по окончании DMA

Я правильно понимаю, что для работы ДМА на прием, нужно разрешать ещё и прерывание по передатчику и в его обработчике после передачи каждого байта записывать данные в буфер передатчика - для инициирования процесса передачи и, соответственно, тактирования?
если так - то какое то это кривое "ДМА".
V_G
А вы с SPI без DMA не работали? То же самое, при приеме нужны холостые передачи. Я глубоко не вдавался, может, на холостую передачу можно еще один DMA задействовать. У меня просто свободных нет. Хотя согласен, удобней было бы иметь такую функцию с автоматическим каким-то тактированием. С другой стороны, вспомним, что мы и так используем "левый" SPI из UART, а чистый SPI вообще с DMA не дружит.
Может, какие-нить крутые армы-кортексы умеют делать SPI-DMA без каких-либо усилий со стороны программера?
eastwind
Цитата(V_G @ Sep 27 2010, 18:35) *
А вы с SPI без DMA не работали? То же самое, при приеме нужны холостые передачи. Я глубоко не вдавался, может, на холостую передачу можно еще один DMA задействовать. У меня просто свободных нет. Хотя согласен, удобней было бы иметь такую функцию с автоматическим каким-то тактированием. С другой стороны, вспомним, что мы и так используем "левый" SPI из UART, а чистый SPI вообще с DMA не дружит.
Может, какие-нить крутые армы-кортексы умеют делать SPI-DMA без каких-либо усилий со стороны программера?

ну конечно работал, что за вопрос
однако ж хотелось бы, чтоб ДМА само перегружало буфер передатчика при настройке на прием... unsure.gif

да, я так и сделал изначально - использовал при приеме доп. канал дма для перезагрузки содержимого передающего буфера, чтобы инициировался процесс обмена.
но, имхо, это довольно криво.. потому и сомневаюсь.. может есть какой то другой способ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.