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]