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 /* 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, PinName cd, const char* name) : 00123 FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs), _cd(cd) { 00124 _cs = 1; 00125 } 00126 00127 #define R1_IDLE_STATE (1 << 0) 00128 #define R1_ERASE_RESET (1 << 1) 00129 #define R1_ILLEGAL_COMMAND (1 << 2) 00130 #define R1_COM_CRC_ERROR (1 << 3) 00131 #define R1_ERASE_SEQUENCE_ERROR (1 << 4) 00132 #define R1_ADDRESS_ERROR (1 << 5) 00133 #define R1_PARAMETER_ERROR (1 << 6) 00134 00135 // Types 00136 // - v1.x Standard Capacity 00137 // - v2.x Standard Capacity 00138 // - v2.x High Capacity 00139 // - Not recognised as an SD Card 00140 #define SDCARD_FAIL 0 00141 #define SDCARD_V1 1 00142 #define SDCARD_V2 2 00143 #define SDCARD_V2HC 3 00144 00145 int SDFileSystem::initialise_card() { 00146 // Set to 100kHz for initialisation, and clock card with cs = 1 00147 _spi.frequency(100000); 00148 _cs = 1; 00149 for (int i = 0; i < 16; i++) { 00150 _spi.write(0xFF); 00151 } 00152 00153 // send CMD0, should return with all zeros except IDLE STATE set (bit 0) 00154 if (_cmd(0, 0) != R1_IDLE_STATE) { 00155 debug("No disk, or could not put SD card in to SPI idle state\n"); 00156 return SDCARD_FAIL; 00157 } 00158 00159 // send CMD8 to determine whther it is ver 2.x 00160 int r = _cmd8(); 00161 if (r == R1_IDLE_STATE) { 00162 return initialise_card_v2(); 00163 } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { 00164 return initialise_card_v1(); 00165 } else { 00166 debug("Not in idle state after sending CMD8 (not an SD card?)\n"); 00167 return SDCARD_FAIL; 00168 } 00169 } 00170 00171 int SDFileSystem::initialise_card_v1() { 00172 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00173 _cmd(55, 0); 00174 if (_cmd(41, 0) == 0) { 00175 cdv = 512; 00176 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); 00177 return SDCARD_V1; 00178 } 00179 } 00180 00181 debug("Timeout waiting for v1.x card\n"); 00182 return SDCARD_FAIL; 00183 } 00184 00185 int SDFileSystem::initialise_card_v2() { 00186 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00187 wait_ms(50); 00188 _cmd58(); 00189 _cmd(55, 0); 00190 if (_cmd(41, 0x40000000) == 0) { 00191 _cmd58(); 00192 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); 00193 cdv = 1; 00194 return SDCARD_V2; 00195 } 00196 } 00197 00198 debug("Timeout waiting for v2.x card\n"); 00199 return SDCARD_FAIL; 00200 } 00201 00202 int SDFileSystem::disk_initialize() { 00203 int i = initialise_card(); 00204 debug_if(SD_DBG, "init card = %d\n", i); 00205 _sectors = _sd_sectors(); 00206 00207 // Set block length to 512 (CMD16) 00208 if (_cmd(16, 512) != 0) { 00209 debug("Set 512-byte block timed out\n"); 00210 return 1; 00211 } 00212 00213 _spi.frequency(1000000); // Set to 1MHz for data transfer 00214 return 0; 00215 } 00216 00217 int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) { 00218 // set write address for single block (CMD24) 00219 if (_cmd(24, block_number * cdv) != 0) { 00220 return 1; 00221 } 00222 00223 // send the data block 00224 _write(buffer, 512); 00225 return 0; 00226 } 00227 00228 int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) { 00229 // set read address for single block (CMD17) 00230 if (_cmd(17, block_number * cdv) != 0) { 00231 return 1; 00232 } 00233 00234 // receive the data 00235 _read(buffer, 512); 00236 return 0; 00237 } 00238 00239 int SDFileSystem::disk_status() { return 0; } 00240 int SDFileSystem::disk_sync() { return 0; } 00241 uint64_t SDFileSystem::disk_sectors() { return _sectors; } 00242 00243 bool SDFileSystem::sd_inserted() { 00244 DigitalIn SDcard_detect(p9); 00245 SDcard_detect.mode(PullUp); 00246 wait(0.1); 00247 if(SDcard_detect==1) { 00248 return true; 00249 } 00250 else { 00251 return false; 00252 } 00253 } 00254 00255 // PRIVATE FUNCTIONS 00256 int SDFileSystem::_cmd(int cmd, int arg) { 00257 _cs = 0; 00258 00259 // send a command 00260 _spi.write(0x40 | cmd); 00261 _spi.write(arg >> 24); 00262 _spi.write(arg >> 16); 00263 _spi.write(arg >> 8); 00264 _spi.write(arg >> 0); 00265 _spi.write(0x95); 00266 00267 // wait for the repsonse (response[7] == 0) 00268 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00269 int response = _spi.write(0xFF); 00270 if (!(response & 0x80)) { 00271 _cs = 1; 00272 _spi.write(0xFF); 00273 return response; 00274 } 00275 } 00276 _cs = 1; 00277 _spi.write(0xFF); 00278 return -1; // timeout 00279 } 00280 int SDFileSystem::_cmdx(int cmd, int arg) { 00281 _cs = 0; 00282 00283 // send a command 00284 _spi.write(0x40 | cmd); 00285 _spi.write(arg >> 24); 00286 _spi.write(arg >> 16); 00287 _spi.write(arg >> 8); 00288 _spi.write(arg >> 0); 00289 _spi.write(0x95); 00290 00291 // wait for the repsonse (response[7] == 0) 00292 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00293 int response = _spi.write(0xFF); 00294 if (!(response & 0x80)) { 00295 return response; 00296 } 00297 } 00298 _cs = 1; 00299 _spi.write(0xFF); 00300 return -1; // timeout 00301 } 00302 00303 00304 int SDFileSystem::_cmd58() { 00305 _cs = 0; 00306 int arg = 0; 00307 00308 // send a command 00309 _spi.write(0x40 | 58); 00310 _spi.write(arg >> 24); 00311 _spi.write(arg >> 16); 00312 _spi.write(arg >> 8); 00313 _spi.write(arg >> 0); 00314 _spi.write(0x95); 00315 00316 // wait for the repsonse (response[7] == 0) 00317 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { 00318 int response = _spi.write(0xFF); 00319 if (!(response & 0x80)) { 00320 int ocr = _spi.write(0xFF) << 24; 00321 ocr |= _spi.write(0xFF) << 16; 00322 ocr |= _spi.write(0xFF) << 8; 00323 ocr |= _spi.write(0xFF) << 0; 00324 _cs = 1; 00325 _spi.write(0xFF); 00326 return response; 00327 } 00328 } 00329 _cs = 1; 00330 _spi.write(0xFF); 00331 return -1; // timeout 00332 } 00333 00334 int SDFileSystem::_cmd8() { 00335 _cs = 0; 00336 00337 // send a command 00338 _spi.write(0x40 | 8); // CMD8 00339 _spi.write(0x00); // reserved 00340 _spi.write(0x00); // reserved 00341 _spi.write(0x01); // 3.3v 00342 _spi.write(0xAA); // check pattern 00343 _spi.write(0x87); // crc 00344 00345 // wait for the repsonse (response[7] == 0) 00346 for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { 00347 char response[5]; 00348 response[0] = _spi.write(0xFF); 00349 if (!(response[0] & 0x80)) { 00350 for (int j = 1; j < 5; j++) { 00351 response[i] = _spi.write(0xFF); 00352 } 00353 _cs = 1; 00354 _spi.write(0xFF); 00355 return response[0]; 00356 } 00357 } 00358 _cs = 1; 00359 _spi.write(0xFF); 00360 return -1; // timeout 00361 } 00362 00363 int SDFileSystem::_read(uint8_t *buffer, uint32_t length) { 00364 _cs = 0; 00365 00366 // read until start byte (0xFF) 00367 while (_spi.write(0xFF) != 0xFE); 00368 00369 // read data 00370 for (int i = 0; i < length; i++) { 00371 buffer[i] = _spi.write(0xFF); 00372 } 00373 _spi.write(0xFF); // checksum 00374 _spi.write(0xFF); 00375 00376 _cs = 1; 00377 _spi.write(0xFF); 00378 return 0; 00379 } 00380 00381 int SDFileSystem::_write(const uint8_t*buffer, uint32_t length) { 00382 _cs = 0; 00383 00384 // indicate start of block 00385 _spi.write(0xFE); 00386 00387 // write the data 00388 for (int i = 0; i < length; i++) { 00389 _spi.write(buffer[i]); 00390 } 00391 00392 // write the checksum 00393 _spi.write(0xFF); 00394 _spi.write(0xFF); 00395 00396 // check the response token 00397 if ((_spi.write(0xFF) & 0x1F) != 0x05) { 00398 _cs = 1; 00399 _spi.write(0xFF); 00400 return 1; 00401 } 00402 00403 // wait for write to finish 00404 while (_spi.write(0xFF) == 0); 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 Wed Jul 13 2022 02:55:38 by
1.7.2
