Столкнулся с такой ситуацией, что 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; }
|