So, after a AT91C_BASE_SPI -> SPI_CR = AT91C_SPI_SWRST;, you need to do a AT91C_BASE_SPI -> SPI_MR = 0x00000001;
Here's code to get the SPI transfer working:
inline void spi_configure() { AT91PS_SPI pSPI = AT91C_BASE_SPI; static unsigned int perphA= ((unsigned int) AT91C_PA11_NPCS0 ) | ((unsigned int) AT91C_PA13_MOSI ) | ((unsigned int) AT91C_PA12_MISO ) | ((unsigned int) AT91C_PA14_SPCK ); // Peripheral A AT91C_BASE_PIOA->PIO_ASR = perphA; //set the SPI pins to the periphial functions AT91C_BASE_PIOA->PIO_PDR = (perphA); //disable GPIO from changing SPI pins. AT91C_BASE_PMC->PMC_PCER = ((unsigned int) 1 << AT91C_ID_SPI); //enable SPI clock AT91C_BASE_SPI -> SPI_CR = AT91C_SPI_SWRST; AT91C_BASE_SPI -> SPI_CR = AT91C_SPI_SPIEN; AT91C_BASE_SPI -> SPI_MR = 0x00000001; //Enable the MASTER modeYou can then see the transfers on the MOSI pin with:
unsigned int spi_test() { AT91PS_SPI pSPI = AT91C_BASE_SPI; unsigned int data=0x55555555; data = data & 0x010FFFFF; // mask non-used bits pSPI -> SPI_TDR = data; return(data); }
The fact that a software reset changes the mode register is a pretty important thing to include in the documentation. It took me a week to figure out what was going on. I looked at the ATMEL SPI example, and it has the bug as well. Perhaps there was change between the Rev B and Rev C processors, such as the FLASH issue.
No comments:
Post a Comment