MMC_SD_Init();
MMC_SD_Reset(); //sd卡复位
i=MMC_SD_ReadSingleBlock(0,sd_buf);
以上代码放 大循环中
//sd卡初始化
void MMC_SD_Init(void)
{
SPI_init();// 初始化,主要是SPI通讯
pPIO->PIO_SODR= AT91C_PIO_PA15; //片选
}
//sd卡复位
uint8 MMC_SD_Reset(void)
{
uint8 i;
uint8 retry;
uint8 r1=0;
retry = 0;
pPIO->PIO_CODR= AT91C_PIO_PA15; //片选为低
delay1ms(200);// delay 200ms
for (i=0;i<0x0f;i++)
{
MSPI_SendData(0xff); //send 74 clock at least!!!
}
do
{
r1 = MMC_SD_SendCommand(0, 0);//发idle命令
retry++;
if(retry>10) return 1;//超时退出
} while(r1 != 0x01);
retry = 0;
do
{
r1 = MMC_SD_SendCommand(1, 0);//发active命令
retry++;
if(retry>100) return 1;//超时退出
} while(r1);
r1 = MMC_SD_SendCommand(59, 0);//关crc
r1 = MMC_SD_SendCommand(16, 512);//设扇区大小512
return 0;//正常返回
}
//读一个扇区
uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8* buffer)
{
uint8 r1;
uint16 i;
//sector<<9 相当地址加 512, 因为没个扇区的大小是 521 bytes
r1 = MMC_SD_SendCommand(17, sector<<9);//读命令
if(r1 != 0x00)
return r1;
pPIO->PIO_CODR= AT91C_PIO_PA15; //片选为低
//等数据的开始
while(MSPI_SendData(0xff) != 0xfe);//if(retry++ > 50){SPI_CS_Deassert();return 1;}
for(i=0; i<512; i++)//读512个数据
{
*buffer++ = MSPI_SendData(0xff);
}
MSPI_SendData(0xff);//伪crc
MSPI_SendData(0xff);
pPIO->PIO_SODR= AT91C_PIO_PA15; //片选为GAO
return 0;
}
简单吧 呵呵 ARM是 7s256, SD卡准确的说这个例子的是miniSD卡
手机上用的那个,好象又叫TF卡 呵呵
基本都是大差不差