⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc.c

📁 使用SPI接口读写SD/MMC代码
💻 C
字号:
/*unsigned char Write_Command_MMC(unsigned char *CMD)
//****************************************************************************
{
   unsigned char tmp;
   unsigned char retry=0;
   unsigned char i;

   //set MMC_Chip_Select to high (MMC/SD-Card disable)
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;
   //send 8 Clock Impulse
   Write_Byte_MMC(0xFF);
   //set MMC_Chip_Select to low (MMC/SD-Card active)
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;

   //send 6 Byte Command to MMC/SD-Card
   for (i=0;i<0x06;i++)
   {
      Write_Byte_MMC(*CMD++);
   }

   //get 16 bit response
   Read_Byte_MMC(); //read the first byte,ignore it.
   do
   {  //Only last 8 bit is used here.Read it out.
      tmp = Read_Byte_MMC();         // R1响应总共48bit ,后8比特为crc7+end bit
      retry++;
   }
   while((tmp==0xff)&&(retry<100));
   return(tmp);
}
//***************************************************************************
void Write_Byte_MMC(unsigned char value)
//****************************************************************************
{
   unsigned char i;

   //Software SPI
   for (i=0; i<8; i++)
   {  //write a byte
      if (((value >> (7-i)) & 0x01)==0x01)
		  AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO)  ;//Send bit by bit(MSB First)
      else
		  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_DO);
      AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls low
      if(Init_Flag) delay_us_8_;
      AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock);   //set Clock Impuls High
      if(Init_Flag) delay_us_8_;
   }//write a byte
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO);	        //set Output High
   //使用如下的库函数来发送数据,但发送前不检测状态是否为 ready
   /*
   AT91F_SPI_PutChar (NowSD_SPI,value,0) ;
   */
}
//******************************* Write_Command_MMC(CMD) *********************
unsigned char MMC_Init(void)   // 在SPI和MCI模式下 有所不同
{
   unsigned char retry,temp;
   unsigned char i;
   //CRC 校验在每个命令都需要,其生成多项式: G(x) = x7 + x3 + 1.
   unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};  // Com0 复位

   MMC_Port_Init();          //Init SPI port

   for(i=0;i<200;i++)        //Wait MMC/SD ready...
   {
       asm("nop") ;         //__asm("nop") ; 嵌入汇编语言
   }

   Init_Flag=1;             //标志为卡片状态 为正在初始化
   // mmc 协议说,要进入SPI模式,在卡接收复位命令的时候,CS应该为低.
   // 但SD卡复位时应该不需要吧
   //************************** 如果必须的话,Place code here**************************//
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;  //***********还是职为低,确保进入SPI模式
   //在初始化的时候要给SD卡至少80个脉冲,(from internet)
   for (i=0;i<0x0f;i++)
   {
      Write_Byte_MMC(0xff); //send 80 clock at least!!!
   }

   //Send Command CMD0 to MMC/SD Card
   retry=0;
   do                                            //retry n times to send CMD0 command
   {
     temp=Write_Command_MMC(CMD);
     retry++;
     if(retry==200)
     { //time out
       return(INIT_CMD0_ERROR);                 //CMD0 Error!
     }
   }
   while(temp!=1);

   //Send Command CMD1 to MMC/SD-Card :Activates the card’s initialization process.
   //启动卡的初始化进程 ,只在SPI模式才支持 ,见 90页
   CMD[0] = 0x41;                     //Command 1
   CMD[5] = 0xFF;
   retry=0;
   do
   { //retry 100 times to send CMD1 command
     temp=Write_Command_MMC(CMD);    //写成功返回 1
     retry++;
     if(retry==100)
     { //time out
       return(INIT_CMD1_ERROR);      //CMD1 Error!
     }
   }
   while(temp!=0);                   //直到写成功

   Init_Flag=0;                      //Init is completed,clear the flag

                                     //进入SPi模式后,解除。可以不用
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;  //******set MMC_Chip_Select to high
   return(0);                        //All commands have been taken.
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -