Специально причесал и проверил на SAM7S64, Keil MDK 4.01 (O0 и O3) - замечательно работает, как и следовало ожидать.
CODE
#include <AT91SAM7S64.H>
AT91S_PIO * pPIO = AT91C_BASE_PIOA;
AT91S_PMC * pPMC = AT91C_BASE_PMC;
AT91S_SPI * pSPI = AT91C_BASE_SPI;
int main(void)
{
pPIO->PIO_PDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI
| AT91C_PA12_MISO | AT91C_PA11_NPCS0;
pPIO->PIO_ASR = AT91C_PA14_SPCK | AT91C_PA13_MOSI
| AT91C_PA12_MISO | AT91C_PA11_NPCS0;
pPIO->PIO_PPUER = AT91C_PA12_MISO;
// Enable SPI clock
pPMC->PMC_PCER = 1 << AT91C_ID_SPI;
// Execute a software reset of the SPI twice
pSPI->SPI_CR = AT91C_SPI_SWRST;
pSPI->SPI_CR = AT91C_SPI_SWRST;
// Configure SPI in Master Mode
pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS;
// Configure CS0
pSPI->SPI_CSR[0] = 0x00000482;
// Enable SPI
pSPI->SPI_CR = AT91C_SPI_SPIEN;
while(1)
{
AT91C_BASE_SPI->SPI_TDR = 0x5555;
while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF));
}
}