►Initializing SD/MMC card

A. Setting up the card for SPI Communication

Initializing the card, and setting it up for communication is the very first step. These are the most fundamental steps necessary before the card can be accessed. The CardType will be set as either a ‘0’, which is a MMC card, and cannot be used by the SPI interface, a ‘1’which is an SD card, version 1, or a ‘2’, which is an SD card, version 2

BYTE SD_Init()
{
   WORD CardStatus; // R2 value from status inquiry...
   WORD Count;      // local counter
   
   // Global CardType - b0:MMC, b1:SDv1, b2:SDv2

   /* initial speed is slow... */
   SPI_Init( kHz400 );
   
   /* disable SPI chip select... */
   SPI_DisableCS();

   /* fill send data with all ones - 80 bits long to   */
   /* establish link with SD card this fulfills the    */
   /* 74 clock cycle requirement...  */
   for(Count=0;Count<10;Count++)
      SPI_Byte( 0xFF );

   /* enable the card with the CS pin... */
   SPI_EnableCS();

   /* ************************************************ */
   /* SET SD CARD TO SPI MODE - IDLE STATE...          */
   /* ************************************************ */
   Count = 1000;     // one second...
   CardType = 0;
   
   /* wait for card to enter IDLE state... */
   do 
   {
      Delay(1);
      SD_Command( CMD_GO_IDLE_STATE, 0 );
   } while((SD_GetR1() != IDLE_STATE) && (--Count));  

   /* timeout if we never made it to IDLE state... */
   if( !Count )
      return( SD_TIME_OUT );

   /* ************************************************ */
   /* COMPLETE SD CARD INITIALIZATION                  */
   /* FIGURE OUT WHAT TYPE OF CARD IS INSTALLED...     */
   /* ************************************************ */
   Count = 2000;     // two seconds...
   
   /* Is card SDSC or MMC? */
   SD_Command( CMD_APP_CMD, 0 );
   SD_Command( ACMD_SEND_OP_COND, 0 );
   if( SD_GetR1() <= 1 )
   {
      CardType = 2;
   }
   else
   {
      CardType = 1;
   }
   
   /* wait for initialization to finish... */
   do
   {
      Delay(1);
      if( CardType == 2 )
      {
         SD_Command( CMD_APP_CMD, 0 );
         SD_Command( ACMD_SEND_OP_COND, 0 );
      }
      else
      {
         SD_Command( CMD_SEND_OP_COND, 0 );
      }
   } while(SD_GetR1() && --Count);

   if( !Count )
      return( SD_TIME_OUT );

   /* ************************************************ */
   /* QUERY CARD STATUS...                             */
   /* ************************************************ */
   SD_Command( CMD_SEND_STATUS, 0 );
   CardStatus = SD_GetR2();

   if( CardStatus )
      return( SD_ERROR );

   /* ************************************************ */
   /* SET BLOCK SIZE...                                */
   /* ************************************************ */
   SD_Command( CMD_SET_BLOCKLEN, 512 );
   if( SD_GetR1() )
   {
      CardType = 0;
      return( SD_ERROR );
   }

   /* ************************************************ */
   /* SWITCH TO HIGHEST SPI SPEED...                   */
   /* ************************************************ */
   SPI_Init( MHz10 );

   /* disable the card with the CS pin... */
   SPI_DisableCS();

   /* return OK... */
   return( 0 );
}



Tutorial Index
Interface to Chan’s Library of functions SD Card Initialization
Target development platform Reading and Writing a single sector
Setting up the SPI port during startup.A51 Working with diskio.c
Global type definitions and variables Pulling it all together
Basic SPI function Index Page

Downloads

Comments

Williamjaf
Tue Apr 16 2024, 12:25 pm
best_yyPa
Tue Apr 16 2024, 09:42 am
ErnestoExpop
Tue Apr 16 2024, 02:57 am
Jamesclepe
Mon Apr 15 2024, 11:10 am
Aliciaelora
Mon Apr 15 2024, 07:59 am
btaletvpcu
Mon Apr 15 2024, 04:36 am
UbvpwcTib
Mon Apr 15 2024, 03:13 am
AmyJow
Sun Apr 14 2024, 11:54 pm