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.
SDFileSystem.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2012 ARM Limited 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 00020 * SOFTWARE. 00021 */ 00022 00023 /* Introduction 00024 * ------------ 00025 * SD and MMC cards support a number of interfaces, but common to them all 00026 * is one based on SPI. This is the one I'm implmenting because it means 00027 * it is much more portable even though not so performant, and we already 00028 * have the mbed SPI Interface! 00029 * 00030 * The main reference I'm using is Chapter 7, "SPI Mode" of: 00031 * http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf 00032 * 00033 * SPI Startup 00034 * ----------- 00035 * The SD card powers up in SD mode. The SPI interface mode is selected by 00036 * asserting CS low and sending the reset command (CMD0). The card will 00037 * respond with a (R1) response. 00038 * 00039 * CMD8 is optionally sent to determine the voltage range supported, and 00040 * indirectly determine whether it is a version 1.x SD/non-SD card or 00041 * version 2.x. I'll just ignore this for now. 00042 * 00043 * ACMD41 is repeatedly issued to initialise the card, until "in idle" 00044 * (bit 0) of the R1 response goes to '0', indicating it is initialised. 00045 * 00046 * You should also indicate whether the host supports High Capicity cards, 00047 * and check whether the card is high capacity - i'll also ignore this 00048 * 00049 * SPI Protocol 00050 * ------------ 00051 * The SD SPI protocol is based on transactions made up of 8-bit words, with 00052 * the host starting every bus transaction by asserting the CS signal low. The 00053 * card always responds to commands, data blocks and errors. 00054 * 00055 * The protocol supports a CRC, but by default it is off (except for the 00056 * first reset CMD0, where the CRC can just be pre-calculated, and CMD8) 00057 * I'll leave the CRC off I think! 00058 * 00059 * Standard capacity cards have variable data block sizes, whereas High 00060 * Capacity cards fix the size of data block to 512 bytes. I'll therefore 00061 * just always use the Standard Capacity cards with a block size of 512 bytes. 00062 * This is set with CMD16. 00063 * 00064 * You can read and write single blocks (CMD17, CMD25) or multiple blocks 00065 * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When 00066 * the card gets a read command, it responds with a response token, and then 00067 * a data token or an error. 00068 * 00069 * SPI Command Format 00070 * ------------------ 00071 * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC. 00072 * 00073 * +---------------+------------+------------+-----------+----------+--------------+ 00074 * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 | 00075 * +---------------+------------+------------+-----------+----------+--------------+ 00076 * 00077 * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95) 00078 * 00079 * All Application Specific commands shall be preceded with APP_CMD (CMD55). 00080 * 00081 * SPI Response Format 00082 * ------------------- 00083 * The main response format (R1) is a status byte (normally zero). Key flags: 00084 * idle - 1 if the card is in an idle state/initialising 00085 * cmd - 1 if an illegal command code was detected 00086 * 00087 * +-------------------------------------------------+ 00088 * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle | 00089 * +-------------------------------------------------+ 00090 * 00091 * R1b is the same, except it is followed by a busy signal (zeros) until 00092 * the first non-zero byte when it is ready again. 00093 * 00094 * Data Response Token 00095 * ------------------- 00096 * Every data block written to the card is acknowledged by a byte 00097 * response token 00098 * 00099 * +----------------------+ 00100 * | xxx | 0 | status | 1 | 00101 * +----------------------+ 00102 * 010 - OK! 00103 * 101 - CRC Error 00104 * 110 - Write Error 00105 * 00106 * Single Block Read and Write 00107 * --------------------------- 00108 * 00109 * Block transfers have a byte header, followed by the data, followed 00110 * by a 16-bit CRC. In our case, the data will always be 512 bytes. 00111 * 00112 * +------+---------+---------+- - - -+---------+-----------+----------+ 00113 * | 0xFE | data[0] | data[1] | | data[n] | crc[15:8] | crc[7:0] | 00114 * +------+---------+---------+- - - -+---------+-----------+----------+ 00115 */ 00116 #include "SDFileSystem.h" 00117 #include "mbed.h" 00118 #include "mbed_debug.h" 00119 00120 #define SD_COMMAND_TIMEOUT 5000 00121 00122 #define SD_DBG 0 00123 00124 SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) : 00125 FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) { 00126 _cs = 1; 00127 } 00128 00129 #define R1_IDLE_STATE (1 << 0) 00130 #define R1_ERASE_RESET (1 << 1) 00131 #define R1_ILLEGAL_COMMAND (1 << 2) 00132 #define R1_COM_CRC_ERROR (1 << 3) 00133 #define R1_ERASE_SEQUENCE_ERROR (1 << 4) 00134 #define R1_ADDRESS_ERROR (1 << 5) 00135 #define R1_PARAMETER_ERROR (1 << 6) 00136 00137 // Types 00138 #define SDCARD_FAIL 0 //!< v1.x Standard Capacity 00139 #define SDCARD_V1 1 //!< v2.x Standard Capacity 00140 #define SDCARD_V2 2 //!< v2.x High Capacity 00141 #define SDCARD_V2HC 3 //!< Not recognised as an SD Card 00142 00143 int SDFileSystem::initialise_card() 00144 { 00145 int numtries = 3; 00146 int res = 0; 00147 00148 debug("Initializing SD/MMC card ...\r\n"); 00149 while (numtries > 0) 00150 { 00151 // Set to 100kHz for initialisation, and clock card with cs = 1 00152 _spi.frequency(100000); 00153 _cs = 1; 00154 for (int i = 0; i < 16; i++) { 00155 _spi.write(0xFF); 00156 } 00157 00158 // send CMD0, should return with all zeros except IDLE STATE set (bit 0) 00159 res = _cmd(0, 0); // software reset 00160 if (res == R1_IDLE_STATE) break; 00161 00162 00163 // Retry ... wait another 500 ms 00164 debug("Retrying ...\r\n"); 00165 wait(0.5); 00166 } 00167 if (res != R1_IDLE_STATE) 00168 { 00169 debug("No disk, or could not put SD card in to SPI idle state\r\n"); 00170 return SDCARD_FAIL; 00171 } 00172 00173 00174 // send CMD8 to determine whther it is ver 2.x 00175 int r = _cmd8(); 00176 if (r == R1_IDLE_STATE) { 00177 return initialise_card_v2(); 00178 } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { 00179 return initialise_card_v1(); 00180 } else { 00181 debug("Not in idle state after sending CMD8 (not an SD card?)\r\n"); 00182 return SDCARD_FAIL; 00183 } 00184 } 00185 00186 int SDFileSystem::initialise_card_v1() { 00187 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00188 _cmd(55, 0); 00189 if (_cmd(41, 0) == 0) { 00190 cdv = 512; 00191 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); 00192 return SDCARD_V1; 00193 } 00194 } 00195 00196 debug("Timeout waiting for v1.x card\n"); 00197 return SDCARD_FAIL; 00198 } 00199 00200 int SDFileSystem::initialise_card_v2() { 00201 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00202 wait_ms(50); 00203 _cmd58(); 00204 _cmd(55, 0); 00205 if (_cmd(41, 0x40000000) == 0) { 00206 _cmd58(); 00207 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); 00208 cdv = 1; 00209 return SDCARD_V2; 00210 } 00211 } 00212 00213 debug("Timeout waiting for v2.x card\r\n"); 00214 return SDCARD_FAIL; 00215 } 00216 00217 int SDFileSystem::disk_initialize() { 00218 int i = initialise_card(); 00219 debug_if(SD_DBG, "init card = %d\n", i); 00220 _sectors = _sd_sectors(); 00221 00222 // Set block length to 512 (CMD16) 00223 if (_cmd(16, 512) != 0) { 00224 debug("Set 512-byte block timed out\r\n"); 00225 return 1; 00226 } 00227 00228 _spi.frequency(1000000); // Set to 1MHz for data transfer 00229 return 0; 00230 } 00231 00232 int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) { 00233 // set write address for single block (CMD24) 00234 if (_cmd(24, block_number * cdv) != 0) { 00235 return 1; 00236 } 00237 00238 // send the data block 00239 _write(buffer, 512); 00240 return 0; 00241 } 00242 00243 int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) { 00244 // set read address for single block (CMD17) 00245 if (_cmd(17, block_number * cdv) != 0) { 00246 return 1; 00247 } 00248 00249 // receive the data 00250 _read(buffer, 512); 00251 return 0; 00252 } 00253 00254 int SDFileSystem::disk_status() { return 0; } 00255 int SDFileSystem::disk_sync() { return 0; } 00256 uint64_t SDFileSystem::disk_sectors() { return _sectors; } 00257 00258 00259 // PRIVATE FUNCTIONS 00260 int SDFileSystem::_cmd(int cmd, int arg) { 00261 _cs = 0; 00262 00263 // send a command 00264 _spi.write(0x40 | cmd); 00265 _spi.write(arg >> 24); 00266 _spi.write(arg >> 16); 00267 _spi.write(arg >> 8); 00268 _spi.write(arg >> 0); 00269 _spi.write(0x95); 00270 00271 // wait for the repsonse (response[7] == 0) 00272 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00273 int response = _spi.write(0xFF); 00274 if (!(response & 0x80)) { 00275 _cs = 1; 00276 _spi.write(0xFF); 00277 return response; 00278 } 00279 } 00280 _cs = 1; 00281 _spi.write(0xFF); 00282 return -1; // timeout 00283 } 00284 int SDFileSystem::_cmdx(int cmd, int arg) { 00285 _cs = 0; 00286 00287 // send a command 00288 _spi.write(0x40 | cmd); 00289 _spi.write(arg >> 24); 00290 _spi.write(arg >> 16); 00291 _spi.write(arg >> 8); 00292 _spi.write(arg >> 0); 00293 _spi.write(0x95); 00294 00295 // wait for the repsonse (response[7] == 0) 00296 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00297 int response = _spi.write(0xFF); 00298 if (!(response & 0x80)) { 00299 return response; 00300 } 00301 } 00302 _cs = 1; 00303 _spi.write(0xFF); 00304 return -1; // timeout 00305 } 00306 00307 00308 int SDFileSystem::_cmd58() { 00309 _cs = 0; 00310 int arg = 0; 00311 00312 // send a command 00313 _spi.write(0x40 | 58); 00314 _spi.write(arg >> 24); 00315 _spi.write(arg >> 16); 00316 _spi.write(arg >> 8); 00317 _spi.write(arg >> 0); 00318 _spi.write(0x95); 00319 00320 // wait for the repsonse (response[7] == 0) 00321 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00322 int response = _spi.write(0xFF); 00323 if (!(response & 0x80)) { 00324 int ocr = _spi.write(0xFF) << 24; 00325 ocr |= _spi.write(0xFF) << 16; 00326 ocr |= _spi.write(0xFF) << 8; 00327 ocr |= _spi.write(0xFF) << 0; 00328 _cs = 1; 00329 _spi.write(0xFF); 00330 return response; 00331 } 00332 } 00333 _cs = 1; 00334 _spi.write(0xFF); 00335 return -1; // timeout 00336 } 00337 00338 int SDFileSystem::_cmd8() { 00339 _cs = 0; 00340 00341 // send a command 00342 _spi.write(0x40 | 8); // CMD8 00343 _spi.write(0x00); // reserved 00344 _spi.write(0x00); // reserved 00345 _spi.write(0x01); // 3.3v 00346 _spi.write(0xAA); // check pattern 00347 _spi.write(0x87); // crc 00348 00349 // wait for the repsonse (response[7] == 0) 00350 for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { 00351 char response[5]; 00352 response[0] = _spi.write(0xFF); 00353 if (!(response[0] & 0x80)) { 00354 for (int j = 1; j < 5; j++) { 00355 response[i] = _spi.write(0xFF); 00356 } 00357 _cs = 1; 00358 _spi.write(0xFF); 00359 return response[0]; 00360 } 00361 } 00362 _cs = 1; 00363 _spi.write(0xFF); 00364 return -1; // timeout 00365 } 00366 00367 int SDFileSystem::_read(uint8_t *buffer, uint32_t length) { 00368 _cs = 0; 00369 00370 // read until start byte (0xFF) 00371 while (_spi.write(0xFF) != 0xFE); 00372 00373 // read data 00374 for (int i = 0; i < length; i++) { 00375 buffer[i] = _spi.write(0xFF); 00376 } 00377 _spi.write(0xFF); // checksum 00378 _spi.write(0xFF); 00379 00380 _cs = 1; 00381 _spi.write(0xFF); 00382 return 0; 00383 } 00384 00385 int SDFileSystem::_write(const uint8_t*buffer, uint32_t length) { 00386 _cs = 0; 00387 00388 // indicate start of block 00389 _spi.write(0xFE); 00390 00391 // write the data 00392 for (int i = 0; i < length; i++) { 00393 _spi.write(buffer[i]); 00394 } 00395 00396 // write the checksum 00397 _spi.write(0xFF); 00398 _spi.write(0xFF); 00399 00400 // check the response token 00401 if ((_spi.write(0xFF) & 0x1F) != 0x05) { 00402 _cs = 1; 00403 _spi.write(0xFF); 00404 return 1; 00405 } 00406 00407 // wait for write to finish 00408 while (_spi.write(0xFF) == 0); 00409 00410 _cs = 1; 00411 _spi.write(0xFF); 00412 return 0; 00413 } 00414 00415 static uint32_t ext_bits(unsigned char *data, int msb, int lsb) { 00416 uint32_t bits = 0; 00417 uint32_t size = 1 + msb - lsb; 00418 for (int i = 0; i < size; i++) { 00419 uint32_t position = lsb + i; 00420 uint32_t byte = 15 - (position >> 3); 00421 uint32_t bit = position & 0x7; 00422 uint32_t value = (data[byte] >> bit) & 1; 00423 bits |= value << i; 00424 } 00425 return bits; 00426 } 00427 00428 uint64_t SDFileSystem::_sd_sectors() { 00429 uint32_t c_size, c_size_mult, read_bl_len; 00430 uint32_t block_len, mult, blocknr, capacity; 00431 uint32_t hc_c_size; 00432 uint64_t blocks; 00433 00434 // CMD9, Response R2 (R1 byte + 16-byte block read) 00435 if (_cmdx(9, 0) != 0) { 00436 debug("Didn't get a response from the disk\n"); 00437 return 0; 00438 } 00439 00440 uint8_t csd[16]; 00441 if (_read(csd, 16) != 0) { 00442 debug("Couldn't read csd response from disk\n"); 00443 return 0; 00444 } 00445 00446 // csd_structure : csd[127:126] 00447 // c_size : csd[73:62] 00448 // c_size_mult : csd[49:47] 00449 // read_bl_len : csd[83:80] - the *maximum* read block length 00450 00451 int csd_structure = ext_bits(csd, 127, 126); 00452 00453 switch (csd_structure) { 00454 case 0: 00455 cdv = 512; 00456 c_size = ext_bits(csd, 73, 62); 00457 c_size_mult = ext_bits(csd, 49, 47); 00458 read_bl_len = ext_bits(csd, 83, 80); 00459 00460 block_len = 1 << read_bl_len; 00461 mult = 1 << (c_size_mult + 2); 00462 blocknr = (c_size + 1) * mult; 00463 capacity = blocknr * block_len; 00464 blocks = capacity / 512; 00465 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks); 00466 break; 00467 00468 case 1: 00469 cdv = 1; 00470 hc_c_size = ext_bits(csd, 63, 48); 00471 blocks = (hc_c_size+1)*1024; 00472 debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks); 00473 break; 00474 00475 default: 00476 debug("CSD struct unsupported\r\n"); 00477 return 0; 00478 }; 00479 return blocks; 00480 } 00481
Generated on Tue Jul 12 2022 18:55:01 by
1.7.2