Subversion Repositories MK-Marlin

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ron 1
/**
2
 * Marlin 3D Printer Firmware
3
 * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
 *
5
 * Based on Sprinter and grbl.
6
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 *
21
 */
22
 
23
/**
24
 * Arduino Sd2Card Library
25
 * Copyright (C) 2009 by William Greiman
26
 *
27
 * This file is part of the Arduino Sd2Card Library
28
 */
29
#include "MarlinConfig.h"
30
 
31
#if ENABLED(SDSUPPORT)
32
 
33
#include "Sd2Card.h"
34
 
35
#if ENABLED(USE_WATCHDOG)
36
  #include "watchdog.h"
37
#endif
38
 
39
#if DISABLED(SOFTWARE_SPI)
40
  // functions for hardware SPI
41
 
42
  // make sure SPCR rate is in expected bits
43
  #if (SPR0 != 0 || SPR1 != 1)
44
    #error "unexpected SPCR bits"
45
  #endif
46
  /**
47
   * Initialize hardware SPI
48
   * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6]
49
   */
50
  static void spiInit(uint8_t spiRate) {
51
    // See avr processor documentation
52
    SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
53
    SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
54
  }
55
 
56
  /** SPI receive a byte */
57
  static uint8_t spiRec() {
58
    SPDR = 0xFF;
59
    while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
60
    return SPDR;
61
  }
62
 
63
  /** SPI read data - only one call so force inline */
64
  static inline __attribute__((always_inline))
65
  void spiRead(uint8_t* buf, uint16_t nbyte) {
66
    if (nbyte-- == 0) return;
67
    SPDR = 0xFF;
68
    for (uint16_t i = 0; i < nbyte; i++) {
69
      while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
70
      buf[i] = SPDR;
71
      SPDR = 0xFF;
72
    }
73
    while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
74
    buf[nbyte] = SPDR;
75
  }
76
 
77
  /** SPI send a byte */
78
  static void spiSend(uint8_t b) {
79
    SPDR = b;
80
    while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
81
  }
82
 
83
  /** SPI send block - only one call so force inline */
84
  static inline __attribute__((always_inline))
85
  void spiSendBlock(uint8_t token, const uint8_t* buf) {
86
    SPDR = token;
87
    for (uint16_t i = 0; i < 512; i += 2) {
88
      while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
89
      SPDR = buf[i];
90
      while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
91
      SPDR = buf[i + 1];
92
    }
93
    while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
94
  }
95
       //------------------------------------------------------------------------------
96
#else  // SOFTWARE_SPI
97
       //------------------------------------------------------------------------------
98
 
99
  /** nop to tune soft SPI timing */
100
  #define nop asm volatile ("nop\n\t")
101
 
102
  /** Soft SPI receive byte */
103
  static uint8_t spiRec() {
104
    uint8_t data = 0;
105
    // no interrupts during byte receive - about 8 us
106
    cli();
107
    // output pin high - like sending 0xFF
108
    WRITE(SPI_MOSI_PIN, HIGH);
109
 
110
    for (uint8_t i = 0; i < 8; i++) {
111
      WRITE(SPI_SCK_PIN, HIGH);
112
 
113
      // adjust so SCK is nice
114
      nop;
115
      nop;
116
 
117
      data <<= 1;
118
 
119
      if (READ(SPI_MISO_PIN)) data |= 1;
120
 
121
      WRITE(SPI_SCK_PIN, LOW);
122
    }
123
    // enable interrupts
124
    sei();
125
    return data;
126
  }
127
 
128
  /** Soft SPI read data */
129
  static void spiRead(uint8_t* buf, uint16_t nbyte) {
130
    for (uint16_t i = 0; i < nbyte; i++)
131
      buf[i] = spiRec();
132
  }
133
 
134
  /** Soft SPI send byte */
135
  static void spiSend(uint8_t data) {
136
    // no interrupts during byte send - about 8 us
137
    cli();
138
    for (uint8_t i = 0; i < 8; i++) {
139
      WRITE(SPI_SCK_PIN, LOW);
140
 
141
      WRITE(SPI_MOSI_PIN, data & 0x80);
142
 
143
      data <<= 1;
144
 
145
      WRITE(SPI_SCK_PIN, HIGH);
146
    }
147
    // hold SCK high for a few ns
148
    nop;
149
    nop;
150
    nop;
151
    nop;
152
 
153
    WRITE(SPI_SCK_PIN, LOW);
154
    // enable interrupts
155
    sei();
156
  }
157
 
158
  /** Soft SPI send block */
