MF32BSP_XerolySkinner 2.0.0
C++版本的驱动库
载入中...
搜索中...
未找到
bsp_SD.cpp
浏览该文件的文档.
1/*----------------------------------------------------------------------------------------------------
2 #
3 # Copyright (c) 2022 Yuankang Liang(XerolySkinner)
4 #
5 # 本软件按原样提供,无任何明示或暗示
6 # 在任何情况下,作者都不承担任何损害赔偿责任
7 #
8 # 使用的许可声明:
9 # 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
10 # 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
11 # 并且版权声明和许可声明同时出现.
12 # 3. 你有使用,复制,修改,分发,和销售本软件的许可.
13 # 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
14 # 5. 本通知不得从任何来源删除或更改.
15 #
16 # Yuankang Liang(XerolySkinner)
17 # E-mail:zabbcccbbaz@163.com
18 # QQ:2715099320
19 # Mobile Phone:13005636215
20 #
21 # All rights reserved.
22 */
23
34#include "bsp_SD.h"
36//----------------------------------------------------------------------------------------------------
37// 程序
38//
44 HAL_GPIO_WritePin(GPIOx_CS, GPIO_Pin_CS, p == 0 ? GPIO_PIN_SET: GPIO_PIN_RESET);}
45//----------------------------------------------------------------------------------------------------
54 u8 r1;
55 u8 retry;
56 SD_CS(0);
57 __nop();
58 SD_CS(1);
59 do retry = spi_readwrite(DFF);while(retry != 0xFF);
60 spi_readwrite(cmd | 0x40);
61 spi_readwrite(arg >> 24);
62 spi_readwrite(arg >> 16);
63 spi_readwrite(arg >> 8);
64 spi_readwrite(arg);
65 spi_readwrite(crc);
66 if (cmd == CMD12) spi_readwrite(DFF);
67 do r1 = spi_readwrite(0xFF);while(r1 & 0X80);
68 return r1;}
69//----------------------------------------------------------------------------------------------------
75 u8 r1;
76 u8 buff[6] = {0};
77 u16 retry;
78 u8 i;
79 // MX_SPI3_Init();
80 SPI_setspeed(SPI_BAUDRATEPRESCALER_256);
81 SD_CS(0);
82 for (retry = 0; retry < 10; retry++) spi_readwrite(DFF);
83 // SD卡进入IDLE状态
84 do r1 = SD_sendcmd(CMD0, 0, 0x95);while(r1 != 0x01);
85 // 查看SD卡的类型
86 SD_TYPE = 0;
87 r1 = SD_sendcmd(CMD8, 0x1AA, 0x87);
88 if (r1 == 0x01) {
89 for (i = 0; i < 4; i++) buff[i] = spi_readwrite(DFF); //Get trailing return value of R7 resp
90 if (buff[2] == 0X01 && buff[3] == 0XAA) { //卡是否支持2.7~3.6V
91 retry = 0XFFFE;
92 do {
93 SD_sendcmd(CMD55, 0, 0X01); //发送CMD55
94 r1 = SD_sendcmd(CMD41, 0x40000000, 0X01); //发送CMD41
95 }while(r1 && retry--);
96 if (retry && SD_sendcmd(CMD58, 0, 0X01) == 0) { //鉴别SD2.0卡版本开始
97 for (i = 0; i < 4; i++) buff[i] = spi_readwrite(0XFF); //得到OCR值
98 if (buff[0] &0x40) SD_TYPE = V2HC;
99 else SD_TYPE = V2;}}
100 else {
101 SD_sendcmd(CMD55, 0, 0X01); //发送CMD55
102 r1 = SD_sendcmd(CMD41, 0, 0X01); //发送CMD41
103 if (r1 <= 1) {
104 SD_TYPE = V1;
105 retry = 0XFFFE;
106 do { //等待退出IDLE模式
107 SD_sendcmd(CMD55, 0, 0X01); //发送CMD55
108 r1 = SD_sendcmd(CMD41, 0, 0X01); //发送CMD41
109 }while(r1 && retry--);}
110 else { //MMC卡不支持CMD55+CMD41识别
111 SD_TYPE = MMC; //MMC V3
112 retry = 0XFFFE;
113 do r1 = SD_sendcmd(CMD1, 0, 0X01);while(r1 && retry--);} //等待退出IDLE模式
114 if (retry == 0 || SD_sendcmd(CMD16, 512, 0X01) != 0) SD_TYPE = ERR;} //错误的卡
115 }
116 SD_CS(0);
117 SPI_setspeed(SPI_BAUDRATEPRESCALER_2);
118 if (SD_TYPE) return 0;
119 else return 1;}
120//----------------------------------------------------------------------------------------------------
128 u8 r1;
129 SD_CS(1);
130 do {
131 r1 = spi_readwrite(0xFF);
132 __nop();
133 }while(r1 != 0xFE);
134 while (len--) {
135 *data = spi_readwrite(0xFF);
136 data++;}
137 spi_readwrite(0xFF);
138 spi_readwrite(0xFF);
139 return 0;}
140//----------------------------------------------------------------------------------------------------
148 u16 t;
149 u8 r1;
150 do r1 = spi_readwrite(0xFF);while(r1 != 0xFF);
151 spi_readwrite(cmd);
152 if (cmd != 0XFD) { //不是结束指令
153 for (t = 0; t < 512; t++) spi_readwrite(buf[t]); //提高速度,减少函数传参时间
154 spi_readwrite(0xFF); //忽略crc
155 spi_readwrite(0xFF);
156 t = spi_readwrite(0xFF); //接收响应
157 if ((t & 0x1F) != 0x05) return 2;} //响应错误
158 return 0;} //写入成功
159//----------------------------------------------------------------------------------------------------
165 u8 r1;
166 r1 = SD_sendcmd(CMD10, 0, 0x01); //读取CID寄存器
167 if (r1 == 0x00) r1 = SD_ReceiveData(cid_data, 16);
168 SD_CS(0);
169 if (r1) return 1;
170 else return 0;}
171//----------------------------------------------------------------------------------------------------
177 u8 r1;
178 r1 = SD_sendcmd(CMD9, 0, 0x01); //发CMD9命令,读CSD寄存器
179 if (r1 == 0) r1 = SD_ReceiveData(csd_data, 16); //接收16个字节的数据
180 SD_CS(0); //取消片选
181 if (r1) return 1;
182 else return 0;}
183//----------------------------------------------------------------------------------------------------
189 u8 csd[16];
190 u32 Capacity;
191 u8 n;
192 u16 csize;
193 //取CSD信息,如果期间出错,返回0
194 if (SD_GETCSD(csd) != 0) return 0;
195 //如果为SDHC卡,按照下面方式计算
196 if ((csd[0] &0xC0) == 0x40) { //V2.00的卡
197 csize = csd[9] + ((u16) csd[8] << 8) + 1;
198 Capacity = (u32)
199 csize << 10;} //得到扇区数
200 else { //V1.XX的卡
201 n = (csd[5] &15) + ((csd[10] &128) >> 7) + ((csd[9] &3) << 1) + 2;
202 csize = (csd[8] >> 6) + ((u16) csd[7] << 2) + ((u16) (csd[6] &3) << 10) + 1;
203 Capacity = (u32)
204 csize << (n - 9);} //得到扇区数
205 return Capacity;}
206//----------------------------------------------------------------------------------------------------
208 u8 r1;
209 u8 CSD_Tab[16];
210 u8 CID_Tab[16];
211 /* Send CMD9, Read CSD */
212 r1 = SD_sendcmd(CMD9, 0, 0xFF);
213 if (r1 != 0x00) return r1;
214 if (SD_ReceiveData(CSD_Tab, 16)) return 1;
215 /* Send CMD10, Read CID */
216 r1 = SD_sendcmd(CMD10, 0, 0xFF);
217 if (r1 != 0x00) return r1;
218 if (SD_ReceiveData(CID_Tab, 16)) return 2;
219 /* Byte 0 */
220 SD0_CardInfo->CSD.CSDStruct = (CSD_Tab[0] &0xC0) >> 6;
221 SD0_CardInfo->CSD.SysSpecVersion = (CSD_Tab[0] &0x3C) >> 2;
222 SD0_CardInfo->CSD.Reserved1 = CSD_Tab[0] &0x03;
223 /* Byte 1 */
224 SD0_CardInfo->CSD.TAAC = CSD_Tab[1];
225 /* Byte 2 */
226 SD0_CardInfo->CSD.NSAC = CSD_Tab[2];
227 /* Byte 3 */
228 SD0_CardInfo->CSD.MaxBusClkFrec = CSD_Tab[3];
229 /* Byte 4 */
230 SD0_CardInfo->CSD.CardComdClasses = CSD_Tab[4] << 4;
231 /* Byte 5 */
232 SD0_CardInfo->CSD.CardComdClasses |= (CSD_Tab[5] &0xF0) >> 4;
233 SD0_CardInfo->CSD.RdBlockLen = CSD_Tab[5] &0x0F;
234 /* Byte 6 */
235 SD0_CardInfo->CSD.PartBlockRead = (CSD_Tab[6] &0x80) >> 7;
236 SD0_CardInfo->CSD.WrBlockMisalign = (CSD_Tab[6] &0x40) >> 6;
237 SD0_CardInfo->CSD.RdBlockMisalign = (CSD_Tab[6] &0x20) >> 5;
238 SD0_CardInfo->CSD.DSRImpl = (CSD_Tab[6] &0x10) >> 4;
239 SD0_CardInfo->CSD.Reserved2 = 0; /* Reserved */
240 SD0_CardInfo->CSD.DeviceSize = (CSD_Tab[6] &0x03) << 10;
241 /* Byte 7 */
242 SD0_CardInfo->CSD.DeviceSize |= (CSD_Tab[7]) << 2;
243 /* Byte 8 */
244 SD0_CardInfo->CSD.DeviceSize |= (CSD_Tab[8] &0xC0) >> 6;
245 SD0_CardInfo->CSD.MaxRdCurrentVDDMin = (CSD_Tab[8] &0x38) >> 3;
246 SD0_CardInfo->CSD.MaxRdCurrentVDDMax = (CSD_Tab[8] &0x07);
247 /* Byte 9 */
248 SD0_CardInfo->CSD.MaxWrCurrentVDDMin = (CSD_Tab[9] &0xE0) >> 5;
249 SD0_CardInfo->CSD.MaxWrCurrentVDDMax = (CSD_Tab[9] &0x1C) >> 2;
250 SD0_CardInfo->CSD.DeviceSizeMul = (CSD_Tab[9] &0x03) << 1;
251 /* Byte 10 */
252 SD0_CardInfo->CSD.DeviceSizeMul |= (CSD_Tab[10] &0x80) >> 7;
253 SD0_CardInfo->CSD.EraseGrSize = (CSD_Tab[10] &0x7C) >> 2;
254 SD0_CardInfo->CSD.EraseGrMul = (CSD_Tab[10] &0x03) << 3;
255 /* Byte 11 */
256 SD0_CardInfo->CSD.EraseGrMul |= (CSD_Tab[11] &0xE0) >> 5;
257 SD0_CardInfo->CSD.WrProtectGrSize = (CSD_Tab[11] &0x1F);
258 /* Byte 12 */
259 SD0_CardInfo->CSD.WrProtectGrEnable = (CSD_Tab[12] &0x80) >> 7;
260 SD0_CardInfo->CSD.ManDeflECC = (CSD_Tab[12] &0x60) >> 5;
261 SD0_CardInfo->CSD.WrSpeedFact = (CSD_Tab[12] &0x1C) >> 2;
262 SD0_CardInfo->CSD.MaxWrBlockLen = (CSD_Tab[12] &0x03) << 2;
263 /* Byte 13 */
264 SD0_CardInfo->CSD.MaxWrBlockLen |= (CSD_Tab[13] &0xc0) >> 6;
265 SD0_CardInfo->CSD.WriteBlockPaPartial = (CSD_Tab[13] &0x20) >> 5;
267 SD0_CardInfo->CSD.ContentProtectAppli = (CSD_Tab[13] &0x01);
268 /* Byte 14 */
269 SD0_CardInfo->CSD.FileFormatGrouop = (CSD_Tab[14] &0x80) >> 7;
270 SD0_CardInfo->CSD.CopyFlag = (CSD_Tab[14] &0x40) >> 6;
271 SD0_CardInfo->CSD.PermWrProtect = (CSD_Tab[14] &0x20) >> 5;
272 SD0_CardInfo->CSD.TempWrProtect = (CSD_Tab[14] &0x10) >> 4;
273 SD0_CardInfo->CSD.FileFormat = (CSD_Tab[14] &0x0C) >> 2;
274 SD0_CardInfo->CSD.ECC = (CSD_Tab[14] &0x03);
275 /* Byte 15 */
276 SD0_CardInfo->CSD.CSD_CRC = (CSD_Tab[15] &0xFE) >> 1;
278 if (SD0_CardInfo->CardType == V2HC) {
279 /* Byte 7 */
280 SD0_CardInfo->CSD.DeviceSize = (u16) (CSD_Tab[8]) * 256;
281 /* Byte 8 */
282 SD0_CardInfo->CSD.DeviceSize += CSD_Tab[9];}
285 /* Byte 0 */
286 SD0_CardInfo->CID.ManufacturerID = CID_Tab[0];
287 /* Byte 1 */
288 SD0_CardInfo->CID.OEM_AppliID = CID_Tab[1] << 8;
289 /* Byte 2 */
290 SD0_CardInfo->CID.OEM_AppliID |= CID_Tab[2];
291 /* Byte 3 */
292 SD0_CardInfo->CID.ProdName1 = CID_Tab[3] << 24;
293 /* Byte 4 */
294 SD0_CardInfo->CID.ProdName1 |= CID_Tab[4] << 16;
295 /* Byte 5 */
296 SD0_CardInfo->CID.ProdName1 |= CID_Tab[5] << 8;
297 /* Byte 6 */
298 SD0_CardInfo->CID.ProdName1 |= CID_Tab[6];
299 /* Byte 7 */
300 SD0_CardInfo->CID.ProdName2 = CID_Tab[7];
301 /* Byte 8 */
302 SD0_CardInfo->CID.ProdRev = CID_Tab[8];
303 /* Byte 9 */
304 SD0_CardInfo->CID.ProdSN = CID_Tab[9] << 24;
305 /* Byte 10 */
306 SD0_CardInfo->CID.ProdSN |= CID_Tab[10] << 16;
307 /* Byte 11 */
308 SD0_CardInfo->CID.ProdSN |= CID_Tab[11] << 8;
309 /* Byte 12 */
310 SD0_CardInfo->CID.ProdSN |= CID_Tab[12];
311 /* Byte 13 */
312 SD0_CardInfo->CID.Reserved1 |= (CID_Tab[13] &0xF0) >> 4;
313 /* Byte 14 */
314 SD0_CardInfo->CID.ManufactDate = (CID_Tab[13] &0x0F) << 8;
315 /* Byte 15 */
316 SD0_CardInfo->CID.ManufactDate |= CID_Tab[14];
317 /* Byte 16 */
318 SD0_CardInfo->CID.CID_CRC = (CID_Tab[15] &0xFE) >> 1;
320 return 0;}
321//----------------------------------------------------------------------------------------------------
329u8 bsp_SD::SD_WriteDisk(u8 * buf, u32 sector, u8 cnt){
330 u8 r1;
331 if (SD_TYPE != V2HC) sector *= 512; //转换为字节地址
332 if (cnt == 1){
333 r1 = SD_sendcmd(CMD24, sector, 0X01); //读命令
334 if (r1 == 0) //指令发送成功
335 r1 = SD_SendBlock(buf, 0xFE);} //写512个字节
336 else {
337 if (SD_TYPE != MMC) {
338 SD_sendcmd(CMD55, 0, 0X01);
339 SD_sendcmd(CMD23, cnt, 0X01);} //发送指令
340 r1 = SD_sendcmd(CMD25, sector, 0X01); //连续读命令
341 if (r1 == 0) {
342 do {
343 r1 = SD_SendBlock(buf, 0xFC); //接收512个字节
344 buf += 512;}while(--cnt && r1 == 0);
345 r1 = SD_SendBlock(0, 0xFD);}} //接收512个字节
346 SD_CS(0); //取消片选
347 return r1;}
348//----------------------------------------------------------------------------------------------------
356u8 bsp_SD::SD_ReadDisk(u8 * buf, u32 sector, u8 cnt){
357 u8 r1;
358 if (SD_TYPE != V2HC) sector <<= 9; //转换为字节地址
359 if (cnt == 1) {
360 r1 = SD_sendcmd(CMD17, sector, 0X01); //读命令
361 if (r1 == 0) //指令发送成功
362 r1 = SD_ReceiveData(buf, 512);} //接收512个字节
363 else {
364 r1 = SD_sendcmd(CMD18, sector, 0X01); //连续读命令
365 do {
366 r1 = SD_ReceiveData(buf, 512); //接收512个字节
367 buf += 512;}
368 while(--cnt && r1 == 0);
369 SD_sendcmd(CMD12, 0, 0X01);} //发送停止命令
370 SD_CS(0); //取消片选
371 return r1;}
372//----------------------------------------------------------------------------------------------------
374 u8 Rxdata;
375 HAL_SPI_TransmitReceive(hspi, &Txdata, &Rxdata, 1, 0xFF);
376 return Rxdata;}
377//----------------------------------------------------------------------------------------------------
384 hspi->Init.BaudRatePrescaler = speed;}
385//----------------------------------------------------------------------------------------------------
393u8 bsp_SD::offsetWrite(u64 offset,u8* dat,u64 datlen) {
394 u8 sectorBuff[512] = { 0 };
395 u64 sectorBuffptr = 0;
396
397 u64 sectorSour = offset / 512; // 起始扇
398 u64 sectorSourlen = offset % 512; // 起始扇内位
399
400 // 填入数据
401 SD_ReadDisk(sectorBuff,sectorSour,1);
402 sectorBuffptr = sectorSourlen;
403 for (u64 i = 0; i < datlen; i++) {
404 // 写入数据
405 sectorBuff[sectorBuffptr] = dat[i];
406 sectorBuffptr++;
407 // 扇区回写
408 if (sectorBuffptr == 512 || i == datlen - 1) {
409 SD_WriteDisk(sectorBuff,sectorSour,1);
410 sectorBuffptr = 0;
411 sectorSour++;
412 if (i != datlen - 1)SD_ReadDisk(sectorBuff,sectorSour,1);}}
413 return 0;
414 }
415//----------------------------------------------------------------------------------------------------
423u8 bsp_SD::offsetRead(u64 offset,u8* dat,u64 datlen) {
424 u8 sectorBuff[512] = { 0 };
425 u64 sectorBuffptr = 0;
426
427 u64 sectorSour = offset / 512; // 起始扇
428 u64 sectorSourlen = offset % 512; // 起始扇内位
429
430 // 填入数据
431 SD_ReadDisk(sectorBuff,sectorSour,1);
432 sectorBuffptr = sectorSourlen;
433 for (u64 i = 0; i < datlen; i++) {
434 // 写入数据
435 dat[i]=sectorBuff[sectorBuffptr];
436 sectorBuffptr++;
437 // 扇区回写
438 if (sectorBuffptr == 512 || i == datlen - 1) {
439 sectorBuffptr = 0;
440 sectorSour++;
441 if (i != datlen - 1)SD_ReadDisk(sectorBuff,sectorSour,1);}}
442 return 0;}
444//----------------------------------------------------------------------------------------------------
445// 构造函数
446//
448 SPI_HandleTypeDef *hspi,
449 GPIO_TypeDef *GPIOx_CS,
450 uint16_t GPIO_Pin_CS){
454 bsp_SD::DFF=0xFF;
455 bsp_SD::SD_TYPE=0x00;}
操作SD卡的库
#define CMD23
Definition: bsp_SD.h:66
#define CMD9
Definition: bsp_SD.h:60
#define CMD24
Definition: bsp_SD.h:67
MSD_CARDINFO SD0_CardInfo
#define CMD41
Definition: bsp_SD.h:69
#define CMD18
Definition: bsp_SD.h:65
#define MSD_BLOCKSIZE
Definition: bsp_SD.h:54
#define CMD17
Definition: bsp_SD.h:64
#define ERR
Definition: bsp_SD.h:48
#define CMD55
Definition: bsp_SD.h:70
#define CMD12
Definition: bsp_SD.h:62
#define V2
Definition: bsp_SD.h:51
#define CMD0
Definition: bsp_SD.h:57
#define CMD58
Definition: bsp_SD.h:71
#define CMD16
Definition: bsp_SD.h:63
#define MMC
Definition: bsp_SD.h:49
#define CMD8
Definition: bsp_SD.h:59
#define CMD1
Definition: bsp_SD.h:58
#define V1
Definition: bsp_SD.h:50
#define V2HC
Definition: bsp_SD.h:52
#define CMD10
Definition: bsp_SD.h:61
#define CMD25
Definition: bsp_SD.h:68
u8 offsetWrite(u64 offset, u8 *dat, u64 datlen)
写入连贯的数据
Definition: bsp_SD.cpp:393
u8 offsetRead(u64 offset, u8 *dat, u64 datlen)
读取连贯的数据
Definition: bsp_SD.cpp:423
u8 SD_init(void)
初始化SD卡
Definition: bsp_SD.cpp:74
SPI_HandleTypeDef * hspi
Definition: bsp_SD.h:180
u8 SD_TYPE
Definition: bsp_SD.h:185
u8 SD_ReceiveData(u8 *data, u16 len)
读取SD卡指定长度信息
Definition: bsp_SD.cpp:127
u8 SD_GETCID(u8 *cid_data)
获取CID信息
Definition: bsp_SD.cpp:164
u8 SD_SendBlock(u8 *buf, u8 cmd)
向SD卡写入一个扇区
Definition: bsp_SD.cpp:147
void SD_CS(u8 p)
片选信号
Definition: bsp_SD.cpp:43
u8 spi_readwrite(u8 Txdata)
Definition: bsp_SD.cpp:373
uint16_t GPIO_Pin_CS
Definition: bsp_SD.h:182
void SPI_setspeed(u8 speed)
设置SPI的速率
Definition: bsp_SD.cpp:383
u32 SD_GetSectorCount(void)
获取SD卡的总扇区数
Definition: bsp_SD.cpp:188
u8 DFF
Definition: bsp_SD.h:184
u8 SD_ReadDisk(u8 *buf, u32 sector, u8 cnt)
读SD卡
Definition: bsp_SD.cpp:356
bsp_SD(SPI_HandleTypeDef *hspi, GPIO_TypeDef *GPIOx_CS, uint16_t GPIO_Pin_CS)
Definition: bsp_SD.cpp:447
MSD_CARDINFO SD0_CardInfo
Definition: bsp_SD.h:186
int MSD0_GetCardInfo(PMSD_CARDINFO SD0_CardInfo)
Definition: bsp_SD.cpp:207
u32 SD_sendcmd(u8 cmd, u32 arg, u8 crc)
写SD卡
Definition: bsp_SD.cpp:53
u8 SD_GETCSD(u8 *csd_data)
获取CSD信息
Definition: bsp_SD.cpp:176
GPIO_TypeDef * GPIOx_CS
Definition: bsp_SD.h:181
u8 SD_WriteDisk(u8 *buf, u32 sector, u8 cnt)
写SD卡
Definition: bsp_SD.cpp:329
u32 Capacity
Definition: bsp_SD.h:152
u8 CardType
Definition: bsp_SD.h:155
MSD_CSD CSD
Definition: bsp_SD.h:150
u32 BlockSize
Definition: bsp_SD.h:153
MSD_CID CID
Definition: bsp_SD.h:151
u32 ProdSN
Definition: bsp_SD.h:142
u8 Reserved1
Definition: bsp_SD.h:143
u16 ManufactDate
Definition: bsp_SD.h:144
u8 ManufacturerID
Definition: bsp_SD.h:137
u8 CID_CRC
Definition: bsp_SD.h:145
u8 Reserved2
Definition: bsp_SD.h:146
u32 ProdName1
Definition: bsp_SD.h:139
u16 OEM_AppliID
Definition: bsp_SD.h:138
u8 ProdRev
Definition: bsp_SD.h:141
u8 ProdName2
Definition: bsp_SD.h:140
u8 DeviceSizeMul
Definition: bsp_SD.h:114
u8 FileFormatGrouop
Definition: bsp_SD.h:125
u8 WrProtectGrEnable
Definition: bsp_SD.h:118
u8 RdBlockLen
Definition: bsp_SD.h:103
u8 MaxWrBlockLen
Definition: bsp_SD.h:121
u8 PermWrProtect
Definition: bsp_SD.h:127
u8 CopyFlag
Definition: bsp_SD.h:126
u8 ECC
Definition: bsp_SD.h:130
u8 ManDeflECC
Definition: bsp_SD.h:119
u16 CardComdClasses
Definition: bsp_SD.h:102
u8 EraseGrSize
Definition: bsp_SD.h:115
u8 Reserved4
Definition: bsp_SD.h:132
u8 WriteBlockPaPartial
Definition: bsp_SD.h:122
u8 WrSpeedFact
Definition: bsp_SD.h:120
u8 TempWrProtect
Definition: bsp_SD.h:128
u8 MaxWrCurrentVDDMin
Definition: bsp_SD.h:112
u8 Reserved1
Definition: bsp_SD.h:98
u8 CSDStruct
Definition: bsp_SD.h:96
u8 MaxWrCurrentVDDMax
Definition: bsp_SD.h:113
u8 MaxRdCurrentVDDMin
Definition: bsp_SD.h:110
u8 DSRImpl
Definition: bsp_SD.h:107
u8 EraseGrMul
Definition: bsp_SD.h:116
u8 PartBlockRead
Definition: bsp_SD.h:104
u8 MaxRdCurrentVDDMax
Definition: bsp_SD.h:111
u8 CSD_CRC
Definition: bsp_SD.h:131
u8 Reserved3
Definition: bsp_SD.h:123
u8 SysSpecVersion
Definition: bsp_SD.h:97
u8 WrProtectGrSize
Definition: bsp_SD.h:117
u8 ContentProtectAppli
Definition: bsp_SD.h:124
u8 WrBlockMisalign
Definition: bsp_SD.h:105
u32 DeviceSize
Definition: bsp_SD.h:109
u8 FileFormat
Definition: bsp_SD.h:129
u8 TAAC
Definition: bsp_SD.h:99
u8 RdBlockMisalign
Definition: bsp_SD.h:106
u8 MaxBusClkFrec
Definition: bsp_SD.h:101
u8 NSAC
Definition: bsp_SD.h:100
u8 Reserved2
Definition: bsp_SD.h:108
uint64_t u64
64位无符号数类型
Definition: varint.h:43
uint8_t u8
8位无符号数类型
Definition: varint.h:40
uint16_t u16
16位无符号数类型
Definition: varint.h:41
uint32_t u32
32位无符号数类型
Definition: varint.h:42