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.
SDCard.h@5:d85e20b6b904, 2011-01-15 (annotated)
- 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?
User | Revision | Line number | New 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 |