159
  void spiSendBlock(uint8_t token, const uint8_t* buf) {
160
    spiSend(token);
161
    for (uint16_t i = 0; i < 512; i++)
162
      spiSend(buf[i]);
163
  }
164
#endif  // SOFTWARE_SPI
165
 
166
// send command and return error code.  Return zero for OK
167
uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) {
168
  // select card
169
  chipSelectLow();
170
 
171
  // wait up to 300 ms if busy
172
  waitNotBusy(300);
173
 
174
  // send command
175
  spiSend(cmd | 0x40);
176
 
177
  // send argument
178
  for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);
179
 
180
  // send CRC
181
  uint8_t crc = 0xFF;
182
  if (cmd == CMD0) crc = 0x95;  // correct crc for CMD0 with arg 0
183
  if (cmd == CMD8) crc = 0x87;  // correct crc for CMD8 with arg 0x1AA
184
  spiSend(crc);
185
 
186
  // skip stuff byte for stop read
187
  if (cmd == CMD12) spiRec();
188
 
189
  // wait for response
190
  for (uint8_t i = 0; ((status_ = spiRec()) & 0x80) && i != 0xFF; i++) { /* Intentionally left empty */ }
191
  return status_;
192
}
193
 
194
/**
195
 * Determine the size of an SD flash memory card.
196
 *
197
 * \return The number of 512 byte data blocks in the card
198
 *         or zero if an error occurs.
199
 */
200
uint32_t Sd2Card::cardSize() {
201
  csd_t csd;
202
  if (!readCSD(&csd)) return 0;
203
  if (csd.v1.csd_ver == 0) {
204
    uint8_t read_bl_len = csd.v1.read_bl_len;
205
    uint16_t c_size = (csd.v1.c_size_high << 10)
206
                      | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low;
207
    uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1)
208
                          | csd.v1.c_size_mult_low;
209
    return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7);
210
  }
211
  else if (csd.v2.csd_ver == 1) {
212
    uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16)
213
                      | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low;
214
    return (c_size + 1) << 10;
215
  }
216
  else {
217
    error(SD_CARD_ERROR_BAD_CSD);
218
    return 0;
219
  }
220
}
221
 
222
void Sd2Card::chipSelectHigh() {
223
  digitalWrite(chipSelectPin_, HIGH);
224
}
225
 
226
void Sd2Card::chipSelectLow() {
227
  #if DISABLED(SOFTWARE_SPI)
228
    spiInit(spiRate_);
229
  #endif  // SOFTWARE_SPI
230
  digitalWrite(chipSelectPin_, LOW);
231
}
232
 
233
/**
234
 * Erase a range of blocks.
235
 *
236
 * \param[in] firstBlock The address of the first block in the range.
237
 * \param[in] lastBlock The address of the last block in the range.
238
 *
239
 * \note This function requests the SD card to do a flash erase for a
240
 * range of blocks.  The data on the card after an erase operation is
241
 * either 0 or 1, depends on the card vendor.  The card must support
242
 * single block erase.
243
 *
244
 * \return true for success, false for failure.
245
 */
246
bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) {
247
  csd_t csd;
248
  if (!readCSD(&csd)) goto FAIL;
249
  // check for single block erase
250
  if (!csd.v1.erase_blk_en) {
251
    // erase size mask
252
    uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low;
253
    if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) {
254
      // error card can't erase specified area
255
      error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK);
256
      goto FAIL;
257
    }
258
  }
259
  if (type_ != SD_CARD_TYPE_SDHC) {
260
    firstBlock <<= 9;
261
    lastBlock <<= 9;
262
  }
263
  if (cardCommand(CMD32, firstBlock)
264
      || cardCommand(CMD33, lastBlock)
265
      || cardCommand(CMD38, 0)) {
266
    error(SD_CARD_ERROR_ERASE);
267
    goto FAIL;
268
  }
269
  if (!waitNotBusy(SD_ERASE_TIMEOUT)) {
270
    error(SD_CARD_ERROR_ERASE_TIMEOUT);
271
    goto FAIL;
272
  }
273
  chipSelectHigh();
274
  return true;
275
  FAIL:
276
  chipSelectHigh();
277
  return false;
278
}
279
 
280
/**
281
 * Determine if card supports single block erase.
282
 *
283
 * \return true if single block erase is supported.
284
 *         false if single block erase is not supported.
285
 */
286
bool Sd2Card::eraseSingleBlockEnable() {
287
  csd_t csd;
288
  return readCSD(&csd) ? csd.v1.erase_blk_en : false;
289
}
290
 
