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.
Fork of SDFileSystem by
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_debug.h" 00118 00119 #define SD_COMMAND_TIMEOUT 5000 00120 00121 #define SD_DBG 0 00122 00123 SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) : 00124 FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) { 00125 _cs = 1; 00126 } 00127 00128 #define R1_IDLE_STATE (1 << 0) 00129 #define R1_ERASE_RESET (1 << 1) 00130 #define R1_ILLEGAL_COMMAND (1 << 2) 00131 #define R1_COM_CRC_ERROR (1 << 3) 00132 #define R1_ERASE_SEQUENCE_ERROR (1 << 4) 00133 #define R1_ADDRESS_ERROR (1 << 5) 00134 #define R1_PARAMETER_ERROR (1 << 6) 00135 00136 // Types 00137 #define SDCARD_FAIL 0 //!< v1.x Standard Capacity 00138 #define SDCARD_V1 1 //!< v2.x Standard Capacity 00139 #define SDCARD_V2 2 //!< v2.x High Capacity 00140 #define SDCARD_V2HC 3 //!< Not recognised as an SD Card 00141 00142 int SDFileSystem::initialise_card() { 00143 // Set to 100kHz for initialisation, and clock card with cs = 1 00144 _spi.frequency(100000); 00145 _cs = 1; 00146 for (int i = 0; i < 16; i++) { 00147 _spi.write(0xFF); 00148 } 00149 00150 // send CMD0, should return with all zeros except IDLE STATE set (bit 0) 00151 if (_cmd(0, 0) != R1_IDLE_STATE) { 00152 debug("No disk, or could not put SD card in to SPI idle state\n"); 00153 return SDCARD_FAIL; 00154 } 00155 00156 // send CMD8 to determine whther it is ver 2.x 00157 int r = _cmd8(); 00158 if (r == R1_IDLE_STATE) { 00159 return initialise_card_v2(); 00160 } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { 00161 return initialise_card_v1(); 00162 } else { 00163 debug("Not in idle state after sending CMD8 (not an SD card?)\n"); 00164 return SDCARD_FAIL; 00165 } 00166 } 00167 00168 int SDFileSystem::initialise_card_v1() { 00169 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00170 _cmd(55, 0); 00171 if (_cmd(41, 0) == 0) { 00172 cdv = 512; 00173 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); 00174 return SDCARD_V1; 00175 } 00176 } 00177 00178 debug("Timeout waiting for v1.x card\n"); 00179 return SDCARD_FAIL; 00180 } 00181 00182 int SDFileSystem::initialise_card_v2() { 00183 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00184 wait_ms(50); 00185 _cmd58(); 00186 _cmd(55, 0); 00187 if (_cmd(41, 0x40000000) == 0) { 00188 _cmd58(); 00189 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); 00190 cdv = 1; 00191 return SDCARD_V2; 00192 } 00193 } 00194 00195 debug("Timeout waiting for v2.x card\n"); 00196 return SDCARD_FAIL; 00197 } 00198 00199 int SDFileSystem::disk_initialize() { 00200 int i = initialise_card(); 00201 debug_if(SD_DBG, "init card = %d\n", i); 00202 if (i == SDCARD_FAIL) return 1; 00203 00204 _sectors = _sd_sectors(); 00205 00206 // Set block length to 512 (CMD16) 00207 if (_cmd(16, 512) != 0) { 00208 debug("Set 512-byte block timed out\n"); 00209 return 1; 00210 } 00211 00212 _spi.frequency(1000000); // Set to 1MHz for data transfer 00213 return 0; 00214 } 00215 00216 int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) { 00217 // set write address for single block (CMD24) 00218 if (_cmd(24, block_number * cdv) != 0) { 00219 return 1; 00220 } 00221 00222 // send the data block 00223 _write(buffer, 512); 00224 return 0; 00225 } 00226 00227 int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) { 00228 // set read address for single block (CMD17) 00229 if (_cmd(17, block_number * cdv) != 0) { 00230 return 1; 00231 } 00232 00233 // receive the data 00234 _read(buffer, 512); 00235 return 0; 00236 } 00237 00238 int SDFileSystem::disk_status() { return 0; } 00239 int SDFileSystem::disk_sync() { return 0; } 00240 uint64_t SDFileSystem::disk_sectors() { return _sectors; } 00241 00242 00243 // PRIVATE FUNCTIONS 00244 int SDFileSystem::_cmd(int cmd, int arg) { 00245 _cs = 0; 00246 00247 // send a command 00248 _spi.write(0x40 | cmd); 00249 _spi.write(arg >> 24); 00250 _spi.write(arg >> 16); 00251 _spi.write(arg >> 8); 00252 _spi.write(arg >> 0); 00253 _spi.write(0x95); 00254 00255 // wait for the repsonse (response[7] == 0) 00256 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00257 int response = _spi.write(0xFF); 00258 if (!(response & 0x80)) { 00259 _cs = 1; 00260 _spi.write(0xFF); 00261 return response; 00262 } 00263 } 00264 _cs = 1; 00265 _spi.write(0xFF); 00266 return -1; // timeout 00267 } 00268 int SDFileSystem::_cmdx(int cmd, int arg) { 00269 _cs = 0; 00270 00271 // send a command 00272 _spi.write(0x40 | cmd); 00273 _spi.write(arg >> 24); 00274 _spi.write(arg >> 16); 00275 _spi.write(arg >> 8); 00276 _spi.write(arg >> 0); 00277 _spi.write(0x95); 00278 00279 // wait for the repsonse (response[7] == 0) 00280 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00281 int response = _spi.write(0xFF); 00282 if (!(response & 0x80)) { 00283 return response; 00284 } 00285 } 00286 _cs = 1; 00287 _spi.write(0xFF); 00288 return -1; // timeout 00289 } 00290 00291 00292 int SDFileSystem::_cmd58() { 00293 _cs = 0; 00294 int arg = 0; 00295 00296 // send a command 00297 _spi.write(0x40 | 58); 00298 _spi.write(arg >> 24); 00299 _spi.write(arg >> 16); 00300 _spi.write(arg >> 8); 00301 _spi.write(arg >> 0); 00302 _spi.write(0x95); 00303 00304 // wait for the repsonse (response[7] == 0) 00305 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00306 int response = _spi.write(0xFF); 00307 if (!(response & 0x80)) { 00308 int ocr = _spi.write(0xFF) << 24; 00309 ocr |= _spi.write(0xFF) << 16; 00310 ocr |= _spi.write(0xFF) << 8; 00311 ocr |= _spi.write(0xFF) << 0; 00312 _cs = 1; 00313 _spi.write(0xFF); 00314 return response; 00315 } 00316 } 00317 _cs = 1; 00318 _spi.write(0xFF); 00319 return -1; // timeout 00320 } 00321 00322 int SDFileSystem::_cmd8() { 00323 _cs = 0; 00324 00325 // send a command 00326 _spi.write(0x40 | 8); // CMD8 00327 _spi.write(0x00); // reserved 00328 _spi.write(0x00); // reserved 00329 _spi.write(0x01); // 3.3v 00330 _spi.write(0xAA); // check pattern 00331 _spi.write(0x87); // crc 00332 00333 // wait for the repsonse (response[7] == 0) 00334 for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { 00335 char response[5]; 00336 response[0] = _spi.write(0xFF); 00337 if (!(response[0] & 0x80)) { 00338 for (int j = 1; j < 5; j++) { 00339 response[i] = _spi.write(0xFF); 00340 } 00341 _cs = 1; 00342 _spi.write(0xFF); 00343 return response[0]; 00344 } 00345 } 00346 _cs = 1; 00347 _spi.write(0xFF); 00348 return -1; // timeout 00349 } 00350 00351 int SDFileSystem::_read(uint8_t *buffer, uint32_t length) { 00352 _cs = 0; 00353 00354 // read until start byte (0xFF) 00355 int timeout = SD_COMMAND_TIMEOUT; 00356 while (_spi.write(0xFF) != 0xFE && --timeout); 00357 if (timeout == 0) { 00358 _cs = 1; 00359 _spi.write(0xFF); 00360 return 1; 00361 } 00362 00363 // read data 00364 for (int i = 0; i < length; i++) { 00365 buffer[i] = _spi.write(0xFF); 00366 } 00367 _spi.write(0xFF); // checksum 00368 _spi.write(0xFF); 00369 00370 _cs = 1; 00371 _spi.write(0xFF); 00372 return 0; 00373 } 00374 00375 int SDFileSystem::_write(const uint8_t*buffer, uint32_t length) { 00376 _cs = 0; 00377 00378 // indicate start of block 00379 _spi.write(0xFE); 00380 00381 // write the data 00382 for (int i = 0; i < length; i++) { 00383 _spi.write(buffer[i]); 00384 } 00385 00386 // write the checksum 00387 _spi.write(0xFF); 00388 _spi.write(0xFF); 00389 00390 // check the response token 00391 if ((_spi.write(0xFF) & 0x1F) != 0x05) { 00392 _cs = 1; 00393 _spi.write(0xFF); 00394 return 1; 00395 } 00396 00397 // wait for write to finish 00398 int timeout = SD_COMMAND_TIMEOUT; 00399 while (_spi.write(0xFF) == 0 && --timeout); 00400 if (timeout == 0) { 00401 _cs = 1; 00402 _spi.write(0xFF); 00403 return 1; 00404 } 00405 00406 _cs = 1; 00407 _spi.write(0xFF); 00408 return 0; 00409 } 00410 00411 static uint32_t ext_bits(unsigned char *data, int msb, int lsb) { 00412 uint32_t bits = 0; 00413 uint32_t size = 1 + msb - lsb; 00414 for (int i = 0; i < size; i++) { 00415 uint32_t position = lsb + i; 00416 uint32_t byte = 15 - (position >> 3); 00417 uint32_t bit = position & 0x7; 00418 uint32_t value = (data[byte] >> bit) & 1; 00419 bits |= value << i; 00420 } 00421 return bits; 00422 } 00423 00424 uint64_t SDFileSystem::_sd_sectors() { 00425 uint32_t c_size, c_size_mult, read_bl_len; 00426 uint32_t block_len, mult, blocknr, capacity; 00427 uint32_t hc_c_size; 00428 uint64_t blocks; 00429 00430 // CMD9, Response R2 (R1 byte + 16-byte block read) 00431 if (_cmdx(9, 0) != 0) { 00432 debug("Didn't get a response from the disk\n"); 00433 return 0; 00434 } 00435 00436 uint8_t csd[16]; 00437 if (_read(csd, 16) != 0) { 00438 debug("Couldn't read csd response from disk\n"); 00439 return 0; 00440 } 00441 00442 // csd_structure : csd[127:126] 00443 // c_size : csd[73:62] 00444 // c_size_mult : csd[49:47] 00445 // read_bl_len : csd[83:80] - the *maximum* read block length 00446 00447 int csd_structure = ext_bits(csd, 127, 126); 00448 00449 switch (csd_structure) { 00450 case 0: 00451 cdv = 512; 00452 c_size = ext_bits(csd, 73, 62); 00453 c_size_mult = ext_bits(csd, 49, 47); 00454 read_bl_len = ext_bits(csd, 83, 80); 00455 00456 block_len = 1 << read_bl_len; 00457 mult = 1 << (c_size_mult + 2); 00458 blocknr = (c_size + 1) * mult; 00459 capacity = blocknr * block_len; 00460 blocks = capacity / 512; 00461 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks); 00462 break; 00463 00464 case 1: 00465 cdv = 1; 00466 hc_c_size = ext_bits(csd, 63, 48); 00467 blocks = (hc_c_size+1)*1024; 00468 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); 00469 break; 00470 00471 default: 00472 debug("CSD struct unsupported\r\n"); 00473 return 0; 00474 }; 00475 return blocks; 00476 }
Generated on Thu Jul 14 2022 01:38:32 by
1.7.2
