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

 
 
> SAM3U и SPI, Запуск SPI с DMA
*rust*
сообщение May 10 2011, 05:26
Сообщение #1


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

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



Добрый день!

Кто-нибудь запускал SPI с DMA (прием\передача) на AT91SAM3U?
В даташите есть упоминание, что SPI может работать с DMA, в библиотеке от ATMEL есть специальные функции, реализующие эту работу:
Код
unsigned char SPI_WriteBuffer(AT91S_SPI *spi, void *buffer, unsigned int length)
запись
Код
unsigned char SPI_ReadBuffer(AT91S_SPI *spi, void *buffer, unsigned int length)
чтение

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

Внутри этих функций (на примере SPI_ReadBuffer) инициализация и запуск DMA:
Код
#if !defined(CHIP_SPI_DMA)
    // Check if the first bank is free
    if (spi->SPI_RCR == 0) {

        spi->SPI_RPR = (unsigned int) buffer;
        spi->SPI_RCR = length;
        spi->SPI_PTCR = AT91C_PDC_RXTEN;
        return 1;
    }
    // Check if second bank is free
    else if (spi->SPI_RNCR == 0) {

        spi->SPI_RNPR = (unsigned int) buffer;
        spi->SPI_RNCR = length;
        return 1;
    }
#endif
    // No free bank
    return 0;
}


Сразу после записи в SPI_RCR(количество перемещаемых байт), проверяю этот регистр, а он равен 0.

Настораживает тот момент, что в ашнике на проц AT91SAM3U4.h нет адресов для регистров DMA работающих с SPI, хотя в структуре SPI эти регистры присутствуют.

Заранее благодарен за помощь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
*rust*
сообщение May 25 2011, 11:27
Сообщение #2


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

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



aaarrr, спасибо Вам за помощь!

Все получилось SPI через DMA заработал (прием и передача). Конечно очень помог пример с зарубежного сайта, который я приводил несколькими постами выше.
Для всех нуждающихся выкладываю код, сразу оговорюсь, что на оригинальность не претендую:

CODE
//настройка DMA от приемника SPI до буфера // RX

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_HDMA;
AT91C_BASE_HDMA->HDMA_GCFG=0;
//
DMA_SetSourceAddr(0,(unsigned int)&AT91C_BASE_SPI0->SPI_RDR); //регист приемника SPI
DMA_SetDestinationAddr(0,(unsigned int)prt_DMA); //указатель на массив

DMA_SetSourceBufferSize(0, buffer_size, 0, 0, 1); // buffer_size-кол-во перемещаемых байт

AT91C_BASE_HDMA_CH_0->HDMA_CTRLB = (AT91C_HDMA_SRC_DSCR_FETCH_DISABLE |
AT91C_HDMA_DST_DSCR_FETCH_DISABLE |
AT91C_HDMA_SRC_ADDRESS_MODE_FIXED |
AT91C_HDMA_DST_ADDRESS_MODE_INCR |
AT91C_HDMA_FC_PER2MEM);

AT91C_BASE_HDMA_CH_0->HDMA_CFG = (AT91C_HDMA_SRC_PER_2 |
AT91C_HDMA_LOCK_IF_DISABLE |
AT91C_HDMA_LOCK_B_DISABLE |
AT91C_HDMA_SRC_H2SEL_HW |
AT91C_HDMA_DST_H2SEL_SW |
AT91C_HDMA_FIFOCFG_LARGESTBURST);

//настройка DMA в передатчик SPI с буфера памяти// ТX
//в моем случае я передаю одно и то же число, поэтому инкремента/декремента для памяти у меня нет.

DMA_SetSourceAddr(1,(unsigned int)prt_trr);
DMA_SetDestinationAddr(1,(unsigned int)&AT91C_BASE_SPI0->SPI_TDR);

DMA_SetSourceBufferSize(1, buffer_size, 0, 0, 1);

AT91C_BASE_HDMA_CH_1->HDMA_DSCR=0;
AT91C_BASE_HDMA_CH_1->HDMA_CTRLB = (AT91C_HDMA_SRC_DSCR_FETCH_DISABLE |
AT91C_HDMA_DST_DSCR_FETCH_DISABLE |
AT91C_HDMA_SRC_ADDRESS_MODE_FIXED|
AT91C_HDMA_DST_ADDRESS_MODE_FIXED|
AT91C_HDMA_FC_MEM2PER);