291
/**
292
 * Initialize an SD flash memory card.
293
 *
294
 * \param[in] sckRateID SPI clock rate selector. See setSckRate().
295
 * \param[in] chipSelectPin SD chip select pin number.
296
 *
297
 * \return true for success, false for failure.
298
 * The reason for failure can be determined by calling errorCode() and errorData().
299
 */
300
bool Sd2Card::init(uint8_t sckRateID, pin_t chipSelectPin) {
301
  errorCode_ = type_ = 0;
302
  chipSelectPin_ = chipSelectPin;
303
  // 16-bit init start time allows over a minute
304
  uint16_t t0 = (uint16_t)millis();
305
  uint32_t arg;
306
 
307
  // If init takes more than 4s it could trigger
308
  // watchdog leading to a reboot loop.
309
  #if ENABLED(USE_WATCHDOG)
310
    watchdog_reset();
311
  #endif
312
 
313
  // set pin modes
314
  pinMode(chipSelectPin_, OUTPUT);
315
  chipSelectHigh();
316
  SET_INPUT(SPI_MISO_PIN);
317
  SET_OUTPUT(SPI_MOSI_PIN);
318
  SET_OUTPUT(SPI_SCK_PIN);
319
 
320
  #if DISABLED(SOFTWARE_SPI)
321
    // SS must be in output mode even it is not chip select
322
    SET_OUTPUT(SS_PIN);
323
    // set SS high - may be chip select for another SPI device
324
    #if SET_SPI_SS_HIGH
325
      WRITE(SS_PIN, HIGH);
326
    #endif  // SET_SPI_SS_HIGH
327
    // set SCK rate for initialization commands
328
    spiRate_ = SPI_SD_INIT_RATE;
329
    spiInit(spiRate_);
330
  #endif  // SOFTWARE_SPI
331
 
332
  // must supply min of 74 clock cycles with CS high.
333
  for (uint8_t i = 0; i < 10; i++) spiSend(0xFF);
334
 
335
  // command to go idle in SPI mode
336
  while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) {
337
    if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) {
338
      error(SD_CARD_ERROR_CMD0);
339
      goto FAIL;
340
    }
341
  }
342
  // check SD version
343
  if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) {
344
    type(SD_CARD_TYPE_SD1);
345
  }
346
  else {
347
    // only need last byte of r7 response
348
    for (uint8_t i = 0; i < 4; i++) status_ = spiRec();
349
    if (status_ != 0xAA) {
350
      error(SD_CARD_ERROR_CMD8);
351
      goto FAIL;
352
    }
353
    type(SD_CARD_TYPE_SD2);
354
  }
355
  // initialize card and send host supports SDHC if SD2
356
  arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0;
357
 
358
  while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) {
359
    // check for timeout
360
    if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) {
361
      error(SD_CARD_ERROR_ACMD41);
362
      goto FAIL;
363
    }
364
  }
365
  // if SD2 read OCR register to check for SDHC card
366
  if (type() == SD_CARD_TYPE_SD2) {
367
    if (cardCommand(CMD58, 0)) {
368
      error(SD_CARD_ERROR_CMD58);
369
      goto FAIL;
370
    }
371
    if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC);
372
    // discard rest of ocr - contains allowed voltage range
373
    for (uint8_t i = 0; i < 3; i++) spiRec();
374
  }
375
  chipSelectHigh();
376
 
377
  #if DISABLED(SOFTWARE_SPI)
378
    return setSckRate(sckRateID);
379
  #else  // SOFTWARE_SPI
380
    UNUSED(sckRateID);
381
    return true;
382
  #endif  // SOFTWARE_SPI
383
 
384
  FAIL:
385
  chipSelectHigh();
386
  return false;
387
}
388
 
389
/**
390
 * Read a 512 byte block from an SD card.
391
 *
392
 * \param[in] blockNumber Logical block to be read.
393
 * \param[out] dst Pointer to the location that will receive the data.
394
 * \return true for success, false for failure.
395
 */
396
bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) {
397
  // use address if not SDHC card
398
  if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9;
399
 
400
  #if ENABLED(SD_CHECK_AND_RETRY)
401
    uint8_t retryCnt = 3;
402
    for (;;) {
403
      if (cardCommand(CMD17, blockNumber))
404
        error(SD_CARD_ERROR_CMD17);
405
      else if (readData(dst, 512))
406
        return true;
407
 
408
      chipSelectHigh();
409
      if (!--retryCnt) break;
410
 
411
      cardCommand(CMD12, 0); // Try sending a stop command, ignore the result.
412
      errorCode_ = 0;
413
    }
414
    return false;
415
  #else
416
    if (cardCommand(CMD17, blockNumber)) {
417
      error(SD_CARD_ERROR_CMD17);
418
      chipSelectHigh();
419
      return false;
420
    }
421
    else
422
      return readData(dst, 512);
423
  #endif
424
}
425
 
