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