Embedded system Fun Blog
























































Find out all the best information, libraries and circuit about the latest Embedded systems.

Saturday 7 January 2012

SD CARD: SD Code for AT91SAM7S64 using SPI

.from: http://read.pudn.com/downloads102/sourcecode/embed/416830/FAT%E6%88%90%E5%8A%9F/sd.c__.htm

  1. /************************************************************/   
  2. /*       SD Code for   AT91SAM7S64                      */   
  3. /*              By   pasyong                                */   
  4. /*                  2006-5                                  */   
  5. /*              Base IAR 4.30A                      */   
  6. /************************************************************/   
  7. /*-----------------------------------------------------------------------  
  8. Ó²¼þÁ¬½Ó      SD_CS-----------PA25  
  9. -----------------------------------------------------------------------*/   
  10. #include "ioat91sam7s64.h"   
  11. #include "uart.h"   
  12. #include "vs1011.h"   
  13. #define uchar unsigned char   
  14. #define uint unsigned int   
  15. #define SD_CS     ((unsigned int) 1 <<25)   
  16.    
  17.  extern uchar BUFFER[512];   
  18. uchar reading;   
  19. //Ò»¸öÉÈÇø»º³åÇø   
  20. void delay_Nus(unsigned int n)   
  21.     {   
  22.     unsigned char  b;   
  23.         for (b = 1; b<n; b++)   
  24.             ;   
  25.     }   
  26.    
  27. /*-----------------------------------------------------------------------  
  28. PORT_INITº¯Êý  
  29. -----------------------------------------------------------------------*/   
  30. void SD_port_init(void)   
  31. {   
  32. SPI_init();   
  33. *AT91C_PIOA_PER|=SD_CS;   
  34.    //×÷ΪI/OʹÓà  
  35. *AT91C_PIOA_OER|=SD_CS;   
  36.   //Êä³ö   
  37. *AT91C_PIOA_SODR|=SD_CS;   
  38.   //Êä³ö¸ßµçƽ   
  39. }   
  40.    
  41. //****************************************************************************   
  42. //Send a Command to SD-Card   
  43. //Return: the second byte of response register of SD-Card   
  44. //****************************************************************************   
  45. uchar SD_Write_Command(uchar cmd,unsigned long arg)   
  46. {   
  47.    uchar tmp;   
  48.    uchar retry=0;   
  49.    
  50.    //MMC_PORT|=MMC_CS_PIN;       //SD¿¨¹Ø±Õ   
  51.    //send 8 Clock Impulse   
  52.    Write_Byte_SPI(0xFF);   
  53.    
  54.    //set MMC_Chip_Select to low (MMC/SD-Card active)   
  55.   *AT91C_PIOA_CODR|=SD_CS;      //SD¿¨Ê¹ÄÜ   
  56.    
  57.    Write_Byte_SPI(cmd|0x40);   //ËÍÍ·ÃüÁî   
  58.    Write_Byte_SPI(arg>>24);   
  59.    Write_Byte_SPI(arg>>16);     //send 6 Byte Command to MMC/SD-Card   
  60.    Write_Byte_SPI(arg>>8);   
  61.    Write_Byte_SPI(arg&0xff);   
  62.    Write_Byte_SPI(0x95);       //½ö½ö¶ÔRESETÓÐЧµÄCRCЧÑéÂë   
  63.    
  64.    //get 8 bit response   
  65.    //Read_Byte_MMC(); //read the first byte,ignore it.   
  66.    do   
  67.    {  //Only last 8 bit is used here.Read it out.   
  68.       tmp = Read_Byte_SPI();   
  69.       retry++;   
  70.    }   
  71.    while((tmp==0xff)&&(retry<100));  //µ±Ã»ÓÐÊÕµ½ÓÐЧµÄÃüÁîµÄʱºò   
  72.    
  73.    if(reading==0)   
  74.    *AT91C_PIOA_SODR|=SD_CS;           //MMC_CS_PIN=1;   
  75.    else *AT91C_PIOA_CODR|=SD_CS;       //MMC_CS_PIN=0;   
  76.    return(tmp);   
  77. }   
  78. //****************************************************************************   
  79. //SD¿¨³õʼ»¯(SPI-MODE)   
  80. //****************************************************************************   
  81. uchar SD_Init(void)   
  82. {   
  83.    uchar retry,temp;   
  84.    uchar i;   
  85.    *AT91C_PIOA_CODR|=SD_CS;       //SD¿¨Ê¹ÄÜ   
  86.    
  87.   delay_Nus(250);  //Wait MMC/SD ready...   
  88.    for (i=0;i<16;i++)   
  89.    {   
  90.       Write_Byte_SPI(0xff); //send 74 clock at least!!!   
  91.    }   
  92.    //Send Command CMD0 to MMC/SD Card   
  93.    retry=0;   
  94.    
  95.    do   
  96.    { //retry 200 times to send CMD0 command   
  97.      temp=SD_Write_Command(0,0);   
  98.      retry++;   
  99.      if(retry==100)   
  100.      {   
  101.       ;//CMD0 Error!   
  102.      }   
  103.    }   
  104.    while(temp!=1);   
  105.    
  106.    //Send Command CMD1 to MMC/SD-Card   
  107.    retry=0;   
  108.    do   
  109.    { //retry 100 times to send CMD1 command   
  110.      temp=SD_Write_Command(1,0);   
  111.      retry++;   
  112.      if(retry==100)   
  113.      {   
  114.      ;   
  115.      }   
  116.    }   
  117.    while(temp!=0);   
  118.    retry=0;   
  119.     SD_Write_Command(16,512);     //ÉèÖÃÒ»´Î¶ÁдBLOCKµÄ³¤¶ÈΪ512¸ö×Ö½Ú   
  120.    
  121.    *AT91C_PIOA_SODR|=SD_CS;    //MMC_CS_PIN=1;  //set MMC_Chip_Select to high   
  122.    return(0); //All commands have been taken.   
  123. }   
  124. //****************************************************************************   
  125. //´ÓSD¿¨¶ÁÒ»¸öÉÈÇø  Return 0 if no Error.   
  126. //****************************************************************************   
  127. uchar SD_Read_Block(unsigned long address)   
  128. {   
  129.    uchar temp=0;uint i=0;   
  130.    reading=1;   
  131.    temp=SD_Write_Command(17,address);     //¶Á³öRESPONSE   
  132.    while (Read_Byte_SPI()!= 0xfe)   
  133.    {;}  //Ö±µ½¶ÁÈ¡µ½ÁËÊý¾ÝµÄ¿ªÊ¼Í·0XFE£¬²ÅÄüÌÐø   
  134.    for(i=0; i<512; i++)   
  135.     {   
  136.     BUFFER[i]=Read_Byte_SPI();   
  137.     }   
  138.    Read_Byte_SPI();//CRC - Byte   
  139.    Read_Byte_SPI();//CRC - Byte   
  140.    reading=0;   
  141.    *AT91C_PIOA_SODR|=SD_CS;         //¹Ø±ÕSD¿¨   
  142.    return(temp);   
  143. }  



No comments:

Post a Comment