426
/**
427
 * Read one data block in a multiple block read sequence
428
 *
429
 * \param[in] dst Pointer to the location for the data to be read.
430
 *
431
 * \return true for success, false for failure.
432
 */
433
bool Sd2Card::readData(uint8_t* dst) {
434
  chipSelectLow();
435
  return readData(dst, 512);
436
}
437
 
438
#if ENABLED(SD_CHECK_AND_RETRY)
439
  static const uint16_t crctab[] PROGMEM = {
440
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
441
    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
442
    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
443
    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
444
    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
445
    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
446
    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
447
    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
448
    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
449
    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
450
    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
451
    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
452
    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
453
    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
454
    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
455
    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
456
    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
457
    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
458
    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
459
    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
460
    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
461
    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
462
    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
463
    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
464
    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
465
    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
466
    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
467
    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
468
    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
469
    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
470
    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
471
    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
472
  };
473
  static uint16_t CRC_CCITT(const uint8_t* data, size_t n) {
474
    uint16_t crc = 0;
475
    for (size_t i = 0; i < n; i++) {
476
      crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8);
477
    }
478
    return crc;
479
  }
480
#endif // SD_CHECK_AND_RETRY
481
 
482
bool Sd2Card::readData(uint8_t* dst, uint16_t count) {
483
  // wait for start block token
484
  uint16_t t0 = millis();
485
  while ((status_ = spiRec()) == 0XFF) {
486
    if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) {
487
      error(SD_CARD_ERROR_READ_TIMEOUT);
488
      goto FAIL;
489
    }
490
  }
491
  if (status_ != DATA_START_BLOCK) {
492
    error(SD_CARD_ERROR_READ);
493
    goto FAIL;
494
  }
495
  // transfer data
496
  spiRead(dst, count);
497
 
498
#if ENABLED(SD_CHECK_AND_RETRY)
499
  {
500
    uint16_t calcCrc = CRC_CCITT(dst, count);
501
    uint16_t recvCrc = spiRec() << 8;
502
    recvCrc |= spiRec();
503
    if (calcCrc != recvCrc) {
504
      error(SD_CARD_ERROR_CRC);
505
      goto FAIL;
506
    }
507
  }
508
#else
509
  // discard CRC
510
  spiRec();
511
  spiRec();
512
#endif
513
  chipSelectHigh();
514
  // Send an additional dummy byte, required by Toshiba Flash Air SD Card
515
  spiSend(0XFF);
516
  return true;
517
  FAIL:
518
  chipSelectHigh();
519
  // Send an additional dummy byte, required by Toshiba Flash Air SD Card
520
  spiSend(0XFF);
521
  return false;
522
}
523
 
524
/** read CID or CSR register */
525
bool Sd2Card::readRegister(uint8_t cmd, void* buf) {
526
  uint8_t* dst = reinterpret_cast<uint8_t*>(buf);
527
  if (cardCommand(cmd, 0)) {
528
    error(SD_CARD_ERROR_READ_REG);
529
    chipSelectHigh();
530
    return false;
531
  }
532
  return readData(dst, 16);
533
}
534
 
535
/**
536
 * Start a read multiple blocks sequence.
537
 *
538
 * \param[in] blockNumber Address of first block in sequence.
539
 *
540
 * \note This function is used with readData() and readStop() for optimized
541
 * multiple block reads.  SPI chipSelect must be low for the entire sequence.
542
 *
543
 * \return true for success, false for failure.
544
 */
545
bool Sd2Card::readStart(uint32_t blockNumber) {
546
  if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9;
547
  if (cardCommand(CMD18, blockNumber)) {
548
    error(SD_CARD_ERROR_CMD18);
549
    chipSelectHigh();
550
    return false;
551
  }
552
  chipSelectHigh();
553
  return true;
554
}
555
 
556
/**
557
 * End a read multiple blocks sequence.
558
 *
559
 * \return true for success, false for failure.
560
 */
561
bool Sd2Card::readStop() {
562
  chipSelectLow();
563
  if (cardCommand(CMD12, 0)) {
564
    error(SD_CARD_ERROR_CMD12);
565
    chipSelectHigh();
566
    return false;
567
  }
568
  chipSelectHigh();
569
  return true;
570
}
571
 
572
/**
573
 * Set the SPI clock rate.
574
 *
575
 * \param[in] sckRateID A value in the range [0, 6].
576
 *
577
 * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum
578
 * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128
579
 * for \a scsRateID = 6.
580
 *
581
 * \return The value one, true, is returned for success and the value zero,
582
 * false, is returned for an invalid value of \a sckRateID.
583
 */
