1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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
|