aadadf

Dependencies:   mbed-rtos mbed

Fork of cdms_rtos_v1_1_test by Team Fox

Committer:
pradeepvk2208
Date:
Sat Nov 07 12:06:40 2015 +0000
Revision:
1:c0c5ac8eac80
Parent:
0:4da7c8fdd429
hey cdms_pl

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sureshsusurla 0:4da7c8fdd429 1 #include "cdms_sd.h"
sureshsusurla 0:4da7c8fdd429 2
sureshsusurla 0:4da7c8fdd429 3 SPI spi_sd(PTE1, PTE3, PTE2); // MOSI,MISO, CLOCK microcontroller(in order)
sureshsusurla 0:4da7c8fdd429 4 DigitalOut cs_sd(PTE22);
sureshsusurla 0:4da7c8fdd429 5
sureshsusurla 0:4da7c8fdd429 6 Serial sd1(USBTX,USBRX);
sureshsusurla 0:4da7c8fdd429 7
sureshsusurla 0:4da7c8fdd429 8 int cdv;
sureshsusurla 0:4da7c8fdd429 9 uint64_t sd_sectors();
sureshsusurla 0:4da7c8fdd429 10 uint64_t sectors;
sureshsusurla 0:4da7c8fdd429 11
sureshsusurla 0:4da7c8fdd429 12 int initialise_card()
sureshsusurla 0:4da7c8fdd429 13 {
sureshsusurla 0:4da7c8fdd429 14 // Set to 100kHz for initialisation, and clock card with cs_sd = 1
sureshsusurla 0:4da7c8fdd429 15 spi_sd.frequency(100000);
sureshsusurla 0:4da7c8fdd429 16 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 17 for (int i = 0; i < 16; i++) {
sureshsusurla 0:4da7c8fdd429 18 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 19 }
sureshsusurla 0:4da7c8fdd429 20
sureshsusurla 0:4da7c8fdd429 21 // send CMD0, should return with all zeros except IDLE STATE set (bit 0)
sureshsusurla 0:4da7c8fdd429 22 if (cmd(0, 0) != R1_IDLE_STATE) {
sureshsusurla 0:4da7c8fdd429 23 debug("No disk, or could not put SD card in to spi_sd idle state\n");
sureshsusurla 0:4da7c8fdd429 24 return SDCARD_FAIL;
sureshsusurla 0:4da7c8fdd429 25 }
sureshsusurla 0:4da7c8fdd429 26
sureshsusurla 0:4da7c8fdd429 27 // send CMD8 to determine whther it is ver 2.x
sureshsusurla 0:4da7c8fdd429 28 int r = cmd8();
sureshsusurla 0:4da7c8fdd429 29 if (r == R1_IDLE_STATE) {
sureshsusurla 0:4da7c8fdd429 30 printf("Entering v2 bro\n");
sureshsusurla 0:4da7c8fdd429 31 return initialise_card_v2();
sureshsusurla 0:4da7c8fdd429 32
sureshsusurla 0:4da7c8fdd429 33 } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
sureshsusurla 0:4da7c8fdd429 34 printf("Entering v1 bro\n");
sureshsusurla 0:4da7c8fdd429 35 return initialise_card_v1();
sureshsusurla 0:4da7c8fdd429 36
sureshsusurla 0:4da7c8fdd429 37 } else {
sureshsusurla 0:4da7c8fdd429 38 debug("Not in idle state after sending CMD8 (not an SD card?)\n");
sureshsusurla 0:4da7c8fdd429 39 return SDCARD_FAIL;
sureshsusurla 0:4da7c8fdd429 40 }
sureshsusurla 0:4da7c8fdd429 41 }
sureshsusurla 0:4da7c8fdd429 42
sureshsusurla 0:4da7c8fdd429 43 int initialise_card_v1()
sureshsusurla 0:4da7c8fdd429 44 {
sureshsusurla 0:4da7c8fdd429 45 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
sureshsusurla 0:4da7c8fdd429 46 cmd(55, 0);
sureshsusurla 0:4da7c8fdd429 47 if (cmd(41, 0) == 0) {
sureshsusurla 0:4da7c8fdd429 48 printf("Yuppie v1 successful\n");
sureshsusurla 0:4da7c8fdd429 49 cdv = 512;
sureshsusurla 0:4da7c8fdd429 50 debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r");
sureshsusurla 0:4da7c8fdd429 51
sureshsusurla 0:4da7c8fdd429 52 return SDCARD_V1;
sureshsusurla 0:4da7c8fdd429 53 }
sureshsusurla 0:4da7c8fdd429 54 }
sureshsusurla 0:4da7c8fdd429 55
sureshsusurla 0:4da7c8fdd429 56 debug("Timeout waiting for v1.x card\n");
sureshsusurla 0:4da7c8fdd429 57 return SDCARD_FAIL;
sureshsusurla 0:4da7c8fdd429 58 }
sureshsusurla 0:4da7c8fdd429 59
sureshsusurla 0:4da7c8fdd429 60
sureshsusurla 0:4da7c8fdd429 61 int initialise_card_v2()
sureshsusurla 0:4da7c8fdd429 62 {
sureshsusurla 0:4da7c8fdd429 63 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
sureshsusurla 0:4da7c8fdd429 64 wait_ms(50);
sureshsusurla 0:4da7c8fdd429 65 cmd58();
sureshsusurla 0:4da7c8fdd429 66 cmd(55, 0);
sureshsusurla 0:4da7c8fdd429 67 if (cmd(41, 0x40000000) == 0) {
sureshsusurla 0:4da7c8fdd429 68 printf("Yuppie,v2 successful\n");
sureshsusurla 0:4da7c8fdd429 69 cmd58();
sureshsusurla 0:4da7c8fdd429 70 debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");
sureshsusurla 0:4da7c8fdd429 71 cdv = 1;
sureshsusurla 0:4da7c8fdd429 72
sureshsusurla 0:4da7c8fdd429 73 return SDCARD_V2;
sureshsusurla 0:4da7c8fdd429 74 }
sureshsusurla 0:4da7c8fdd429 75 }
sureshsusurla 0:4da7c8fdd429 76
sureshsusurla 0:4da7c8fdd429 77 debug("Timeout waiting for v2.x card\n");
sureshsusurla 0:4da7c8fdd429 78 return SDCARD_FAIL;
sureshsusurla 0:4da7c8fdd429 79 }
sureshsusurla 0:4da7c8fdd429 80
sureshsusurla 0:4da7c8fdd429 81 int cmd(int cmd, int arg)
sureshsusurla 0:4da7c8fdd429 82 {
sureshsusurla 0:4da7c8fdd429 83 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 84
sureshsusurla 0:4da7c8fdd429 85 // send a command
sureshsusurla 0:4da7c8fdd429 86 spi_sd.write(0x40 | cmd);
sureshsusurla 0:4da7c8fdd429 87 spi_sd.write(arg >> 24);
sureshsusurla 0:4da7c8fdd429 88 spi_sd.write(arg >> 16);
sureshsusurla 0:4da7c8fdd429 89 spi_sd.write(arg >> 8);
sureshsusurla 0:4da7c8fdd429 90 spi_sd.write(arg >> 0);
sureshsusurla 0:4da7c8fdd429 91 spi_sd.write(0x95);
sureshsusurla 0:4da7c8fdd429 92
sureshsusurla 0:4da7c8fdd429 93 // wait for the repsonse (response[7] == 0)
sureshsusurla 0:4da7c8fdd429 94 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
sureshsusurla 0:4da7c8fdd429 95 int response = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 96 if (!(response & 0x80)) {
sureshsusurla 0:4da7c8fdd429 97 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 98 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 99 return response;
sureshsusurla 0:4da7c8fdd429 100 }
sureshsusurla 0:4da7c8fdd429 101 }
sureshsusurla 0:4da7c8fdd429 102 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 103 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 104 return -1; // timeout
sureshsusurla 0:4da7c8fdd429 105 }
sureshsusurla 0:4da7c8fdd429 106
sureshsusurla 0:4da7c8fdd429 107
sureshsusurla 0:4da7c8fdd429 108 int cmd58()
sureshsusurla 0:4da7c8fdd429 109 {
sureshsusurla 0:4da7c8fdd429 110 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 111 int arg = 0;
sureshsusurla 0:4da7c8fdd429 112
sureshsusurla 0:4da7c8fdd429 113 // send a command
sureshsusurla 0:4da7c8fdd429 114 spi_sd.write(0x40 | 58);
sureshsusurla 0:4da7c8fdd429 115 spi_sd.write(arg >> 24);
sureshsusurla 0:4da7c8fdd429 116 spi_sd.write(arg >> 16);
sureshsusurla 0:4da7c8fdd429 117 spi_sd.write(arg >> 8);
sureshsusurla 0:4da7c8fdd429 118 spi_sd.write(arg >> 0);
sureshsusurla 0:4da7c8fdd429 119 spi_sd.write(0x95);
sureshsusurla 0:4da7c8fdd429 120
sureshsusurla 0:4da7c8fdd429 121 // wait for the repsonse (response[7] == 0)
sureshsusurla 0:4da7c8fdd429 122 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
sureshsusurla 0:4da7c8fdd429 123 int response = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 124 if (!(response & 0x80)) {
sureshsusurla 0:4da7c8fdd429 125 int ocr = spi_sd.write(0xFF) << 24;
sureshsusurla 0:4da7c8fdd429 126 ocr |= spi_sd.write(0xFF) << 16;
sureshsusurla 0:4da7c8fdd429 127 ocr |= spi_sd.write(0xFF) << 8;
sureshsusurla 0:4da7c8fdd429 128 ocr |= spi_sd.write(0xFF) << 0;
sureshsusurla 0:4da7c8fdd429 129 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 130 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 131 return response;
sureshsusurla 0:4da7c8fdd429 132 }
sureshsusurla 0:4da7c8fdd429 133 }
sureshsusurla 0:4da7c8fdd429 134 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 135 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 136 return -1; // timeout
sureshsusurla 0:4da7c8fdd429 137 }
sureshsusurla 0:4da7c8fdd429 138
sureshsusurla 0:4da7c8fdd429 139
sureshsusurla 0:4da7c8fdd429 140 int cmd8()
sureshsusurla 0:4da7c8fdd429 141 {
sureshsusurla 0:4da7c8fdd429 142 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 143
sureshsusurla 0:4da7c8fdd429 144 // send a command
sureshsusurla 0:4da7c8fdd429 145 spi_sd.write(0x40 | 8); // CMD8
sureshsusurla 0:4da7c8fdd429 146 spi_sd.write(0x00); // reserved
sureshsusurla 0:4da7c8fdd429 147 spi_sd.write(0x00); // reserved
sureshsusurla 0:4da7c8fdd429 148 spi_sd.write(0x01); // 3.3v
sureshsusurla 0:4da7c8fdd429 149 spi_sd.write(0xAA); // check pattern
sureshsusurla 0:4da7c8fdd429 150 spi_sd.write(0x87); // crc
sureshsusurla 0:4da7c8fdd429 151
sureshsusurla 0:4da7c8fdd429 152 // wait for the repsonse (response[7] == 0)
sureshsusurla 0:4da7c8fdd429 153 for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) {
sureshsusurla 0:4da7c8fdd429 154 char response[5];
sureshsusurla 0:4da7c8fdd429 155 response[0] = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 156 if (!(response[0] & 0x80)) {
sureshsusurla 0:4da7c8fdd429 157 for (int j = 1; j < 5; j++) {
sureshsusurla 0:4da7c8fdd429 158 response[i] = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 159 }
sureshsusurla 0:4da7c8fdd429 160 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 161 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 162 return response[0];
sureshsusurla 0:4da7c8fdd429 163 }
sureshsusurla 0:4da7c8fdd429 164 }
sureshsusurla 0:4da7c8fdd429 165 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 166 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 167 return -1; // timeout
sureshsusurla 0:4da7c8fdd429 168 }
sureshsusurla 0:4da7c8fdd429 169
sureshsusurla 0:4da7c8fdd429 170 uint64_t sd_sectors()
sureshsusurla 0:4da7c8fdd429 171 {
sureshsusurla 0:4da7c8fdd429 172 uint32_t c_size, c_size_mult, read_bl_len;
sureshsusurla 0:4da7c8fdd429 173 uint32_t block_len, mult, blocknr, capacity;
sureshsusurla 0:4da7c8fdd429 174 uint32_t hc_c_size;
sureshsusurla 0:4da7c8fdd429 175 uint64_t blocks;
sureshsusurla 0:4da7c8fdd429 176
sureshsusurla 0:4da7c8fdd429 177 // CMD9, Response R2 (R1 byte + 16-byte block read)
sureshsusurla 0:4da7c8fdd429 178 if (cmdx(9, 0) != 0) {
sureshsusurla 0:4da7c8fdd429 179 debug("Didn't get a response from the disk\n");
sureshsusurla 0:4da7c8fdd429 180 return 0;
sureshsusurla 0:4da7c8fdd429 181 }
sureshsusurla 0:4da7c8fdd429 182
sureshsusurla 0:4da7c8fdd429 183 uint8_t cs_sdd[16];
sureshsusurla 0:4da7c8fdd429 184 if (read(cs_sdd, 16) != 0) {
sureshsusurla 0:4da7c8fdd429 185 debug("Couldn't read cs_sdd response from disk\n");
sureshsusurla 0:4da7c8fdd429 186 return 0;
sureshsusurla 0:4da7c8fdd429 187 }
sureshsusurla 0:4da7c8fdd429 188
sureshsusurla 0:4da7c8fdd429 189 // cs_sdd_structure : cs_sdd[127:126]
sureshsusurla 0:4da7c8fdd429 190 // c_size : cs_sdd[73:62]
sureshsusurla 0:4da7c8fdd429 191 // c_size_mult : cs_sdd[49:47]
sureshsusurla 0:4da7c8fdd429 192 // read_bl_len : cs_sdd[83:80] - the *maximum* read block length
sureshsusurla 0:4da7c8fdd429 193
sureshsusurla 0:4da7c8fdd429 194 int cs_sdd_structure = ext_bits(cs_sdd, 127, 126);
sureshsusurla 0:4da7c8fdd429 195
sureshsusurla 0:4da7c8fdd429 196 switch (cs_sdd_structure) {
sureshsusurla 0:4da7c8fdd429 197 case 0:
sureshsusurla 0:4da7c8fdd429 198 cdv = 512;
sureshsusurla 0:4da7c8fdd429 199 c_size = ext_bits(cs_sdd, 73, 62);
sureshsusurla 0:4da7c8fdd429 200 c_size_mult = ext_bits(cs_sdd, 49, 47);
sureshsusurla 0:4da7c8fdd429 201 read_bl_len = ext_bits(cs_sdd, 83, 80);
sureshsusurla 0:4da7c8fdd429 202
sureshsusurla 0:4da7c8fdd429 203 block_len = 1 << read_bl_len;
sureshsusurla 0:4da7c8fdd429 204 mult = 1 << (c_size_mult + 2);
sureshsusurla 0:4da7c8fdd429 205 blocknr = (c_size + 1) * mult;
sureshsusurla 0:4da7c8fdd429 206 capacity = blocknr * block_len;
sureshsusurla 0:4da7c8fdd429 207 blocks = capacity / 512;
sureshsusurla 0:4da7c8fdd429 208 debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);
sureshsusurla 0:4da7c8fdd429 209 break;
sureshsusurla 0:4da7c8fdd429 210
sureshsusurla 0:4da7c8fdd429 211 case 1:
sureshsusurla 0:4da7c8fdd429 212 cdv = 1;
sureshsusurla 0:4da7c8fdd429 213 hc_c_size = ext_bits(cs_sdd, 63, 48);
sureshsusurla 0:4da7c8fdd429 214 blocks = (hc_c_size+1)*1024;
sureshsusurla 0:4da7c8fdd429 215 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);
sureshsusurla 0:4da7c8fdd429 216 break;
sureshsusurla 0:4da7c8fdd429 217
sureshsusurla 0:4da7c8fdd429 218 default:
sureshsusurla 0:4da7c8fdd429 219 debug("cs_sdD struct unsupported\r\n");
sureshsusurla 0:4da7c8fdd429 220 return 0;
sureshsusurla 0:4da7c8fdd429 221 };
sureshsusurla 0:4da7c8fdd429 222 return blocks;
sureshsusurla 0:4da7c8fdd429 223 }
sureshsusurla 0:4da7c8fdd429 224
sureshsusurla 0:4da7c8fdd429 225 int cmdx(int cmd, int arg)
sureshsusurla 0:4da7c8fdd429 226 {
sureshsusurla 0:4da7c8fdd429 227 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 228
sureshsusurla 0:4da7c8fdd429 229 // send a command
sureshsusurla 0:4da7c8fdd429 230 spi_sd.write(0x40 | cmd);
sureshsusurla 0:4da7c8fdd429 231 spi_sd.write(arg >> 24);
sureshsusurla 0:4da7c8fdd429 232 spi_sd.write(arg >> 16);
sureshsusurla 0:4da7c8fdd429 233 spi_sd.write(arg >> 8);
sureshsusurla 0:4da7c8fdd429 234 spi_sd.write(arg >> 0);
sureshsusurla 0:4da7c8fdd429 235 spi_sd.write(0x95);
sureshsusurla 0:4da7c8fdd429 236
sureshsusurla 0:4da7c8fdd429 237 // wait for the repsonse (response[7] == 0)
sureshsusurla 0:4da7c8fdd429 238 for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
sureshsusurla 0:4da7c8fdd429 239 int response = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 240 if (!(response & 0x80)) {
sureshsusurla 0:4da7c8fdd429 241 return response;
sureshsusurla 0:4da7c8fdd429 242 }
sureshsusurla 0:4da7c8fdd429 243 }
sureshsusurla 0:4da7c8fdd429 244 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 245 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 246 return -1; // timeout
sureshsusurla 0:4da7c8fdd429 247 }
sureshsusurla 0:4da7c8fdd429 248
sureshsusurla 0:4da7c8fdd429 249 static uint32_t ext_bits(unsigned char *data, int msb, int lsb)
sureshsusurla 0:4da7c8fdd429 250 {
sureshsusurla 0:4da7c8fdd429 251 uint32_t bits = 0;
sureshsusurla 0:4da7c8fdd429 252 uint32_t size = 1 + msb - lsb;
sureshsusurla 0:4da7c8fdd429 253 for (int i = 0; i < size; i++) {
sureshsusurla 0:4da7c8fdd429 254 uint32_t position = lsb + i;
sureshsusurla 0:4da7c8fdd429 255 uint32_t byte = 15 - (position >> 3);
sureshsusurla 0:4da7c8fdd429 256 uint32_t bit = position & 0x7;
sureshsusurla 0:4da7c8fdd429 257 uint32_t value = (data[byte] >> bit) & 1;
sureshsusurla 0:4da7c8fdd429 258 bits |= value << i;
sureshsusurla 0:4da7c8fdd429 259 }
sureshsusurla 0:4da7c8fdd429 260 return bits;
sureshsusurla 0:4da7c8fdd429 261 }
sureshsusurla 0:4da7c8fdd429 262
sureshsusurla 0:4da7c8fdd429 263 int disk_initialize()
sureshsusurla 0:4da7c8fdd429 264 {
sureshsusurla 0:4da7c8fdd429 265 int i = initialise_card();
sureshsusurla 0:4da7c8fdd429 266 debug_if(SD_DBG, "init card = %d\n", i);
sureshsusurla 0:4da7c8fdd429 267 sectors = sd_sectors();
sureshsusurla 0:4da7c8fdd429 268
sureshsusurla 0:4da7c8fdd429 269 // Set block length to 512 (CMD16)
sureshsusurla 0:4da7c8fdd429 270 if (cmd(16, 512) != 0) {
sureshsusurla 0:4da7c8fdd429 271 debug("Set 512-byte block timed out\n");
sureshsusurla 0:4da7c8fdd429 272 return 1;
sureshsusurla 0:4da7c8fdd429 273 } else {
sureshsusurla 0:4da7c8fdd429 274 printf("Hey,block init succesful\n");
sureshsusurla 0:4da7c8fdd429 275 }
sureshsusurla 0:4da7c8fdd429 276
sureshsusurla 0:4da7c8fdd429 277 spi_sd.frequency(1000000); // Set to 1MHz for data transfer
sureshsusurla 0:4da7c8fdd429 278 return 0;
sureshsusurla 0:4da7c8fdd429 279 }
sureshsusurla 0:4da7c8fdd429 280
sureshsusurla 0:4da7c8fdd429 281 int disk_write(const uint8_t *buffer, uint64_t block_number)
sureshsusurla 0:4da7c8fdd429 282
sureshsusurla 0:4da7c8fdd429 283 {
sureshsusurla 0:4da7c8fdd429 284 // set write address for single block (CMD24)
sureshsusurla 0:4da7c8fdd429 285 if (cmd(24, block_number * cdv) != 0) {
sureshsusurla 0:4da7c8fdd429 286 return 1;
sureshsusurla 0:4da7c8fdd429 287 }
sureshsusurla 0:4da7c8fdd429 288
sureshsusurla 0:4da7c8fdd429 289 // send the data block
sureshsusurla 0:4da7c8fdd429 290 write(buffer, 512);
sureshsusurla 0:4da7c8fdd429 291 //printf("Written Successfully bro \n");
sureshsusurla 0:4da7c8fdd429 292 return 0;
sureshsusurla 0:4da7c8fdd429 293 }
sureshsusurla 0:4da7c8fdd429 294
sureshsusurla 0:4da7c8fdd429 295 int write(const uint8_t*buffer, uint32_t length)
sureshsusurla 0:4da7c8fdd429 296 {
sureshsusurla 0:4da7c8fdd429 297 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 298
sureshsusurla 0:4da7c8fdd429 299 // indicate start of block
sureshsusurla 0:4da7c8fdd429 300 spi_sd.write(0xFE);
sureshsusurla 0:4da7c8fdd429 301
sureshsusurla 0:4da7c8fdd429 302 // write the data
sureshsusurla 0:4da7c8fdd429 303 for (int i = 0; i < length; i++) {
sureshsusurla 0:4da7c8fdd429 304 spi_sd.write(buffer[i]);
sureshsusurla 0:4da7c8fdd429 305 }
sureshsusurla 0:4da7c8fdd429 306
sureshsusurla 0:4da7c8fdd429 307 // write the checksum
sureshsusurla 0:4da7c8fdd429 308 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 309 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 310
sureshsusurla 0:4da7c8fdd429 311 // check the response token
sureshsusurla 0:4da7c8fdd429 312 if ((spi_sd.write(0xFF) & 0x1F) != 0x05) {
sureshsusurla 0:4da7c8fdd429 313 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 314 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 315 return 1;
sureshsusurla 0:4da7c8fdd429 316 }
sureshsusurla 0:4da7c8fdd429 317
sureshsusurla 0:4da7c8fdd429 318 // wait for write to finish
sureshsusurla 0:4da7c8fdd429 319 while (spi_sd.write(0xFF) == 0);
sureshsusurla 0:4da7c8fdd429 320
sureshsusurla 0:4da7c8fdd429 321 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 322 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 323 return 0;
sureshsusurla 0:4da7c8fdd429 324 }
sureshsusurla 0:4da7c8fdd429 325
sureshsusurla 0:4da7c8fdd429 326 int disk_read(uint8_t *buffer, uint64_t block_number)
sureshsusurla 0:4da7c8fdd429 327 {
sureshsusurla 0:4da7c8fdd429 328 // set read address for single block (CMD17)
sureshsusurla 0:4da7c8fdd429 329 if (cmd(17, block_number * cdv) != 0) {
sureshsusurla 0:4da7c8fdd429 330 return 1;
sureshsusurla 0:4da7c8fdd429 331 }
sureshsusurla 0:4da7c8fdd429 332
sureshsusurla 0:4da7c8fdd429 333 // receive the data
sureshsusurla 0:4da7c8fdd429 334 read(buffer, 512);
sureshsusurla 0:4da7c8fdd429 335 return 0;
sureshsusurla 0:4da7c8fdd429 336 }
sureshsusurla 0:4da7c8fdd429 337
sureshsusurla 0:4da7c8fdd429 338 int read(uint8_t *buffer, uint32_t length)
sureshsusurla 0:4da7c8fdd429 339 {
sureshsusurla 0:4da7c8fdd429 340 cs_sd = 0;
sureshsusurla 0:4da7c8fdd429 341
sureshsusurla 0:4da7c8fdd429 342 // read until start byte (0xFF)
sureshsusurla 0:4da7c8fdd429 343 while (spi_sd.write(0xFF) != 0xFE);
sureshsusurla 0:4da7c8fdd429 344
sureshsusurla 0:4da7c8fdd429 345 // read data
sureshsusurla 0:4da7c8fdd429 346 for (int i = 0; i < length; i++) {
sureshsusurla 0:4da7c8fdd429 347 buffer[i] = spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 348 }
sureshsusurla 0:4da7c8fdd429 349 spi_sd.write(0xFF); // checksum
sureshsusurla 0:4da7c8fdd429 350 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 351
sureshsusurla 0:4da7c8fdd429 352 cs_sd = 1;
sureshsusurla 0:4da7c8fdd429 353 spi_sd.write(0xFF);
sureshsusurla 0:4da7c8fdd429 354 return 0;
sureshsusurla 0:4da7c8fdd429 355 }
sureshsusurla 0:4da7c8fdd429 356
sureshsusurla 0:4da7c8fdd429 357 int disk_erase(int startBlock, int totalBlocks)
sureshsusurla 0:4da7c8fdd429 358 {
sureshsusurla 0:4da7c8fdd429 359 if(cmd(32, startBlock * cdv) != 0) {
sureshsusurla 0:4da7c8fdd429 360 return 1;
sureshsusurla 0:4da7c8fdd429 361 }
sureshsusurla 0:4da7c8fdd429 362 if (cmd(33, (startBlock+totalBlocks-1) * cdv) != 0) {
sureshsusurla 0:4da7c8fdd429 363 return 1;
sureshsusurla 0:4da7c8fdd429 364 }
sureshsusurla 0:4da7c8fdd429 365 if (cmd(38,0) != 0) {
sureshsusurla 0:4da7c8fdd429 366 return 1;
sureshsusurla 0:4da7c8fdd429 367 }
sureshsusurla 0:4da7c8fdd429 368
sureshsusurla 0:4da7c8fdd429 369 return 0; //normal return
sureshsusurla 0:4da7c8fdd429 370 }