AT91C_BASE_HDMA_CH_1->HDMA_CFG = (AT91C_HDMA_DST_PER_1 |
AT91C_HDMA_SOD_DISABLE |
AT91C_HDMA_LOCK_IF_DISABLE |
AT91C_HDMA_LOCK_B_DISABLE |
AT91C_HDMA_SRC_H2SEL_SW |
AT91C_HDMA_DST_H2SEL_HW |
AT91C_HDMA_FIFOCFG_LARGESTBURST);
//В даташите написано, что нужно с начало запустить DMA, а потом периферию, если используете Flow controller
//поэтому:
void start_DMA(void)
{
DMA_SetSourceAddr(0,(unsigned int)&AT91C_BASE_SPI0->SPI_RDR);
DMA_SetDestinationAddr(0,(unsigned int)prt_DMA);
DMA_SetSourceBufferSize(0, buffer_size, 0, 0, 1);

DMA_SetSourceAddr(1,(unsigned int)prt_trr);
DMA_SetDestinationAddr(1,(unsigned int)&AT91C_BASE_SPI0->SPI_TDR);
DMA_SetSourceBufferSize(1, buffer_size, 0, 0, 1);

DMA_EnableChannel(0);
DMA_EnableChannel(1);
}

//Configure pins for SPI
PIO_Configure(pinsSPI, PIO_LISTSIZE(pinsSPI));
ConfigureSPI();// and Enable SPI



После каждого прохода DMA нужно не забывать делать переинициализацию DMA: void start_DMA(void)


Если заметите ошибки, пишите. Думаю, что это будет полезно всем.

Еще раз спасибо за помощь!

Сообщение отредактировал IgorKossak - May 26 2011, 14:33
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- *rust*   SAM3U и SPI   May 10 2011, 05:26
- - aaarrr   А данные на передачу не забыли запустить? Чтобы чт...   May 10 2011, 05:33
- - *rust*   ЦитатаА данные на передачу не забыли запустить? Чт...   May 10 2011, 05:46
- - Genadi Zawidowski   В аттачменте - тестовый проект c SPI на DMA (правд...   May 10 2011, 05:48
- - aaarrr   А, так это ж SAM3U. В нем PDC от SPI отломали, при...   May 10 2011, 05:54
- - *rust*   aaarrr, т.е эти функции SPI_WriteBuffer и SPI_Read...   May 10 2011, 06:28
- - aaarrr   Абсолютно бесполезны.   May 10 2011, 06:34
- - *rust*   У ATMELа имеются функции из библиотеки dma.c Как я...   May 10 2011, 07:49
|- - aaarrr   Цитата(*rust* @ May 10 2011, 11:49) aaarr...   May 10 2011, 08:10
- - *rust*   Вот нашел на одной сайте этот код. Попробую сделат...   May 10 2011, 11:09
- - aaarrr   КодAT91C_BASE_PMC->PMC_PCER |= 1 << AT...   May 10 2011, 14:48
|- - DmitryM   Цитата(aaarrr @ May 10 2011, 18:48) КодAT...   May 10 2011, 17:01
- - *rust*   КодКод AT91C_BASE_PMC->PMC_PCER |= 1 <...   May 11 2011, 06:05
|- - DmitryM   Цитата(*rust* @ May 11 2011, 10:05) КодКо...   May 11 2011, 08:58
- - *rust*   ЦитатаВ том что PMC_PCER write only. так команда ...   May 11 2011, 10:26
|- - aaarrr   Цитата(*rust* @ May 11 2011, 14:26) так к...   May 11 2011, 10:28
- - *rust*   Все понятно, Вы правы. Я сначала подумал вообще ...   May 11 2011, 12:12
- - *rust*   После небольшого перерыва опять вернулся к решению...   May 24 2011, 12:15
|- - aaarrr   Цитата(*rust* @ May 24 2011, 16:15) Очень...   May 24 2011, 12:35
- - *rust*   Спасибо за ответ. ЦитатаВ случае Hardware handsha...   May 24 2011, 17:04
|- - aaarrr   Цитата(*rust* @ May 24 2011, 21:04) Как я...   May 24 2011, 19:49
- - *rust*   ЦитатаТак в коде же все правильно - чтения дескрип...   May 25 2011, 05:43
- - aaarrr   Все правильно. Только лучше номера идентификаторов...   May 25 2011, 09:36
- - *rust*   aaarrr, такой вопрос: Можно ли сделать CS(чип-селе...   May 26 2011, 09:44
|- - aaarrr   Цитата(*rust* @ May 26 2011, 13:44) aaarr...   May 26 2011, 10:20
- - *rust*   Спасибо за ответ! ЦитатаНа SAM7 для этого нужн...   May 26 2011, 10:43
|- - aaarrr   Цитата(*rust* @ May 26 2011, 14:43) По по...   May 26 2011, 10:54
- - *rust*   понятно. Спасибо   May 26 2011, 11:44


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

 


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


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