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