12 struct SDCardCSDSDV1 {
13 uint8 CSD_STRUCTURE : 2;
19 uint8 READ_BL_LEN : 4;
20 boolean READ_BL_PARTIAL : 1;
21 boolean WRITE_BLK_MISALIGN : 1;
22 boolean READ_BLK_MISALIGN : 1;
26 uint8 VDD_R_CURR_MIN : 3;
27 uint8 VDD_R_CURR_MAX : 3;
28 uint8 VDD_W_CURR_MIN : 3;
29 uint8 VDD_W_CURR_MAX : 3;
30 uint8 C_SIZE_MULT : 3;
31 boolean ERASE_BLK_EN : 1;
32 uint8 SECTOR_SIZE : 7;
33 uint8 WP_GRP_SIZE : 7;
34 boolean WP_GRP_ENABLE : 1;
37 uint8 WRITE_BL_LEN : 4;
38 boolean WRITE_BL_PARTIAL : 1;
40 uint8 FILE_FORMAT_GRP : 1;
42 boolean PERM_WRITE_PROTECT : 1;
43 boolean TMP_WRITE_PROTECT : 1;
44 uint8 FILE_FORMAT : 2;
51 struct SDCardCSDSDV2 {
52 uint8 CSD_STRUCTURE : 2;
58 uint8 PERM_WRITE_PROTECT : 1;
59 uint8 TMP_WRITE_PROTECT : 1;
63 typedef struct SDCardCSDSDV1 SDCardCSDSDV1;
64 typedef struct SDCardCSDSDV2 SDCardCSDSDV2;
68 #define SD_CARD_DEFAULT_FREQUENCY 350000
69 #define SD_CARD_INIT_FREQUENCY 350000
72 #define SD_CARD_FAST_FREQUENCY 12500000
75 #define SD_CARD_SYNCHRONIZE_WAIT 3
91 #define SD_CARD_MIN_VOLTAGE_RANGE 0x007C0000
93 #define SD_CARD_SECTOR_LEN 512
95 #define SD_CARD_ERASE_BLOCK_LEN 128
98 #define SD_CARD_HCS 0x40000000
101 #define SD_CARD_R1_OK 0x00
102 #define SD_CARD_R1_IDLE 0x01
103 #define SD_CARD_R1_ERASE_RST 0x02
104 #define SD_CARD_R1_ILLEGAL_CMD 0x04
105 #define SD_CARD_R1_CMD_CRC_ERROR 0x08
106 #define SD_CARD_R1_ERASE_SEQ_ERROR 0x10
107 #define SD_CARD_R1_ADDRESS_ERROR 0x20
108 #define SD_CARD_R1_PARAMETER_ERROR 0x40
111 #define SD_CARD_READ_TOKEN 0xFE
112 #define SD_CARD_WRITE_BLOCK_TOKEN 0xFE
113 #define SD_CARD_WRITE_DATA_TOKEN 0xFC
114 #define SD_CARD_STOP_TRANS_TOKEN 0xFD
115 #define SD_CARD_WRITE_RESPONSE_OK 0x05
118 #define SD_CARD_OCD_CCS_BIT 0x40000000
119 #define SD_CARD_OCD_POWER_ON_BIT 0x80000000
122 #define SD_CARD_TYPE_UNKNOWN 0
123 #define SD_CARD_TYPE_V1_SDSC 1
124 #define SD_CARD_TYPE_V2_SDSC 2
125 #define SD_CARD_TYPE_V2_SDHC_SDXC 3
128 #define SD_CARD_RESPONSE_OK 0
129 #define SD_CARD_RESPONSE_ERROR 1
130 #define SD_CARD_RESPONSE_WRPRT 2
131 #define SD_CARD_RESPONSE_NOTRDY 3
132 #define SD_CARD_RESPONSE_PARERR 4
137 SD_CARD_RESULT_OK = 0,
138 SD_CARD_RESULT_ERROR,
139 SD_CARD_RESULT_WRPRT,
140 SD_CARD_RESULT_NOTRDY,
141 SD_CARD_RESULT_PARERR,
142 SD_CARD_RESULT_BAD_CRC,
146 #define SD_CARD_CMD_TIMEOUT 10
147 #define SD_CARD_CMD_RETRY_TIMEOUT 3
148 #define SD_CARD_INIT_TIMEOUT 2
149 #define SD_CARD_IDLE_WAIT_TIMEOUT 4000
150 #define SD_CARD_READ_TIMEOUT 7500
151 #define SD_CARD_BUSY_TIMEOUT 1200000
154 #define SD_CARD_STATUS_OK 0x00
155 #define SD_CARD_STATUS_NOINIT 0x01
156 #define SD_CARD_STATUS_NO_RESPONSE 0x02
157 #define SD_CARD_STATUS_BAD_RESPONSE 0x04
158 #define SD_CARD_STATUS_PROTECT 0x08
159 #define SD_CARD_STATUS_NOT_SUPPORTED 0x10
163 #define SD_CARD_CMD0 (0x40+0)
164 #define SD_CARD_CMD1 (0x40+1)
165 #define SD_CARD_CMD8 (0x40+8)
166 #define SD_CARD_CMD9 (0x40+9)
167 #define SD_CARD_CMD10 (0x40+10)
168 #define SD_CARD_CMD12 (0x40+12)
169 #define SD_CARD_CMD16 (0x40+16)
170 #define SD_CARD_CMD17 (0x40+17)
171 #define SD_CARD_CMD18 (0x40+18)
172 #define SD_CARD_ACMD23 (0x40+23)
173 #define SD_CARD_CMD24 (0x40+24)
174 #define SD_CARD_CMD25 (0x40+25)
175 #define SD_CARD_ACMD41 (0x40+41)
176 #define SD_CARD_CMD55 (0x40+55)
177 #define SD_CARD_CMD58 (0x40+58)
181 #define SD_CARD_R1B 1
188 #define SD_CARD_CMD0_R SD_CARD_R1
189 #define SD_CARD_CMD1_R SD_CARD_R1
190 #define SD_CARD_CMD8_R SD_CARD_R7
191 #define SD_CARD_CMD9_R SD_CARD_R1
192 #define SD_CARD_CMD10_R SD_CARD_R1
193 #define SD_CARD_CMD12_R SD_CARD_R1B
194 #define SD_CARD_CMD16_R SD_CARD_R1
195 #define SD_CARD_CMD17_R SD_CARD_R1
196 #define SD_CARD_CMD18_R SD_CARD_R1
197 #define SD_CARD_ACMD23_R SD_CARD_R1
198 #define SD_CARD_CMD24_R SD_CARD_R1
199 #define SD_CARD_CMD25_R SD_CARD_R1
200 #define SD_CARD_ACMD41_R SD_CARD_R1
201 #define SD_CARD_CMD55_R SD_CARD_R1
202 #define SD_CARD_CMD58_R SD_CARD_R3
205 uint32 SDCardGetFrequency(
void);
206 uint8 SDCardInit(
void);
207 boolean SDCardWaitIdle(
boolean selectCard);
208 boolean SDCardReadCSDSDV2(SDCardCSDSDV2 *CSDStruct,
boolean selectCard);
209 boolean SDCardReadCSDSDV1(SDCardCSDSDV1 *CSDStruct,
boolean selectCard);
210 uint8 SDCardRecvSPI(
void);
211 boolean SDCardRecvDatablock(uint8 * buff, uint16 blockLen, uint16 * crcPtr,
boolean littleEndian);
212 boolean SDCardXmitDatablock(
const uint8 *buff, uint8 token);
213 boolean SDCardSendCmd(uint8 cmd, uint8 responseType, uint32 argument, uint8 * response,
boolean selectCard);
214 boolean SDCardSendAcmd(uint8 acmd, uint8 responseType, uint32 argument, uint8 * response,
boolean selectCard);
215 boolean SDCardSendCmdOnce(uint8 cmd, uint8 responseType, uint32 argument, uint8 * response,
boolean selectCard);
216 uint8 SDCardGetStatus(
void);
217 uint8 SDCardGetType(
void);
218 uint8 SDCardRead(uint8 *buff, uint32 sector, uint8 count) ;
219 uint8 SDCardWrite(
const uint8 *buff, uint32 sector, uint8 count);
220 boolean SDCardReadCSD(uint8 * CSDRaw,
boolean selectCard);
221 boolean SDCardProcessCSDSDV1(uint8 * CSDRaw, SDCardCSDSDV1 *CSDStruct);
222 boolean SDCardProcessCSDSDV2(uint8 * CSDRaw, SDCardCSDSDV2 *CSDStruct);