ARM 上直接操作SD卡,无文件系统地。。。

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卡 呵呵

基本都是大差不差

你可能感兴趣的:(c,buffer,手机,通讯,delay)