void initSPI (void)
{
//направляем ноги SPI
pPIO->PIO_ASR = AT91C_PA14_SPCK | AT91C_PA12_MISO | AT91C_PA13_MOSI |AT91C_PA11_NPCS0;
pPIO->PIO_PDR = AT91C_PA14_SPCK | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA11_NPCS0;
// запускаем SPI генератор
pPMC->PMC_PCER = 1<<AT91C_ID_SPI;
//Отключение с перегрузкой SPI
pSPI->SPI_CR = AT91C_SPI_SPIDIS | AT91C_SPI_SWRST;
//Режим мастера
pSPI->SPI_MR = AT91C_SPI_MSTR;
//8bit, CPOL=0, ClockPhase=1, SCLK = 76kHz ;
pSPI->SPI_CSR[0] = /*AT91C_SPI_NCPHA + */0xff<<8;
//отключение прерываний
pSPI->SPI_IDR = 0xffffffff;
//включение SPI Enable
pSPI->SPI_CR = AT91C_SPI_SPIEN;
}
char initMMC (void)
{
int i;
initSPI();
set_CS(); // CS - отдельная нога чипселекта РА8. Родной SPIевский дёргается вхолостую.
wait();
for(i=0;i<=9;i++) spiSendByte(0xff);
clr_CS();
spiSendByte(0x40);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0x95);
if(mmcGetResponse()!=0x01) {set_CS(); return 1;}// !!!!! вываливается уже из этого места
set_CS();
spiSendByte(0xFF);
clr_CS();
i = 0xff;
do
{
spiSendByte(0x41);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0x00);
spiSendByte(0xFF);
i--;
}
while( (mmcGetResponse()!=0x00) || ( i > 0 ));
if(!i) {set_CS();return 1;}
set_CS();
spiSendByte(0xFF);
return 0;
}
int main (void)
{
int i=0;
unsigned char j=0;
pPIO->PIO_PER=0xFFFFFFFF;//PIO enale
pPIO->PIO_OER=0x0000010F;
pPIO->PIO_ODR=0xFFFFFEF0;
pPIO->PIO_IFDR=0xFFFFFFFF;
pPIO->PIO_SODR=0x0000010F;
pPIO->PIO_CODR=0xFFFFFEF0;
pPIO->PIO_IDR=0xFFFFFFFF;
pPIO->PIO_MDDR=0xFFFFFFFF;
pPIO->PIO_PPUDR=0xFFFFEFFF;// pull-up for MISO
pPIO->PIO_ASR=0xFFFFFFFF;
pPIO->PIO_OWER=0x0000010F;
pPIO->PIO_OWDR=0xFFFFFEF0;
if( initMMC() == 1 )
pPIO->PIO_SODR=2;
else
pPIO->PIO_CODR=2;
while(1) {}
}
На осциллографе вижу все сигналы, но от ММС ответа нет...
