Всем привет!
Написал работающий код (без использования DMA) для передачи блока данных из SDRAM в SPI - все работает исправно.
Решил использовать DMA - возникли проблемы. Использую следующий код (в котором вызываются функции из spi.c):
/******************* Инициализация модуля SPI *************************/
void InitSPI1 (void)
{
// Конфигурирование MISO, MOSI, SPCK, NPCS0
AT91C_BASE_PIOB->PIO_ASR =\
AT91C_BASE_PIOB->PIO_PDR =\
AT91C_BASE_PIOB->PIO_MDDR = 0x0000000F;
SPI_Configure(AT91C_BASE_SPI1, AT91C_ID_SPI1, AT91C_SPI_MSTR | AT91C_SPI_PS | AT91C_SPI_MODFDIS | (0x19UL << 24));
SPI_ConfigureNPCS(AT91C_BASE_SPI1, 0, (1 << 24)|(1 << 16)|(6UL << 8)|AT91C_SPI_BITS_16|AT91C_SPI_CSAAT|AT91C_SPI_NCPHA);
SPI_Enable(AT91C_BASE_SPI1);
}
unsigned int INIT1[] = {0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF, 0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF};
/******************* Передача данных в SPI *****************************/
void SendData (void)
{
SPI_WriteBuffer(AT91C_BASE_SPI1, (void *)INIT1, 8);
mswait(10); // Задержка 10 мс
while(!SPI_IsFinished(AT91C_BASE_SPI1)); // Проверка окончания передачи данных
}
При вызове SendData () в регистр SPI1_TPR записывается адрес INIT1 (адрес SDRAM), в SPI1_TCR - длина блока. Проверил - все правильно. Но передается всего 4 байта вместо 48. Адрес увеличивается на 4 (SPI1_TPR), а SPI1_TCR уменьшается на единицу. И полный затык.
Ищу в гугле и на сайте атмела более подробную информацию, описывающую работу с SPI_DMA, но что-то ни наглядных примеров, ни каких-либо четких рекомендаций пока не нашел. Буду благодарен за любую информацию.