Столкнулся с такой ситуацией, что SPI работает в неск. раз медленнее, чем по расчетам.
MCK 48МГц. Делитель 3,
500*10000 операций spiSendByte(0xFF) должны выполниться за 2.5 секунды, а получается около 10 секунд.
Инициализация такая:
s_pPMC->PMC_PCER = 1<<AT91C_ID_SPI; //enable the clock of SPI
/**** Fixed mode ****/
s_pSpi->SPI_CR= 0x81;//SPI Enable, Sowtware reset
s_pSpi->SPI_CR= 0x01;//SPI Enable
s_pSpi->SPI_MR=0x0E0011;//Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
s_pSpi->SPI_CSR[0] = 0x0302|0x04; //8bit, CPOL=0, ClockPhase=1, SCLK = 48/3=16MHz
0x04 - это я пробовал сделать так, чтобы CS не выключался, в скорости разницы нет
Вряд ли идут какие-то дополнительные клоки, т.к. MMC карточка работает с этими настройками.
Осциллографа у меня нет, так что могу только догадываться, что клоки действительно работают на задаваемых частотах (попытка увеличить частоту ведет к тому, что обмен с MMC уже не идет - а у нее макс. частота в SPI - 20МГц) и задержка происходит между передачей отдельных байтов. Сам контроллер не может так тормозить на частоте 48МГц
Процедура тоже обычная
unsigned char spiSendByte(const unsigned char data)
{
unsigned int spib;
while((s_pSpi->SPI_SR & AT91C_SPI_TDRE) == 0);
s_pSpi->SPI_TDR = (data & 0xFFFF);
while((s_pSpi->SPI_SR & AT91C_SPI_RDRF) == 0);
spib = ((s_pSpi->SPI_RDR) & 0xFFFF);
return spib;
}