Цитата(Artkop @ Aug 21 2009, 09:44)

Ну и компилятор не должен ее оптимизировать.
Это и причина низкой скорости.
pSPI->SPI_IDR = AT91C_SPI_RDRF - в этом случае volatile у адреса не нужен, так как сами регистры периферии имеют такой атрибут:
typedef volatile unsigned int AT91_REG;
Вы же не переставляете в прерывани значение переменной pSPI - а именно у неё Вами добавлено volatile!
Сообщение отредактировал Genadi Zawidowski - Aug 21 2009, 06:26