Soldered SD Card Arduino Library 1.0.0
Easily read and write files to and form the SD card breakout! A fork of the original SDFat library by Bill Greiman.
Loading...
Searching...
No Matches
SdSpiCard.h
Go to the documentation of this file.
1
29#ifndef SdSpiCard_h
30#define SdSpiCard_h
31#include "../SpiDriver/SdSpiDriver.h"
32#include "../common/SysCall.h"
33#include "SdCardInfo.h"
34#include "SdCardInterface.h"
35#include <stddef.h>
36//==============================================================================
41#if HAS_SDIO_CLASS
42class SdSpiCard : public SdCardInterface
43{
44#elif USE_BLOCK_DEVICE_INTERFACE
46{
47#else // HAS_SDIO_CLASS
48class SdSpiCard
49{
50#endif // HAS_SDIO_CLASS
51 public:
53 SdSpiCard()
54 {
55 }
60 bool begin(SdSpiConfig spiConfig);
62 void dbgClearStats();
64 void dbgPrintStats();
71 uint32_t sectorCount();
72#ifndef DOXYGEN_SHOULD_SKIP_THIS
73 // Use sectorCount(). cardSize() will be removed in the future.
74 uint32_t cardSize() __attribute__((deprecated))
75 {
76 return sectorCount();
77 }
78#endif // DOXYGEN_SHOULD_SKIP_THIS
91 bool erase(uint32_t firstSector, uint32_t lastSector);
97 bool eraseSingleSectorEnable();
102 void error(uint8_t code)
103 {
104 m_errorCode = code;
105 }
109 uint8_t errorCode() const
110 {
111 return m_errorCode;
112 }
114 uint32_t errorData() const
115 {
116 return m_status;
117 }
123 bool isBusy();
124
132 bool readSector(uint32_t sector, uint8_t *dst)
133 {
134#if ENABLE_DEDICATED_SPI
135 return readSectors(sector, dst, 1);
136#else // ENABLE_DEDICATED_SPI
137 return readSingle(sector, dst);
138#endif // ENABLE_DEDICATED_SPI
139 }
147 bool readSingle(uint32_t sector, uint8_t *dst);
156 bool readSectors(uint32_t sector, uint8_t *dst, size_t ns);
166 bool readCID(cid_t *cid)
167 {
168 return readRegister(CMD10, cid);
169 }
178 bool readCSD(csd_t *csd)
179 {
180 return readRegister(CMD9, csd);
181 }
188 bool readData(uint8_t *dst);
194 bool readOCR(uint32_t *ocr);
204 bool readStart(uint32_t sector);
209 bool readStatus(uint8_t *status);
214 bool readStop();
216 bool syncDevice();
220 uint8_t type() const
221 {
222 return m_type;
223 }
231 bool writeSector(uint32_t sector, const uint8_t *src)
232 {
233 if (m_sharedSpi)
234 {
235 return writeSingle(sector, src);
236 }
237 else
238 {
239 return writeSectors(sector, src, 1);
240 }
241 }
249 bool writeSingle(uint32_t sector, const uint8_t *src);
258 bool writeSectors(uint32_t sector, const uint8_t *src, size_t ns);
263 bool writeData(const uint8_t *src);
273 bool writeStart(uint32_t sector);
274
285 bool writeStart(uint32_t sector, uint32_t eraseCount);
290 bool writeStop();
292 void spiStart();
294 void spiStop();
295
296 private:
297 // private functions
298 uint8_t cardAcmd(uint8_t cmd, uint32_t arg)
299 {
300 cardCommand(CMD55, 0);
301 return cardCommand(cmd, arg);
302 }
303 uint8_t cardCommand(uint8_t cmd, uint32_t arg);
304 bool isTimedOut(SdMillis_t startMS, SdMillis_t timeoutMS);
305 bool readData(uint8_t *dst, size_t count);
306 bool readRegister(uint8_t cmd, void *buf);
307 void spiSelect()
308 {
309 sdCsWrite(m_csPin, false);
310 }
311 void type(uint8_t value)
312 {
313 m_type = value;
314 }
315 void spiUnselect()
316 {
317 sdCsWrite(m_csPin, true);
318 }
319 bool waitNotBusy(SdMillis_t timeoutMS);
320 bool writeData(uint8_t token, const uint8_t *src);
321
322#if SPI_DRIVER_SELECT < 2
323 void spiActivate()
324 {
325 m_spiDriver.activate();
326 }
327 void spiBegin(SdSpiConfig spiConfig)
328 {
329 m_spiDriver.begin(spiConfig);
330 }
331 void spiDeactivate()
332 {
333 m_spiDriver.deactivate();
334 }
335 uint8_t spiReceive()
336 {
337 return m_spiDriver.receive();
338 }
339 uint8_t spiReceive(uint8_t *buf, size_t n)
340 {
341 return m_spiDriver.receive(buf, n);
342 }
343 void spiSend(uint8_t data)
344 {
345 m_spiDriver.send(data);
346 }
347 void spiSend(const uint8_t *buf, size_t n)
348 {
349 m_spiDriver.send(buf, n);
350 }
351 void spiSetSckSpeed(uint32_t maxSck)
352 {
353 m_spiDriver.setSckSpeed(maxSck);
354 }
355 SdSpiDriver m_spiDriver;
356#else // SPI_DRIVER_SELECT < 2
357 void spiActivate()
358 {
359 m_spiDriverPtr->activate();
360 }
361 void spiBegin(SdSpiConfig spiConfig)
362 {
363 m_spiDriverPtr->begin(spiConfig);
364 }
365 void spiDeactivate()
366 {
367 m_spiDriverPtr->deactivate();
368 }
369 uint8_t spiReceive()
370 {
371 return m_spiDriverPtr->receive();
372 }
373 uint8_t spiReceive(uint8_t *buf, size_t n)
374 {
375 return m_spiDriverPtr->receive(buf, n);
376 }
377 void spiSend(uint8_t data)
378 {
379 m_spiDriverPtr->send(data);
380 }
381 void spiSend(const uint8_t *buf, size_t n)
382 {
383 m_spiDriverPtr->send(buf, n);
384 }
385 void spiSetSckSpeed(uint32_t maxSck)
386 {
387 m_spiDriverPtr->setSckSpeed(maxSck);
388 }
389 SdSpiDriver *m_spiDriverPtr;
390#endif // SPI_DRIVER_SELECT < 2
391#if ENABLE_DEDICATED_SPI
392 static const uint8_t IDLE_STATE = 0;
393 static const uint8_t READ_STATE = 1;
394 static const uint8_t WRITE_STATE = 2;
395 uint32_t m_curSector;
396 uint8_t m_curState;
397 bool m_sharedSpi = true;
398#else // ENABLE_DEDICATED_SPI
399 static const bool m_sharedSpi = true;
400#endif // ENABLE_DEDICATED_SPI
401 SdCsPin_t m_csPin;
402 uint8_t m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED;
403 bool m_spiActive;
404 uint8_t m_status;
405 uint8_t m_type = 0;
406};
407#endif // SdSpiCard_h
const uint8_t CMD55
Definition SdCardInfo.h:159
const uint8_t CMD9
Definition SdCardInfo.h:134
union csd_t __attribute__
const uint8_t CMD10
Definition SdCardInfo.h:136
uint8_t SdCsPin_t
Definition SdFatConfig.h:139
static void dbgClearStats()
Definition SdSpiCard.cpp:63
static void dbgPrintStats()
Definition SdSpiCard.cpp:110
void sdCsWrite(SdCsPin_t pin, bool level)
Definition SdSpiChipSelect.cpp:34
static bool cardCommand(uint32_t xfertyp, uint32_t arg)
Definition SdioTeensy.cpp:423
static uint8_t m_errorCode
Definition SdioTeensy.cpp:173
static bool cardAcmd(uint32_t rca, uint32_t xfertyp, uint32_t arg)
Definition SdioTeensy.cpp:418
uint16_t SdMillis_t
Definition SysCall.h:41
BlockDeviceInterface class.
Definition BlockDeviceInterface.h:39
Abstract interface for an SD card.
Definition SdCardInterface.h:34
Optimized SPI class for access to SD and SDHC flash memory cards.
Definition SdSpiArduinoDriver.h:40
void activate()
Definition SdSpiArtemis.cpp:28
Raw access to SD and SDHC flash memory cards via SPI protocol.
SPI card configuration.
Definition SdSpiDriver.h:112
static bool value
Definition DigitalPin.h:210
Union of old and new style CSD register.
Definition SdCardInfo.h:454