Can anyone tell me why even setting SPIEN in MR, SPIENS bit is not set in STATUS register. I have enabled local loopback for testing in master mode only. I have used the at91lib library from atmel. the code is as shown:- here is the code in which i have enabled local loopback mode. I just want to test if data arrives in RDR or not.
void SPI_Enable(AT91S_SPI *spi) { spi->SPI_CR = AT91C_SPI_SPIEN; } void SPI_Configure(AT91S_SPI *spi, unsigned int id, unsigned int configuration) { AT91C_BASE_PMC->PMC_PCER = 1 << id; spi->SPI_CR = AT91C_SPI_SPIDIS; spi->SPI_CR = AT91C_SPI_SWRST; spi->SPI_MR = configuration; } void SPI_ConfigureNPCS(AT91S_SPI *spi, unsigned int npcs) { spi->SPI_CSR[npcs] = 0x2201AA0A; } void SPI_Write(AT91S_SPI *spi, unsigned short data) { while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0); spi->SPI_TDR = data | 0xE << 16; while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0); } unsigned short SPI_Read(AT91S_SPI *spi) { while ((spi->SPI_SR & AT91C_SPI_RDRF) == 0); return spi->SPI_RDR & 0xFFFF; } int main() { unsigned short RxData; volatile AT91PS_PIO pIOA = AT91C_BASE_PIOA; volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; volatile AT91PS_SPI pSPI = AT91C_BASE_SPI; //PMC pPMC->PMC_MOR = 0x00000001; pPMC->PMC_MCKR = 0x00000001; pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; //0X00007800;AT91C_PIO_PA11 | AT91C_PIO_PA12 | AT91C_PIO_PA13 | AT91C_PIO_PA14; pPMC->PMC_PCER = 1 << AT91C_ID_SPI; pIOA->PIO_PDR = 0X00007800;//AT91C_PIO_PA11 | AT91C_PIO_PA12 | AT91C_PIO_PA13 | AT91C_PIO_PA14; pIOA->PIO_OER = 0X00006800;//AT91C_PIO_PA11 | AT91C_PIO_PA13 | AT91C_PIO_PA14; pIOA->PIO_ODR = 0X00001000;//AT91C_PIO_PA12; pIOA->PIO_ASR = 0X00007800;//AT91C_PIO_PA11 | AT91C_PIO_PA12 | AT91C_PIO_PA13 | AT91C_PIO_PA14; pIOA->PIO_BSR = 0; pIOA->PIO_PPUER = AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK; SPI_Configure(pSPI,5,129); SPI_ConfigureNPCS(pSPI,0); SPI_Enable(pSPI); SPI_Write(pSPI,2); RxData=SPI_Read(pSPI); return 1; }
The microcontroller being used is AT91SAM7SE512.