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

 
 
 
Reply to this topicStart new topic
> XMEGA DMA+SPI?, требуется помощь
pimen
сообщение Sep 15 2010, 19:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



Стал осваивать XMEGу. очень понравилось, что были исправлены недочеты (например в таймерах).
Особенно порадовался новой схеме смены частоты тактирования ядра.
Но уперся в DMA.
необходимо сделать очень быстрый SPI-master : частота CLK SPI 16 МГц, 4 посылки по 24 бита за минимальное время.
потратил уже несколько дней, но прогресса не вижу, хотя 1 байт по SPI на 16 МГц гоняю уже давно.
Если кто настраивал DMA для SPI, поделитесь секретом.
EWENT system нужно задействовать?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 15 2010, 22:22
Сообщение #2


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Использую UART в режиме SPI + DMA. Что-то не понравился мне тогда чистый SPI (возможно, трудно поженить его было с DMA). И первые инженерные образцы, по моему, некорректно работали, когда делитель скорости выставлял по минимуму (0). Пришлось ставить 1. Или наоборот, уже не помню, т.к. серийные образцы этого глюка вроде не имеют.
Go to the top of the page
 
+Quote Post
pimen
сообщение Sep 16 2010, 04:37
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



Цитата(V_G @ Sep 16 2010, 02:22) *
Использую UART в режиме SPI + DMA. Что-то не понравился мне тогда чистый SPI (возможно, трудно поженить его было с DMA). И первые инженерные образцы, по моему, некорректно работали, когда делитель скорости выставлял по минимуму (0). Пришлось ставить 1. Или наоборот, уже не помню, т.к. серийные образцы этого глюка вроде не имеют.

а не могли бы Вы привести код по настройке DMA?
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 16 2010, 05:58
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Народ, вы даташиты вообще читаете?

Цитата
DMA support on the SPI module is only available in Slave mode.
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 16 2010, 11:53
Сообщение #5


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(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
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 16 2010, 14:23
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(V_G @ Sep 16 2010, 15:53) *
Мало того, что мы даташиты читаем, мы еще и на практике что-то программируем.


Знание через руки, тоже знание. biggrin.gif
А ещё предлагаю перечитать Вам Сообщение #2
Тренеруйте память.
Go to the top of the page
 
+Quote Post
pimen
сообщение Sep 16 2010, 18:58
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 30-11-07
Пользователь №: 32 846



2xelax
проморгал (
попробовал через USART SPI mode, стало получаться
спасибо за помощь
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 17 2010, 00:12
Сообщение #8


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



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

Никак не могу понять, что же я забыл из своего же сообщения #2, видать, совсем отупел...
И через руки это знание тоже пропускал во вторую очередь, сначала все-таки изучил даташит, и сразу предпочел USART-SPI + DMA. И было это почти два года назад.
Go to the top of the page
 
+Quote Post
eastwind
сообщение Sep 27 2010, 07:09
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 1-08-05
Пользователь №: 7 242



Цитата(V_G @ Sep 16 2010, 17:53) *
Понятно, что DMA по-разному работает при передаче и при приеме (при приеме сложнее).

Если кто то настраивал USART в режиме SPI, подскажите, как настраивать DMA на прием?
С передачей проблем не возникло, а вот с приемом что то подзастрял...
При источнике события DMA_CH_TRIGSRC_USARTD1_RXC и настройке DMA канала на прием трансфер не стартует.
На линии SCK клока нет.
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 27 2010, 10:39
Сообщение #10


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



SCK обязан вырабатывать мастер. В режиме приема я использую прерывание по DRE для выдачи произвольного (мне нравится 0xAA) байта в SPI и выдачи сигнала тактирования, а также для сброса чипселекта по окончании DMA
Go to the top of the page
 
+Quote Post
eastwind
сообщение Sep 27 2010, 12:19
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 1-08-05
Пользователь №: 7 242



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

Я правильно понимаю, что для работы ДМА на прием, нужно разрешать ещё и прерывание по передатчику и в его обработчике после передачи каждого байта записывать данные в буфер передатчика - для инициирования процесса передачи и, соответственно, тактирования?
если так - то какое то это кривое "ДМА".
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 27 2010, 12:35
Сообщение #12


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



А вы с SPI без DMA не работали? То же самое, при приеме нужны холостые передачи. Я глубоко не вдавался, может, на холостую передачу можно еще один DMA задействовать. У меня просто свободных нет. Хотя согласен, удобней было бы иметь такую функцию с автоматическим каким-то тактированием. С другой стороны, вспомним, что мы и так используем "левый" SPI из UART, а чистый SPI вообще с DMA не дружит.
Может, какие-нить крутые армы-кортексы умеют делать SPI-DMA без каких-либо усилий со стороны программера?
Go to the top of the page
 
+Quote Post
eastwind
сообщение Sep 28 2010, 03:46
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 1-08-05
Пользователь №: 7 242



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

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

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

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 16:40
Рейтинг@Mail.ru


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