Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2
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
Generated on Tue Jul 26 2022 21:34:42 by
1.7.2