aboutsummaryrefslogtreecommitdiff
path: root/libraries/Robot_Control/SdCard.h
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/Robot_Control/SdCard.h')
-rw-r--r--libraries/Robot_Control/SdCard.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/libraries/Robot_Control/SdCard.h b/libraries/Robot_Control/SdCard.h
new file mode 100644
index 0000000..c03e6ab
--- /dev/null
+++ b/libraries/Robot_Control/SdCard.h
@@ -0,0 +1,192 @@
+/* Arduino FAT16 Library
+ * Copyright (C) 2008 by William Greiman
+ *
+ * This file is part of the Arduino FAT16 Library
+ *
+ * This Library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This Library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with the Arduino Fat16 Library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+#ifndef SdCard_h
+#define SdCard_h
+ /**
+ * \file
+ * SdCard class
+ */
+#include <SdInfo.h>
+//------------------------------------------------------------------------------
+// Warning only SD_CHIP_SELECT_PIN, the SD card select pin, may be redefined.
+// define hardware SPI pins
+#if defined(__AVR_ATmega168__)\
+||defined(__AVR_ATmega168P__)\
+||defined(__AVR_ATmega328P__)
+// 168 and 328 Arduinos
+/** Slave Select pin */
+uint8_t const SPI_SS_PIN = 10;
+/** Master Out Slave In pin */
+uint8_t const SPI_MOSI_PIN = 11;
+/** Master In Slave Out pin */
+uint8_t const SPI_MISO_PIN = 12;
+/** Serial Clock */
+uint8_t const SPI_SCK_PIN = 13;
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega1280__)\
+|| defined(__AVR_ATmega2560__)
+// pins for Arduino Mega
+uint8_t const SPI_SS_PIN = 53;
+uint8_t const SPI_MOSI_PIN = 51;
+uint8_t const SPI_MISO_PIN = 50;
+uint8_t const SPI_SCK_PIN = 52;
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega644P__)\
+|| defined(__AVR_ATmega644__)\
+|| defined(__AVR_ATmega1284P__)
+// pins for Sanguino
+uint8_t const SPI_SS_PIN = 4;
+uint8_t const SPI_MOSI_PIN = 5;
+uint8_t const SPI_MISO_PIN = 6;
+uint8_t const SPI_SCK_PIN = 7;
+//------------------------------------------------------------------------------
+#elif defined(__AVR_ATmega32U4__)
+// pins for Teensy 2.0
+uint8_t const SPI_SS_PIN = 8;
+uint8_t const SPI_MOSI_PIN = 16;
+uint8_t const SPI_MISO_PIN = 14;
+uint8_t const SPI_SCK_PIN = 15;
+//------------------------------------------------------------------------------
+#elif defined(__AVR_AT90USB646__)\
+|| defined(__AVR_AT90USB1286__)
+// pins for Teensy++ 1.0 & 2.0
+uint8_t const SPI_SS_PIN = 20;
+uint8_t const SPI_MOSI_PIN = 22;
+uint8_t const SPI_MISO_PIN = 23;
+uint8_t const SPI_SCK_PIN = 21;
+//------------------------------------------------------------------------------
+#else // SPI pins
+#error unknown CPU
+#endif // SPI pins
+//------------------------------------------------------------------------------
+/**
+ * SD Chip Select pin
+ *
+ * Warning if this pin is redefined the hardware SS pin will be enabled
+ * as an output by init(). An avr processor will not function as an SPI
+ * master unless SS is set to output mode.
+ *
+ * For example to set SD_CHIP_SELECT_PIN to 8 for the SparkFun microSD shield:
+ * uint8_t const SD_CHIP_SELECT_PIN = 8;
+ *
+ * The default chip select pin for the SD card is SS.
+ */
+uint8_t const SD_CHIP_SELECT_PIN = SPI_SS_PIN;
+//------------------------------------------------------------------------------
+/** command timeout ms */
+uint16_t const SD_COMMAND_TIMEOUT = 300;
+/** init timeout ms */
+uint16_t const SD_INIT_TIMEOUT = 2000;
+/** read timeout ms */
+uint16_t const SD_READ_TIMEOUT = 300;
+/** write timeout ms */
+uint16_t const SD_WRITE_TIMEOUT = 600;
+//------------------------------------------------------------------------------
+// error codes
+/** Card did not go into SPI mode */
+uint8_t const SD_ERROR_CMD0 = 1;
+/** Card did not go ready */
+uint8_t const SD_ERROR_ACMD41 = 2;
+/** Write command not accepted */
+uint8_t const SD_ERROR_CMD24 = 3;
+/** Read command not accepted */
+uint8_t const SD_ERROR_CMD17 = 4;
+/** timeout waiting for read data */
+uint8_t const SD_ERROR_READ_TIMEOUT = 5;
+/** write error occurred */
+uint8_t const SD_ERROR_WRITE_RESPONSE = 6;
+/** timeout waiting for write status */
+uint8_t const SD_ERROR_WRITE_TIMEOUT = 7;
+/** attempt to write block zero */
+uint8_t const SD_ERROR_BLOCK_ZERO_WRITE = 8;
+/** card returned an error to a CMD13 status check after a write */
+uint8_t const SD_ERROR_WRITE_PROGRAMMING = 9;
+/** invalid SPI speed in init() call */
+uint8_t const SD_ERROR_SPI_SPEED = 10;
+//------------------------------------------------------------------------------
+// SD command codes
+/** SEND OPERATING CONDITIONS */
+uint8_t const ACMD41 = 0X29;
+/** GO_IDLE_STATE - init card in spi mode if CS low */
+uint8_t const CMD0 = 0X00;
+/** SEND_CSD - Card Specific Data */
+uint8_t const CMD9 = 0X09;
+/** SEND_CID - Card IDentification */
+uint8_t const CMD10 = 0X0A;
+/** SEND_STATUS - read the card status register */
+uint8_t const CMD13 = 0X0D;
+/** READ_BLOCK */
+uint8_t const CMD17 = 0X11;
+/** WRITE_BLOCK */
+uint8_t const CMD24 = 0X18;
+/** APP_CMD - escape for application specific command */
+uint8_t const CMD55 = 0X37;
+//------------------------------------------------------------------------------
+/**
+ * \class SdCard
+ * \brief Hardware access class for SD flash cards
+ *
+ * Supports raw access to a standard SD flash memory card.
+ *
+ */
+class SdCard {
+ public:
+ /** Code for a SD error. See SdCard.h for definitions. */
+ uint8_t errorCode;
+ /** Data that may be helpful in determining the cause of an error */
+ uint8_t errorData;
+ uint32_t cardSize(void);
+ /**
+ * Initialize an SD flash memory card with default clock rate and chip
+ * select pin. See SdCard::init(uint8_t sckRateID, uint8_t chipSelectPin).
+ */
+ uint8_t init(void) {
+ return init(0, SD_CHIP_SELECT_PIN);
+ }
+ /**
+ * Initialize an SD flash memory card with the selected SPI clock rate
+ * and the default SD chip select pin.
+ * See SdCard::init(uint8_t slow, uint8_t chipSelectPin).
+ */
+ uint8_t init(uint8_t speed) {
+ return init(speed, SD_CHIP_SELECT_PIN);
+ }
+ uint8_t init(uint8_t speed, uint8_t chipselectPin);
+ uint8_t readBlock(uint32_t block, uint8_t* dst);
+ /** Read the CID register which contains info about the card.
+ * This includes Manufacturer ID, OEM ID, product name, version,
+ * serial number, and manufacturing date. */
+ uint8_t readCID(cid_t* cid) {
+ return readReg(CMD10, cid);
+ }
+ uint8_t writeBlock(uint32_t block, const uint8_t* src);
+ private:
+ uint8_t cardAcmd(uint8_t cmd, uint32_t arg);
+ uint8_t cardCommand(uint8_t cmd, uint32_t arg);
+ uint8_t chipSelectPin_;
+ uint8_t speed_;
+ void chipSelectHigh(void);
+ void chipSelectLow(void);
+ void error(uint8_t code, uint8_t data);
+ void error(uint8_t code);
+ uint8_t readReg(uint8_t cmd, void* buf);
+ uint8_t readTransfer(uint8_t* dst, uint16_t count);
+};
+#endif // SdCard_h