После небольшого перерыва опять вернулся к решению проблемы с DMA и SPI
Оставил передачу SPI работать по прерываниям, настроил прием в буфер через DMA.
Предварительно не один из каналов DMA не работает.
CODE
//----
#define buffer_size 10
unsigned char DMA_BUFFER_1[buffer_size], *prt_DMA;
//----
настройка DMA на прием:
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_HDMA; //тактирование DMA
AT91C_BASE_HDMA->HDMA_EN = AT91C_HDMA_ENABLE; //Вкл DMA
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);
//Конф рег HDMA_CTRLA_0:номерканала,размер перемещаемых данных, формат данных ист(байт),
//формат данных прием(байт),done(почему-то стоит 1)
AT91C_BASE_HDMA_CH_0->HDMA_CTRLB = (AT91C_HDMA_SRC_DSCR_FETCH_DISABLE | //Конф рег HDMA_CTRLB_0
AT91C_HDMA_DST_DSCR_FETCH_DISABLE | //хз, в даташите для этого случая нужно откл
AT91C_HDMA_SRC_ADDRESS_MODE_FIXED | //режим фиксированного адреса для истрочника, т.к это регистр SPI
AT91C_HDMA_DST_ADDRESS_MODE_INCR | //режим инкремента для памяти
AT91C_HDMA_FC_PER2MEM); //направление периферия->память
AT91C_BASE_HDMA_CH_0->HDMA_CFG = (AT91C_HDMA_SRC_PER_2 | AT91C_HDMA_SRC_H2SEL_HW); //Hardware handshaking interface
//-----
ConfigureSPI();
//-----
//-----
Start_spi();
//-----
Start_DMA_RX()
{
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_EnableChannel(0);
}
В общем-то сие работает после каждого заполнения буфера перед след. итерацией нужно опять взводить DMA: Start_DMA_RX()
Очень интересует вопрос, что такое Hardware handshaking interface и Software handshaking interface и для чего они нужны?
Многократно прочитав DMA в даташите так и не смог добиться полного понимания.
Сообщение отредактировал IgorKossak - May 26 2011, 14:32
Причина редактирования: [codebox]