Всем привет! Написал работающий код (без использования 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, но что-то ни наглядных примеров, ни каких-либо четких рекомендаций пока не нашел. Буду благодарен за любую информацию.
|