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