我的感觉,SD卡,就像一个比W25Q64更复杂一些的带控制系统的Flash存储器。SD卡内部有处理器和一些重要的寄存器,我们存储给它的数据,被存储在一块一款的区域中。通过指令,我们可以从这些重要的寄存器中获取整个SD卡的存储信息,并读写数据存储单元。
SD卡的重要寄存器
SD卡中包含有以下一些寄存器:
1、OCR寄存器(操作条件寄存器)
这个32位的寄存器存储了Vdd电压范围。SD卡操作电压范围为2~3.6V。然而从内存中访问数据的电压是2.7~3.6V。OCR显示了卡数据访问电压范围,结构如下表所示。
OCR位 | VDD电压范围 |
0-3 | 保留 |
4 | 1.6~1.7 |
5 | 1.7~1.8 |
6 | 1.8~1.9 |
7 | 1.9~2.0 |
8 | 2.0~2.1 |
9 | 2.1~2.2 |
10 | 2.2~2.3 |
11 | 2.3~2.4 |
12 | 2.4~2.5 |
13 | 2.5~2.6 |
14 | 2.6~2.7 |
15 | 2.7~1.8 |
16 | 2.8~2.9 |
17 | 2.9~3.0 |
18 | 3.0~3.1 |
19 | 3.1~3.2 |
20 | 3.2~3.3 |
21 | 3.3~3.4 |
22 | 3.4~3.5 |
23 | 3.5~3.6 |
24-30 | 保留 |
31 | 卡上电状态位(忙) |
OCR结构如下图所示。如果第32位(busy bit)置位,表明卡上电过程已结束。
2、CID寄存器(卡的识别信息寄存器)
CID寄存器长度为16个字节的卡唯一标识号,该号在卡生产厂家编程后无法修改。
名称 | 类型 | 宽度 | CID位 | 内容 | CID值 |
厂商ID | Binary | 8 | [127:120] | SD卡协会管理和分配 | 0x03 |
OEM/Application ID(OID) | ASCII | 16 | [119:104] | 识别卡的OEM或卡内容,由制造商分配 | 0x53,0x44 |
产品名(PNM) | ASCII | 40 | [103:64] | 5个ASCII字符 | SD128 |
产品版本(PRV) | BCD | 8 | [65:56] | 2个二进制编码的十进制数 | 产品版本(30)1 |
序列号(PSN) | Binary | 32 | [55:24] | 32位无符号整数 | 产品序列号 |
保留 | 4 | [23:20] | |||
生成日期(MDT) | BCD | 12 | [19:8] | yym(从2000年的偏移量) | 如:Apr 2001=0x014 |
CRC7校验和(CRC) | Binary | 7 | [7: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)]
| CRC7 |
未用 | 1 | [0:0] | 格式为“n.m”,如“6.2”表示为0110 0010 |
3、CSD寄存器(配置信息寄存器)
CSD寄存器包含访问卡数据所需的配置信息。CSD寄存器是一个很重要的寄存器,由于设置比较复杂,这里先略过,后面学习的时候在仔细讲讲。
SD卡的数据存取单位
就像W25Q64、AT24C64那样,对SD卡的读写操作,也有块(Block)、扇区(扇区)的概念。SD卡Block的大小可以固定,也可以改变,这个大小的设置,保存在CSD寄存器中。Sector由几个块组成。Sector的大小,对于每个SD而言,是固定的,它也保存在CSD寄存器中。