584
bool Sd2Card::setSckRate(uint8_t sckRateID) {
585
  if (sckRateID > 6) {
586
    error(SD_CARD_ERROR_SCK_RATE);
587
    return false;
588
  }
589
  spiRate_ = sckRateID;
590
  return true;
591
}
592
 
593
// wait for card to go not busy
594
bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) {
595
  uint16_t t0 = millis();
596
  while (spiRec() != 0XFF)
597
    if (((uint16_t)millis() - t0) >= timeoutMillis) return false;
598
 
599
  return true;
600
}
601
 
602
/**
603
 * Writes a 512 byte block to an SD card.
604
 *
605
 * \param[in] blockNumber Logical block to be written.
606
 * \param[in] src Pointer to the location of the data to be written.
607
 * \return true for success, false for failure.
608
 */
609
bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) {
610
  // use address if not SDHC card
611
  if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9;
612
  if (cardCommand(CMD24, blockNumber)) {
613
    error(SD_CARD_ERROR_CMD24);
614
    goto FAIL;
615
  }
616
  if (!writeData(DATA_START_BLOCK, src)) goto FAIL;
617
 
618
  // wait for flash programming to complete
619
  if (!waitNotBusy(SD_WRITE_TIMEOUT)) {
620
    error(SD_CARD_ERROR_WRITE_TIMEOUT);
621
    goto FAIL;
622
  }
623
  // response is r2 so get and check two bytes for nonzero
624
  if (cardCommand(CMD13, 0) || spiRec()) {
625
    error(SD_CARD_ERROR_WRITE_PROGRAMMING);
626
    goto FAIL;
627
  }
628
  chipSelectHigh();
629
  return true;
630
  FAIL:
631
  chipSelectHigh();
632
  return false;
633
}
634
 
635
/**
636
 * Write one data block in a multiple block write sequence
637
 * \param[in] src Pointer to the location of the data to be written.
638
 * \return true for success, false for failure.
639
 */
640
bool Sd2Card::writeData(const uint8_t* src) {
641
  chipSelectLow();
642
  // wait for previous write to finish
643
  if (!waitNotBusy(SD_WRITE_TIMEOUT) || !writeData(WRITE_MULTIPLE_TOKEN, src)) {
644
    error(SD_CARD_ERROR_WRITE_MULTIPLE);
645
    chipSelectHigh();
646
    return false;
647
  }
648
  chipSelectHigh();
649
  return true;
650
}
651
 
652
// send one block of data for write block or write multiple blocks
653
bool Sd2Card::writeData(uint8_t token, const uint8_t* src) {
654
  spiSendBlock(token, src);
655
 
656
  spiSend(0xFF);  // dummy crc
657
  spiSend(0xFF);  // dummy crc
658
 
659
  status_ = spiRec();
660
  if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) {
661
    error(SD_CARD_ERROR_WRITE);
662
    chipSelectHigh();
663
    return false;
664
  }
665
  return true;
666
}
667
 
668
/**
669
 * Start a write multiple blocks sequence.
670
 *
671
 * \param[in] blockNumber Address of first block in sequence.
672
 * \param[in] eraseCount The number of blocks to be pre-erased.
673
 *
674
 * \note This function is used with writeData() and writeStop()
675
 * for optimized multiple block writes.
676
 *
677
 * \return true for success, false for failure.
678
 */
679
bool Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) {
680
  // send pre-erase count
681
  if (cardAcmd(ACMD23, eraseCount)) {
682
    error(SD_CARD_ERROR_ACMD23);
683
    goto FAIL;
684
  }
685
  // use address if not SDHC card
686
  if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9;
687
  if (cardCommand(CMD25, blockNumber)) {
688
    error(SD_CARD_ERROR_CMD25);
689
    goto FAIL;
690
  }
691
  chipSelectHigh();
692
  return true;
693
  FAIL:
694
  chipSelectHigh();
695
  return false;
696
}
697
 
698
/**
699
 * End a write multiple blocks sequence.
700
 *
701
 * \return true for success, false for failure.
702
 */
703
bool Sd2Card::writeStop() {
704
  chipSelectLow();
705
  if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL;
706
  spiSend(STOP_TRAN_TOKEN);
707
  if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL;
708
  chipSelectHigh();
709
  return true;
710
  FAIL:
711
  error(SD_CARD_ERROR_STOP_TRAN);
712
  chipSelectHigh();
713
  return false;
714
}
715
 
716
#endif // SDSUPPORT