Thiago Lima / Mbed 2 deprecated Telemetria_RX_SD_GPS

Dependencies:   mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SDCard_Y.cpp Source File

SDCard_Y.cpp

00001 #include "SDCard_Y.hh"
00002 
00003 
00004 
00005 #define SD_COMMAND_TIMEOUT 5000
00006 
00007 #define R1_IDLE_STATE           (1 << 0)
00008 #define R1_ERASE_RESET          (1 << 1)
00009 #define R1_ILLEGAL_COMMAND      (1 << 2)
00010 #define R1_COM_CRC_ERROR        (1 << 3)
00011 #define R1_ERASE_SEQUENCE_ERROR (1 << 4)
00012 #define R1_ADDRESS_ERROR        (1 << 5)
00013 #define R1_PARAMETER_ERROR      (1 << 6)
00014 
00015 
00016 
00017 
00018 SDCard::SDCard(SPI *t_spi, PinName t_cs) : cs(t_cs)
00019 {
00020   spi = t_spi;
00021   cs = 1;
00022 }
00023 
00024 SDCard::~SDCard()
00025 {
00026   delete spi;
00027 }
00028 
00029 int SDCard::init(void)
00030 {
00031   spi->frequency(100000);
00032   cs = 1;
00033 
00034   for( int i=0 ; i<16 ; i++)
00035     spi->write(0xFF);
00036 
00037   if(cmd(0,0) != R1_IDLE_STATE)
00038     return -1;
00039 
00040   int r = cmd8();
00041 
00042   if(r == R1_IDLE_STATE){
00043     return init_card_v2();      
00044   } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
00045     return init_card_v1();
00046   } else {
00047     return -1;
00048   }
00049   
00050   return 0;
00051 }
00052 
00053 int SDCard::init_card_v1()
00054 {
00055   for (int i = 0; i < SD_COMMAND_TIMEOUT; i++)
00056     {
00057       cmd(55, 0);
00058       if(cmd(41, 0) == 0)
00059     {
00060       cdv = 512;
00061           return 1;
00062         }
00063     }
00064 
00065   return -1;
00066 }
00067 
00068 
00069 int SDCard::init_card_v2()
00070 {
00071   for (int i = 0; i < SD_COMMAND_TIMEOUT; i++)
00072     {
00073       wait_ms(50);
00074       cmd58();
00075       cmd(55, 0);
00076       if (cmd(41, 0x40000000) == 0)
00077     {
00078       cmd58();
00079           cdv = 1;
00080           return 2;
00081         }
00082     }
00083 
00084   return -1;
00085 }
00086 
00087 
00088 int SDCard::cmd(int cmd, int arg)
00089 {
00090   cs = 0;
00091   spi->write(0x40 | cmd);
00092   spi->write(arg >> 24);
00093   spi->write(arg >> 16);
00094   spi->write(arg >> 8);
00095   spi->write(arg >> 0);
00096   spi->write(0x95);
00097 
00098   for( int i=0 ; i<SD_COMMAND_TIMEOUT ; i++)
00099     {
00100       int respuesta = spi->write(0xFF);
00101       if( !(respuesta & 0x80) )
00102     {
00103       cs = 1;
00104       spi->write(0xFF);
00105       return respuesta;
00106     }
00107     }
00108 
00109   cs = 1;
00110   spi->write(0xFF);
00111   return -1;
00112 
00113 }
00114 
00115 
00116 int SDCard::cmd8()
00117 {
00118   cs = 0;
00119 
00120   spi->write(0x40 | 8); // CMD8
00121   spi->write(0x00);     // reserved
00122   spi->write(0x00);     // reserved
00123   spi->write(0x01);     // 3.3v
00124   spi->write(0xAA);     // check pattern
00125   spi->write(0x87);     // crc
00126 
00127   for( int i=0 ; i<SD_COMMAND_TIMEOUT * 1000 ; i++)
00128     {
00129       char respuesta[5];
00130       respuesta[0] = spi->write(0xFF);
00131       
00132       if( !(respuesta[0] & 0x80))
00133     {
00134       for( int j=1; j<5 ; j++)
00135         respuesta[i] = spi->write(0xFF);
00136 
00137       cs = 1;
00138       spi->write(0xFF);
00139       return respuesta[0];
00140     }
00141     }
00142 
00143   cs = 1;
00144   spi->write(0xFF);
00145   return -1;
00146   
00147 }
00148 
00149 
00150 
00151 int SDCard::cmd58()
00152 {
00153   cs = 0;
00154   
00155   int arg = 0;
00156 
00157   spi->write(0x40 | 58);
00158   spi->write(arg >> 24);
00159   spi->write(arg >> 16);
00160   spi->write(arg >> 8);
00161   spi->write(arg >> 0);
00162   spi->write(0x95);
00163 
00164   // wait for the repsonse (response[7] == 0)
00165   for(int i = 0; i < SD_COMMAND_TIMEOUT; i++)
00166     {
00167       int respuesta = spi->write(0xFF);
00168 
00169       if( !(respuesta & 0x80) )
00170     {
00171       int ocr = spi->write(0xFF) << 24;
00172           ocr |= spi->write(0xFF) << 16;
00173           ocr |= spi->write(0xFF) << 8;
00174           ocr |= spi->write(0xFF) << 0;
00175           cs = 1;
00176           spi->write(0xFF);
00177           return respuesta;
00178         }
00179     }
00180     cs = 1;
00181     spi->write(0xFF);
00182     
00183     return -1; // timeout
00184 }
00185 
00186 
00187 
00188 bool SDCard::read(uint8_t *vect, int post)
00189 {
00190   while( cmd(17,post*512) == -1);
00191 
00192   cs = 0;
00193 
00194   while (spi->write(0xFF) != 0xFE);
00195 
00196   for (uint32_t i = 0; i < 512; i++)
00197     *(vect+i) = spi->write(0xFF);
00198 
00199   spi->write(0xFF); // checksum
00200   spi->write(0xFF);
00201 
00202   cs = 1;
00203   spi->write(0xFF);
00204 
00205   while(cmd(12,512) == -1);
00206 
00207   return 1;
00208 }
00209 
00210 
00211 
00212 bool SDCard::write(uint8_t *vect, int post)
00213 {
00214   
00215   while( cmd(24,post*512) == -1 );
00216   
00217   cs = 0;
00218   
00219   spi->write(0xFE);
00220   
00221   for (uint32_t i = 0; i < 512; i++)
00222     spi->write(*(vect+i));
00223 
00224   spi->write(0xFF);
00225   spi->write(0xFF);
00226 
00227   if( (spi->write(0xFF) & 0x1F) != 0x05 )
00228     {
00229       cs = 1;
00230       spi->write(0xFF);
00231       return 0;
00232     }
00233 
00234   while(spi->write(0xFF) == 0);
00235 
00236   cs = 1;
00237   spi->write(0xFF);
00238 
00239   while(cmd(12,512) == -1);
00240 
00241   return 1;
00242     
00243 }
00244