SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口中:SD模式接口和SPI接口。SD卡在上电初期,卡主控通过检测引脚1(DAT3)来决定使用SD模式还是SPI模式。当此脚接50KOhm上拉电阻时,卡进入SD模式;当此脚为低电平,卡则工作于SPI模式。
SD/MMC卡 内部寄存器
SD Card Registers
Name Width Description
CID 128 Card identification number: individual card number for identification.
RCA 16 Relative card address
CSD 128 Card specific data: information about the card operation conditions.
SCR 64 SD Configuration Register: information about the SD Card’s special features capabilities.
OCR 32 Operation Condition Register
SD 卡寄存器
名称 宽度 描述
CID 128 卡的识别码:用于识别单个卡的编号。
RCA 16 卡的相对地址(这个寄存器在 SPI 模式下不可用)
CSD 128 卡的特性数据:是关于这个卡工作条件的相关信息。
SCR 64 SD配置寄存器:关于这个SD卡的特殊功能的特性信息。
OCR 32 工作条件寄存器(电压)
Card Identification Register(CID)
这个 CID 寄存器有 16 字节长,如表 3-9 所示,它包含了本卡的特别识别码(ID 号)。 这些信息是在卡的生产期间被
编程(烧录),主控制器不 能修改它们的内容。 注意:SD卡的 CID 寄存器和 MMC 卡的 CID 寄存器在记录结构上是不同的。
Name |
Type |
Width |
CID Slice |
Comments |
CID Value |
Manufacturer ID (MID) | Binary | 8 | [127:120] | 由“SD卡协会“控制并且分配的制造商ID号 | 0x03 |
OEM/Application ID (OID) | ASCII | 16 | [119:104] | 用于辨认卡的OEM 和/或 卡的内容ID号 | ‘SD’ |
Product Name(PNM) | ASCII | 40 | [103:64] | SD128, SD064, SD032, SD016, SD008 | |
Product Revision (PRV) | BCD | 8 | [63:56] | 两个二进制编码的十进制数字(BCD) | 产品修订号 |
Serial Number (PSN) | Binary | 32 | [55:24] | 32 位无符号整数 | 产品序列号 |
Reserved | 4 | [23:20] | 保留 | ||
Manufacture Date Code(MDT) | BCD | 12 | [19:8] | 生产日期格式:2001年4月 = 0x014 | |
CRC7 checksum(CRC) | Binary | 7 | [7:1] | CRC 校验值 | CRC7 |
Reserved,always ‘1’ | 1 | [0:0] | 这部分没有使用,值始终为“1” |
CRC Calculation: G(x) = x7+3+1
M(x) = (MID-MSB)*x119 + ... + (CIN-LSB)*x0
CRC[6...0] = Remainder[(M(x)*x7)/G(x)]
Card Specific Data Register(CSD)
此卡的描述数据寄存器(CSD)包含了访问该卡数据时的必要配置信息。
“cell type”栏内定义了CSD的区域是只读(R)、一次编程(R/W)或可擦除的(R/W/E)[“R/W”是指可以多次擦写,
“R/W(1)”是指只能一次写入,不可擦除]。该张表中所显示的值都对应真实的CSD结构中的各自区域和编码。CSD区域
的样式是依照栏标记(和一个复选标记√)的样式。注意SD卡内的 CSD寄存器和MultiMedia卡的CSD寄存器有着不同的结构。
Name |
Field |
Width |
Cell Type |
CSD-Slice |
CSD Value |
CSD Code |
CSD structure | CSD_STRUCTURE | 2 | R | [127:126] | 1.0 | 00b |
Reserved | - | 6 | R | [125:120] | - | 000000b |
data read access time | TAAC | 8 | R | [119:112] | 1.5msec | 00100110b |
同上in CLK cycles | NSAC | 8 | R | [111:104] | 0 | 00000000b |
max.data transfer rate | TRAN_SPEEN | 8 | R | [103:96] | 25MHz | 00110010b |
card command classes | CCC | 12 | R | [95:84] | ALL | 1F5h |
max.read data block length | READ_BL_LEN | 4 | R | [83:80] | 512Byte | 1001b |
partial blocks for read allowed | READ_BL_PARTIAL | 1 | R | [79:79] | YES | 1b |
write block misalignment | WRITE_BLK_MISALIGN | 1 | R | [78:78] | NO | 0b |
read block misalignment | READ_BLK_MISALIGN | 1 | R | [77:77] | NO | 0b |
DSR implemented | DSR_IMP | 1 | R | [76:76] | NO | 0b |
Reserved | - | 2 | R | [75:74] | - | 00b |
device size | C_SIZE | 12 | R | [73:62] | 如下 | - |
max.read current @vdd min | VDD_R_CURR_MIN | 3 | R | [61:59] | 100mA | 111b |
max.read current @VDD max | VDD_R_CURR_MAX | 3 | R | [58:56] | 80mA | 110b |
max.wirte current @VDD min | VDD_W_CURR_min | 3 | R | [55:53] | 100mA | 111b |
max.write current @VDD max | VDD_W_CURR_MAX | 3 | R | [52:50] | 80mA | 110b |
device size multiplier | C_SIZE_MULT | 3 | R | [49:47] | 如下 | - |
erase single block enable | ERASE_BLK_EN | 1 | R | [46:46] | YES | 1b |
erase sector size | SECTOR_SIZE | 7 | R | [45:39] | 32blocks | 00111111b |
write protect group size | WP_GRP_SIZE | 7 | R | [38:32] | 128sectors | 11111111b |
write protect group enable | WP_GRP_EN | 1 | R | [31:31] | YES | 1b |
Rserved for MultiMediaCard | 2 | R | [30:29] | - | 00b | |
write speed factor | R2W_FACTOR | 3 | R | [28:26] | X16 | 100b |
max.write data block length | WRITE_BL_LEN | 4 | R | [25:22] | 512Byte | 1001b |
Reserved | - | 5 | R | [20:16] | - | 0000b |
file format group | FILE_FORMAT_GRP | 1 | R/W(1) | [15:15] | 0 | 0b |
copy flag(OTP) | COPY | 1 | R/W(1) | [14:14] | Not Original | 1b |
permanent write protection | PERM_WRITE_PROTECT | 1 | R/W(1) | [13:13] | Not Protected | 0b |
temporary write protection | TMP_WRITE_PROTECT | 1 | R/W | [12:12] | Not Protected | 0b |
File format | FILE_FORMAT | 2 | R/W(1) | [11:10] | HD w/partition | 00b |
Reserved | - | 2 | R/W | [9:8] | - | 00b |
CRC | CRC | 7 | R/W | [7:1] | - | CRC7 |
not used, always’1’ | - | 1 | - | [0:0] | - | 1b |
CSD_STRUCTURE :描述 CSD 结构的版本。00:CSD version No. 1.0 其他保留
TAAC 定义这个异步部分的读操作时间(相对于SD 卡的时钟(CLK))。
TAAC Bit Position Code 备注
2:0 time unit 0=1ns, 1=10ns, 2=100ns, 3=1μs, 4=10μs, 5=100μs, 6=1ms, 7=10ms 时间单位
6:3 time value 0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, 8=3.5, 时间数值
9=4.0, A=4.5, B=5.0, C=5.5, D=6.0, E=7.0, F=8.0
7 Reserved 保留
NSAC 定义了时钟的相关特性在最差情况下的数据访问时间。它的单位是100 个时钟周期。所以,该时钟的相关部分所确定的读访问时间的最大值是25.5K
(255*100)个时钟周期。
min [ { { ( TAAC*f ) + (NSAC*100)}*1/8 }, { (100ms * f ) * 1/8 } ]
where units = (8 clocks) and “ f ” is the clock frequency.
TRAN_SPEED定义最大的数据传送速率。
TRAN_SPEED Bit Code
2:0 transfer rate unit 0 = 100kbit / s, 1 = 1Mbit / s, 2 = 10Mbit / s, 3 = 100Mbit / s, 4... 7 = reserved
6:3 time value 0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, 8=3.5, 9=4.0, A=4.5,
B=5.0, C=5.5, D=6.0, E=7.0, F=8.0
CCC 是该卡命令规定的子集(命令类别),定义了这个卡所能支持的命令类别。在CCC 中的一个位的值为“1”则意味着对应的命令类别是可以支持的。
READ_BL_LEN 是最大的可读取数据块长度是用2^READ_BL_LEN 来计算的。所以,这个最大块长度是在512...2048 字节的范围内。注意:在SD 卡中,
WRITE_BL_LEN 总是等于 READ_BL_LEN 的。
READ_BL_PARTIAL 在 SD 卡中总是为1。块的部分读取在SD 卡上总是被允许的。它意味着可以使用适当小的块。块最小可以小为1 个字节。
READ_BL_PARTIAL = 0 意味着块大小只能使用READ_BL_LEN 的大小来做数据传送。
READ_BL_PARTIAL = 1 意味着可以使用小的块。最小的块将等于最小的地址单元(一个字节)。
WRITE_BLK_MISALIGN 定义是否可以用一条写入命令来涵盖存储器设备上多于一个物理块。这个块的大小定义在WRITE_BL_LEN 中。
WRITE_BLK_MISALIGN = 0 表示跨过物理块的界线是不允许的。
WRITE_BLK_MISALIGN = 1 表示跨过物理块的界线是被允许的。
READ_BLK_MISALIGN 定义是否可以用一条读取命令来涵盖存储器设备上多于一个物理块。这个块的大小定义在READ_BL_LEN 中。
READ_BLK_MISALIGN = 0 表示跨过物理块的界线是不允许的。
READ_BLK_MISALIGN = 1 表示跨过物理块的界线是被允许的。
DSR_IMP 定义卡上是否集成了可配置的驱动级。如果被设置了,一个驱动级寄存器(DSR)必须是可用的。(DSR_IMP = 0 没有可用的SDR
C_SIZE(设备大小) 这个参数用于计算卡的容量(不包括安全保护区域)。卡的存储容量是通过C_SIZE、C_SIZE_MULT 和READ_BL_LEN 来计算
的,请看这个公式:
存储器容量 = BLOCKNR * BLOCK_LEN = (C_SIZE+1)*2^(C_SIZE_MULT+2)*2^(READ_BL_LEN)
而那些参数是:
BLOCKNR = (C_SIZE+1) * MULT
MULT = 2^(C_SIZE_MULT+2)
BLOCK_LEN = 2^(READ_BL_LEN)
因此,最大的容量可以编码为:4096*512*2048 = 4 GByte。举例来说:4 MByte 的卡BLOCK_LEN = 512 可以编码为C_SIZE_MULT = 0
和C_SIZE = 2047。
READ_BL_LEN 是最大的可读取数据块长度是用2^READ_BL_LEN 来计算的。所以,这个最大块长度是在512...2048 字节的范围内。注意:在SD 卡中,
WRITE_BL_LEN 总是等于 READ_BL_LEN 的。
VDD_R_CURR_MIN, VDD_W_CURR_MIN 是在最小限度的电压供应下,读取和写入操作所需求的最大电流值。
VDD_R_CURR_MAX, VDD_W_CURR_MAX 是在最大电压供应下,读取和写入操作需求的最大电流值。
C_SIZE_MULT (设备大小的乘数) 这个参数用来表示MULT,用于计算设备的容量大小(参考“C_SIZE”)。MULT 定义为2^(C_SIZE_MULT+2)。
ERASE_BLK_EN 定义擦除一个可写块(参见WRITE_BL_LEN)是否为允许的(即除了下面给出的SECTOR_SIZE 之外)。
ERASE_BLK_EN = 0 主控制器只能擦除一个SECTOR_SIZE 单元。
ERASE_BLK_EN = 1 主控制器可以擦除一个SECTOR_SIZE 单元或一个WRITE_BLK_LEN 单元。
SECTOR_SIZE 这个可擦除扇区的大小。这个寄存器是一个7 位的二进制编码值,定义了可写块的数量(参阅WRITE_BL_LEN)。实际大小是这个数量加上1。
一个0 意味着 1 个可写块,127 是128 个可写块。
WP_GRP_SIZE 这个写保护组的大小。这个寄存器是一个7 位的二进制编码值,定义可擦除组的数量(参阅SECTOR_SIZE)。实际大小是这个数量加上1。
一个0 意味着 1 个可擦除组,127 是128 个可擦除组。
WP_GRP_ENABLE 一个“0”表示没有写保护组存在,“1”则相反。
R2W_FACTOR 将典型的块编程(烧录)时间定义为读取访问时间的倍数.
R2W_FACTOR Multiples of Read Access Time 备注
0 1
1 2 (write half as fast as read) 半个快速写和读取一样
2 4
3 8
4 16
5 32
6, 7 Reserved 保留
WRITE_BL_LEN 这个最大的写入数据块长度是用2^WRITE_BL_LEN 来计算的。这个最大的块长度的范围可以是512 到2048 字节。当写入块的长度设定为
512 时总是被支持的(即SD 卡系统的默认值)。注意:在SD 卡中,WRITE_BL_LEN 总是等于READ_BL_LEN 的。
WRITE_BL_PARTIAL 定义了“块写入”命令是否能用于不完整的块。
WRITE_BL_PARTIAL = 0 意味着块的大小只能是 WRITE_BL_LEN,和它相关联的部分(partial)必须是512 个单元的块,能用于块索引数据的写入。
WRITE_BL_PARTIAL = 1 意味着设置很小的块也能使用。最小的块大小是 1 个字节。
FILE_FORMAT_GROUP 指示被选中组件的文件格式。这个区域是ROM,只能读取.
FILE_FORMAT_GRP FILE_FORMAT Type 备注
0 0 Hard disk-like file system with partition table 有分配表,类似硬盘的文件系统
0 1 DOS FAT (floppy-like) with boot sector only (no partition table) 只有启动扇区DOS FAT(类似软盘)(没有分配表)
0 2 Universal File Format 通用文件格式
0 3 Others/Unknown 其它的/未知的
1 0, 1, 2, 3 Reserved 保留
COPY 这个位标志此卡是否为原创(0)或非原创(1)。一旦设置为非原创,这个位不能重置成原创。“原创”和“非原创”的定义是由应用程序来确定和
修改的,并非卡的特性。
PERM_WRITE_PROTECT 永久地保护该卡上除了安全保护区域内的所有内容,禁止改写或擦除(该卡所有的写入和擦除命令都无效了)。它的缺省值为“0”,
也就是没有永久性地写入保护。这个特性位只能写入一次,因此它可以用来将SD 卡设置成只读的ROM,而使用者无法改写其中的内容。
TMP_WRITE_PROTECT 临时性地保护该卡上除了安全保护区域内的所有内容,后期可以改写或擦除(该卡所有的写入和擦除命令是临时失效)。该位可以被
设置和重置。它的缺省值为“0”,也就是没有写入保护。
FILE_FORMAT 说明了该卡上的文件格式。这个区域是ROM,只能读取。定义同FILE_FORMAT_GROUP
CRC 这个 CRC 区域带有CSD 内容的校验和。这个校验和在主控制器对CSD 做任何修改后肯定会重新计算。缺省值符合CSD 初始化时候的内容。
SD card Configuration Register (SCR)
除了 CSD 寄存器外,还有一个配置寄存器的名字是:SD 卡配置寄存器(SCR)。SCR 提供了SD 卡的一些特殊特性在这张卡内。它的大小是64 位。这个
寄存器内容由制造商在生产厂内设置。
Description Field Width Cell Type SCR
4 R 0
4 R 0
1 R 0 0
3 R 2
4 R 5
- 16 R 0 0
- 32 R 0 0
Description |
Field |
Width |
Cell Type |
SCR Slice |
SCR Value |
SCR Code |
SCR Structure | SCR_STRUCTURE | 4 | R | [63:60] | V1.0 | 0 |
SD Card—Spec. Version | SD_SPEC | 4 | R | [59:56] | V1.01 | 0 |
data_status_after erases | DATA_STAT_AFTER_ERASE | 1 | R | [55:55] | 0 | 0 |
SD Security Support | SD_SECURITY | 3 | R | [54:52] | Prot 2, Spec V1.01 | 2 |
DAT Bus widths supported | SD_BUS_WIDTHS | 4 | R | [51:48] | 1 & 4 | 5 |
Reserved | - | 1 | R | [47:32] | 0 | 0 |
Reserved for manufacturer usage | - | 3 | R | [31:0] | 0 | 0 |
SCR_STRUCTURE 关于SD卡内的物理级说明中SCR结构的版本号。
SD_SPEC描述这张SD卡在物理级上所支持的说明版本。
DATA_STAT_AFTER_ERASE 定义了数据在擦除后的状态。是“0”或“1”中的任何一个(这要依赖卡的供应商)。
SD_SECURITY 描述了该卡所支持的安全算法。0:无 1:安全协议1.0 安全说明版本 0.96 2:安全协议2.0 安全说明版本 1.0 - 1.01。其他保留
SD_BUS_WIDTHS描述该卡所支持的所有数据总线宽度。从SD 卡支持最少1 位或4 位宽度这两种总线模式开始,任何SD 卡都将最少要设置0 和2 这两个位
(即SD_BUS_WIDTH = 0101 )。1.4位保留
Operating Conditions Register (OCR)
这个 32 位的工作条件寄存器储存了卡的 VDD 电压轮廓图。任何标准的 SD 卡主控制器可以使用 2V 至 3.6V 的工作电压
来让 SD 卡能执行这个电压识别操作(CMD1)。而访问存储器的阵列操作无论如何都需要 2.7V 至 3.6V 的工作电压。
OCR 寄存器显示了在访问卡的数据时所需要的电压范围。OCR 寄存器的结构描述:
位 |
电压 |
位 |
电压 |
0 | Reserved | 16 | 2.8-2.9 |
1 | Reserved | 17 | 2.9-3.0 |
2 | Reserved | 18 | 3.0-3.1 |
3 | Reserved | 19 | 3.1-3.2 |
4 | 1.6-1.7 | 20 | 3.2-3.3 |
5 | 1.7-1.8 | 21 | 3.3-3.4 |
6 | 1.8-1.9 | 22 | 3.4-3.5 |
7 | 1.9-2.0 | 23 | 3.5-3.6 |
8 | 2.0-2.1 | 24 | Reserved |
9 | 2.1-2.2 | 25 | Reserved |
10 | 2.2-2.3 | 26 | Reserved |
11 | 2.3-2.4 | 27 | Reserved |
12 | 2.4-2.5 | 28 | Reserved |
13 | 2.5-2.6 | 29 | Reserved |
14 | 2.6-2.7 | 30 | Reserved |
15 | 2.7-2.8 | 31 | 上电时的状态位(0:忙) |
3, SD/MMC卡 SPI模式下命令集
NOTE:
1) class1,class3,class9:SPI模式不支持!
2) 继SD1.1之后又推出了SD2.0,主要特性是支持更大容量。SD1.1中卡容量存放于CSD寄存器中,
而由于其规范中相关域的值较小,固最大只能表示2G地址。随着Nand容量的大大提高,
SD1.1已经不适合潮流,因而推出了SD2.0。
初始化流程大同小义,只需要CMD0之后再加上CMD8命令的识别。SD1.1不支持CMD8,
而SD2.0的CMD8能读到卡的接口信息。如果卡响应CMD8为无效命令,则走SD1.1的流程,
可能是SD1.1或MMC。如CMD8响应正确,则很可能是SD2.0了。
3) SD卡具有安全加密功能,内置128bit加密位,在加密状态下,用户需提供密码才可以访问卡内的数据。
在卡上电时,若卡包含密码,卡自动进入锁定状态,读写命令均返回错误,以保护卡内容不被读出及修改。
密码设置功能由CMD42实现,其数据包中包括该命令中所有的信息。
Byte Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
0 Erase Card Lock/UnLock ClrPwd SetPwd
1 Psw_Length
2 Pwd Data
.
.
.PwdLen+1
擦除:此位置1时,卡的密码和内容会被强制擦除,在遗忘密码时可使用此功能。
锁定/解锁:此位置1时,表示命令结束后状态为锁定,为0,表示卡解锁。
清除密码:此位置1,表示清除卡的旧密码,此时数据中必须包含旧密码的正确内容。
加密:此位置1,表示设置卡的新密码,数据中必须包含新密码内容;更改密码时,新密码紧跟随旧密码内容。
在任意刻,主机可以通过CMD13命令读取卡的内部状态,判断其锁定状态。bit0置1表示卡处于锁定状态。
1、设置密码
使用CMD16设置Block长度为密码长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x01,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
2、清除密码
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x02,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
3、卡的锁定、解锁
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x04,LEN,密码[LEN]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
4、修改密码
使用CMD16设置Block长度为OLD_PWD_LEN+NEW_PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x05,LEN,旧密码[n],新密码[m]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
5、卡擦除
使用CMD16设置Block长度为1;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x08,0xFF,0xFF;
使用CMD16恢复原Block长度。
/******************************** Class0 : 基本命令集 Basic command set **************************/
/* 复位SD 卡 Reset cards to idle state */
#define CMD0 0
#define CMD0_R R1
/* 读OCR寄存器,不适用于SD卡 Read the OCR (MMC mode, do not use for SD cards) */
#define CMD1 1
#define CMD1_R R1
/* 读CSD寄存器 Card sends the CSD */
#define CMD9 9
#define CMD9_R R1
/* 读CID寄存器 Card sends CID */
#define CMD10 10
#define CMD10_R R1
/* 停止读多块时的数据传输 Stop a multiple block (stream) read/write operation */
#define CMD12 12
#define CMD12_R R1B
/* 读 Card_Status 寄存器 Get the addressed card's status register */
#define CMD13 13
#define CMD13_R R2
/***************************** Class2:块读命令集 Block read commands **************************/
/* 设置块的长度 Set the block length */
#define CMD16 16
#define CMD16_R R1
/* 读单块 Read a single block */
#define CMD17 17
#define CMD17_R R1
/* 读多块,直至主机发送CMD12为止 Read multiple blocks until a CMD12 */
#define CMD18 18
#define CMD18_R R1
/***************************** Class4:块写命令集 Block write commands *************************/
/* 写单块 Write a block of the size selected with CMD16 */
#define CMD24 24
#define CMD24_R R1
/* 写多块 Multiple block write until a CMD12 */
#define CMD25 25
#define CMD25_R R1
/* 写CSD寄存器 Program the programmable bits of the CSD */
#define CMD27 27
#define CMD27_R R1
/*****************************Class6:写保护 Write protection *****************************/
/* 设置写保护块的地址 Set the write protection bit of the addressed group */
#define CMD28 28
#define CMD28_R R1B
/* 擦除写保护块的地址 Clear the write protection bit of the addressed group */
#define CMD29 29
#define CMD29_R R1B
/* Ask the card for the status of the write protection bits */
#define CMD30 30
#define CMD30_R R1
/***************************** Class5:擦除命令 Erase commands *******************************/
/* 设置擦除块的起始地址(只用于SD卡) Set the address of the first write block to be erased(only for SD) */
#define CMD32 32
#define CMD32_R R1
/* 设置擦除块的终止地址(只用于SD卡) Set the address of the last write block to be erased(only for SD) */
#define CMD33 33
#define CMD33_R R1
/* 设置擦除块的起始地址(只用于MMC卡) Set the address of the first write block to be erased(only for MMC) */
#define CMD35 35
#define CMD35_R R1
/* 设置擦除块的终止地址(只用于MMC卡) Set the address of the last write block to be erased(only for MMC) */
#define CMD36 36
#define CMD36_R R1
/* 擦除所选择的块 Erase the selected write blocks */
#define CMD38 38
#define CMD38_R R1B
/***************************** class7:锁卡命令 Lock Card commands ***************************/
/* 设置/复位密码或上锁/解锁卡 Set/reset the password or lock/unlock the card */
#define CMD42 42
#define CMD42_R R1B
/* Commands from 42 to 54, not defined here */
/***************************** 应用命令 Application-specific commands ****************/
/* 通知该卡下个命令是条特殊命令,而不是标准命令 Flag that the next command is application-specific */
#define CMD55 55
#define CMD55_R R1
/* 应用命令的通用I/O General purpose I/O for application-specific commands */
#define CMD56 56
#define CMD56_R R1
/* 读OCR寄存器 Read the OCR (SPI mode only) (电源配置寄存器)*/
#define CMD58 58
#define CMD58_R R3
/* CRC使能或禁止 CRC Turn CRC on or off */
#define CMD59 59
#define CMD59_R R1
/***************************** 应用命令 Application-specific commands ***************/
/* 获取 SD Status寄存器 Get the SD card's status */
#define ACMD13 13
#define ACMD13_R R2
/* 得到已写入卡中的块的个数 Get the number of written write blocks (Minus errors ) */
#define ACMD22 22
#define ACMD22_R R1
/* 在写之前,设置预先擦除的块的个数 Set the number of write blocks to be pre-erased before writing */
#define ACMD23 23
#define ACMD23_R R1
/* 启动此卡的初始化过程 Activates the card’s initialization process */
#define ACMD41 41
#define ACMD41_R R1
/* 连接/断开CD/DATA[3]引脚上的上拉电阻 Connect or disconnect the 50kOhm internal pull-up on CD/DAT[3] */
#define ACMD42 42
#define ACMD42_R R1
/* 读取SCR寄存器 Get the SD configuration register */
#define ACMD51 51
#define ACMD51_R R1
以上是寄存器的介绍,确实很多,也挺复杂的,需要好好消化。