Добрый день!
Кто-нибудь запускал 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 эти регистры присутствуют.
Заранее благодарен за помощь!