SD Card Interface class. Log raw data bytes to memory addresses of your choice, or format the card and use the FAT file system to write files.

Dependencies:   mbed

Committer:
Blaze513
Date:
Sat Jan 15 05:58:22 2011 +0000
Revision:
5:d85e20b6b904
Parent:
4:9a5878d316d5
Child:
6:ddf09d859ed7
Fixed CRC bug, can now run without CRCs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Blaze513 3:210eb67b260c 1 //mbed Microcontroller Library
Blaze513 3:210eb67b260c 2 //SDCard Interface
Blaze513 3:210eb67b260c 3 //Copyright 2010
Blaze513 3:210eb67b260c 4 //Thomas Hamilton
Blaze513 3:210eb67b260c 5
Blaze513 0:f3870f76a890 6 #ifndef SDCardLibrary
Blaze513 0:f3870f76a890 7 #define SDCardLibrary
Blaze513 0:f3870f76a890 8
Blaze513 0:f3870f76a890 9 #include "stdint.h"
Blaze513 0:f3870f76a890 10 #include "mbed.h"
Blaze513 1:94c648931f84 11 #include "FATFileSystem.h"
Blaze513 0:f3870f76a890 12
Blaze513 1:94c648931f84 13 class SDCard : private FATFileSystem
Blaze513 0:f3870f76a890 14 {
Blaze513 0:f3870f76a890 15 private:
Blaze513 0:f3870f76a890 16 SPI DataLines;
Blaze513 0:f3870f76a890 17 DigitalOut ChipSelect;
Blaze513 1:94c648931f84 18 //physical chip interface
Blaze513 0:f3870f76a890 19 unsigned char CommandCRCTable[256];
Blaze513 0:f3870f76a890 20 //CRC7 lookup table
Blaze513 0:f3870f76a890 21 unsigned char DataCRCTable[512];
Blaze513 5:d85e20b6b904 22 //CRC16 CCITT lookup table
Blaze513 0:f3870f76a890 23 unsigned char OCR[4];
Blaze513 4:9a5878d316d5 24 //operating conditions register
Blaze513 0:f3870f76a890 25 unsigned char CSD[16];
Blaze513 0:f3870f76a890 26 //card-specific data register
Blaze513 1:94c648931f84 27 unsigned char FSR[64];
Blaze513 1:94c648931f84 28 //function status register
Blaze513 0:f3870f76a890 29 bool Version;
Blaze513 0:f3870f76a890 30 //card version, low for 1, high for 2
Blaze513 0:f3870f76a890 31 bool Capacity;
Blaze513 0:f3870f76a890 32 //low for low-capacity, high for high-capacity
Blaze513 0:f3870f76a890 33 bool CRCMode;
Blaze513 0:f3870f76a890 34 //low to disable CRCs, high to enable CRCs
Blaze513 1:94c648931f84 35 unsigned int Timeout;
Blaze513 3:210eb67b260c 36 //timeout limit
Blaze513 1:94c648931f84 37 unsigned int t;
Blaze513 3:210eb67b260c 38 //timeout counter
Blaze513 5:d85e20b6b904 39 unsigned char Workspace[5];
Blaze513 5:d85e20b6b904 40 //all-purpose work area
Blaze513 0:f3870f76a890 41
Blaze513 1:94c648931f84 42 unsigned char Initialize();
Blaze513 1:94c648931f84 43 //complete all initialization operations
Blaze513 5:d85e20b6b904 44 void Command(unsigned char Index,
Blaze513 5:d85e20b6b904 45 unsigned int Argument, unsigned char* Response);
Blaze513 0:f3870f76a890 46 //sends command to the SD card
Blaze513 5:d85e20b6b904 47 void CommandCRC(unsigned char* IndexPtr,
Blaze513 5:d85e20b6b904 48 unsigned int* ArgumentPtr, unsigned char* Result);
Blaze513 5:d85e20b6b904 49 //calculates the SD card proprietary CRC7 result of an SD card
Blaze513 5:d85e20b6b904 50 //command, records one-byte solution in Result
Blaze513 5:d85e20b6b904 51 void DataCRC(unsigned short Length,
Blaze513 5:d85e20b6b904 52 unsigned char* Data, unsigned char* Result);
Blaze513 5:d85e20b6b904 53 //calculates the CRC16 result of the number of bytes in Data
Blaze513 5:d85e20b6b904 54 //given by Length and stores the two-byte solution in Result,
Blaze513 5:d85e20b6b904 55 //assumes DataCRCTable has already been calculated
Blaze513 5:d85e20b6b904 56 void GenerateCRCTable(unsigned char Size,
Blaze513 5:d85e20b6b904 57 unsigned long long Generator, unsigned char* Table);
Blaze513 5:d85e20b6b904 58 //pre-calculates CRC results for efficient checking, assumes
Blaze513 5:d85e20b6b904 59 //pre-allocated Table is large enough to hold the number of
Blaze513 5:d85e20b6b904 60 //bytes given in Size
Blaze513 0:f3870f76a890 61
Blaze513 1:94c648931f84 62 virtual unsigned char disk_initialize();
Blaze513 1:94c648931f84 63 virtual unsigned char disk_status();
Blaze513 5:d85e20b6b904 64 virtual unsigned char disk_read(unsigned char* buff,
Blaze513 5:d85e20b6b904 65 unsigned long sector, unsigned char count);
Blaze513 5:d85e20b6b904 66 virtual unsigned char disk_write(const unsigned char* buff,
Blaze513 5:d85e20b6b904 67 unsigned long sector, unsigned char count);
Blaze513 1:94c648931f84 68 virtual unsigned char disk_sync();
Blaze513 1:94c648931f84 69 virtual unsigned long disk_sector_count();
Blaze513 1:94c648931f84 70 virtual unsigned short disk_sector_size();
Blaze513 1:94c648931f84 71 virtual unsigned long disk_block_size();
Blaze513 1:94c648931f84 72 //FAT system virtual function definitions, called by FAT module
Blaze513 1:94c648931f84 73
Blaze513 0:f3870f76a890 74 public:
Blaze513 5:d85e20b6b904 75 SDCard(PinName mosi, PinName miso, PinName sck, PinName cs,
Blaze513 5:d85e20b6b904 76 const char* DiskName);
Blaze513 5:d85e20b6b904 77 //constructor requires SPI and DigitalOut pins, and a
Blaze513 5:d85e20b6b904 78 //directory name
Blaze513 3:210eb67b260c 79 virtual ~SDCard();
Blaze513 3:210eb67b260c 80 //destructor deallocates tables and workspace
Blaze513 1:94c648931f84 81 unsigned char Log(unsigned char Control, unsigned char Data);
Blaze513 5:d85e20b6b904 82 //multipurpose raw data-logging method with three modes
Blaze513 1:94c648931f84 83 //Control description
Blaze513 5:d85e20b6b904 84 // 0 synchronizes card and resets internal counter to
Blaze513 5:d85e20b6b904 85 // finalize I/O operations
Blaze513 5:d85e20b6b904 86 // 1 successively write input to a raw data byte in
Blaze513 5:d85e20b6b904 87 // order starting at address 0
Blaze513 5:d85e20b6b904 88 // 2 successively read and return a raw data byte in
Blaze513 5:d85e20b6b904 89 // order starting at address 0
Blaze513 4:9a5878d316d5 90 //return data from sync or write operations, and input
Blaze513 5:d85e20b6b904 91 //data of sync or read operations are stuff bits
Blaze513 1:94c648931f84 92 unsigned char Write(unsigned int Address, unsigned char* Data);
Blaze513 5:d85e20b6b904 93 //write single 512B sector to card at Address from Data
Blaze513 5:d85e20b6b904 94 unsigned char Write(unsigned int Address,
Blaze513 5:d85e20b6b904 95 unsigned char SectorCount, unsigned char* Data);
Blaze513 5:d85e20b6b904 96 //write SectorCount 512B sectors to card at Address from Data
Blaze513 1:94c648931f84 97 unsigned char Read(unsigned int Address, unsigned char* Data);
Blaze513 5:d85e20b6b904 98 //read single 512B sector from card at Address into Data
Blaze513 5:d85e20b6b904 99 unsigned char Read(unsigned int Address,
Blaze513 5:d85e20b6b904 100 unsigned char SectorCount, unsigned char* Data);
Blaze513 5:d85e20b6b904 101 //read SectorCount 512B sectors from card at Address into Data
Blaze513 1:94c648931f84 102 unsigned char SelectCRCMode(bool Mode);
Blaze513 5:d85e20b6b904 103 //toggle CRC mode; high for on or low for off, default is off
Blaze513 3:210eb67b260c 104 void SetTimeout(unsigned int Retries);
Blaze513 4:9a5878d316d5 105 //change the number of retries for interface functions;
Blaze513 4:9a5878d316d5 106 //increase if lines are unreliable; default is 1024
Blaze513 0:f3870f76a890 107 };
Blaze513 0:f3870f76a890 108
Blaze513 0:f3870f76a890 109 #endif