We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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; }