SD card
高均 收集整理 自学用
几个概念:SD、SDHC、SDXC、SDIO、MMC、MCI
Mmc:MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准。较早的一种记忆卡标准
SD:由MMC演变而来的,最大支持2GB大小容量。(Secure Digital Memory Card)由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制的新一代记忆卡标准,已完全兼容MMC标准。
SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量
SDXC(SD eXtended Capacity)是09年才发布的新标准,支持最大2TB的大小容量
SDIO (Secure Digital Input and Output Card)安全数字输入输出卡。SDIO是在SD标准上定义了一种外设接口,通过SD的I/O接脚来连接外围设备,并且通过SD上的 I/O数据接位与这些外围设备进行数据传输。
MCI: MCI是Multimedia Card Interface的简称,即多媒体卡接口。上述的MMC,SD,SDI卡定义的接口都属于MCI接口。MCI这个术语在驱动程序中经常使用,很多文件,函数名字都包括”mci”.
MMC、SD、SDIO的电气特性及性能和不同工作模式下支持的传输模式情况:
引脚图:(micro-SD为8个,少一个接地pin脚)
2. SD卡的引脚图
注:S:电源供给 I:输入 O:采用推拉驱动的输出
PP:采用推拉驱动的输入输出
高均 收集整理 自学用
SD/MMC协议与命令了解
SD2.0规范介绍
1、版本
SD spec1.0 低速度、低容量 25M 2G
SD spec1.1 高速度、低容量 50M 2G
SD spec2.0 高速度、高容量 50M 32G
2、SD规范包括
(1) 物理层规范
(2) 文件系统规范
(3) SD卡安全规范
(4) SD卡音频应用规范+其他相关应用规范
(5) SD MC扩展规范 移动设备
(6) SDIO卡规范
3、符合SD2.0规范的设备
SD卡 MiniSD、MicroSD 1.0/1.1
SDIO卡 wifi、GPS,条形扫描仪
SDHC 2.0 最少支持class2
SDXC 网卡,电视卡
Combo Card组合卡(存储器+SDIO)
4、传输速度类型分为
class0 旧的卡,
class2 大于2MB/S
class4 大于4MB/S
class6 大于6MB/S
5、总线传输模式
SD卡支持两种总线方式:SD方式与SPI方式。其中SPI 串行传输、低速度;SD 最多支持四线传输。SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。兼容MMC
SD/SDIO 的传输模式
SD 传输模式有以下 3种:
· SPI mode (required )
· 1-bit mode
· 4-bit mode
SDIO 同样也支持以上 3种传输模式。依据 SD标准,所有的 SD(记忆卡)与 SDIO(外围)都必须支持 SPI mode,因此 SPI mode是「required」。此外,早期的 MMC卡(使用 SPI传输)也能接到 SD插糟(SD slot),并且使用 SPI mode或 1-bit mode来读取。
6、SD总线
1 总线分为hostódevice
(1) comand 命令 host => device都是48位
A、广播命令
B、点对点命令
(2) response 响应 device => host
根据内容不同分为R1、R3、R4、R7(48位)和R2(136位)
首先由主机向SD卡发送命令command,等待SD卡的回复response,如果成功收到回复,则进行数据传输。其中,指令线和数据线上传输的指令和数据都要遵循相应的协议格式。
一条指令command共48位,其中command index指代这条具体的指令名称,argument为该指令的参数。一条回复response根据不同的指令有几种不同类型。
struct mmc_command {
u32 opcode; //对应command index
u32 arg; //对应argument
u32 resp[4]; //对应response
unsigned int flags; /* expected response type */
... ...
unsigned int retries; /* max number of retries */
unsigned int error; /* command error */
struct mmc_data *data; /* data segment associated with cmd */
struct mmc_request *mrq; /* associated request */
};
初始化阶段,host给SD卡分配地址
数据传输是有单块传输命令和多块传输命令,然后通过发送一个终止命令停止传输
单块还是多块传输,通过host去配置
命令先传msb 在 lsb
SD/MMC卡相关寄存器
SD卡内部有7个寄存器.其中OCR,CID,CSD和SCR寄存器保存卡的配置信息;RCA寄存器保存着通信过程中卡当前暂时分配的地址(只适合SD模式);CSR卡状态(Card Status)和SSR SD状态(SD Status)寄存器保存着卡的状态(例如,是否写成功,通信的CRC校验是否正确等),这两个寄存器的内容与通信模式(SD模式或SPI模式)相关.MMC卡没有SCR和SD Status寄存器.如下表1所示:
1.1.OCR寄存器(操作寄存器 电压值上电状态)
OCR寄存器保存着SD/MMC卡的供电电允许范围.如下表2所示:如果OCR寄存器的某位为1,表示卡支持该位对应的电压。最后一位表示卡上电后的状态(是否处于”忙状态”),如果该位为0,表示忙,如果为1,表示处于空闲状态(MMC/SD协议P60)。
表2 OCR寄存器
1.2.CID寄存器(卡标识寄存器 产品序列生产日期)
CID为一个16个字节的寄存器,该寄存器包含一个独特的卡标识号。如下表3所示:
表3 CID寄存器
1.3.CSD寄存器(卡特性寄存器 )
CSD寄存器(卡特殊数据寄存器)包含访问卡存储时需要的相关信息。如下表4所示:
表4 CSD寄存器
1.4.SCR寄存器(卡配置寄存器 支持协议 支持总线宽度 )
SCR寄存器提供SD卡的特殊特性信息,其大小为64位。该寄存器由厂商编程,主机不能对它进行编程。MMC卡没有SCR。如下表5所示:
表 5 SCR寄存器
1.5. RCA寄存器(卡地址)
该16位卡地址寄存器保存了在卡识别过程中卡发布的器件地址。该地址用于在卡识别后主机利用该地址与卡进行通信。该寄存器只有在SD总线模式下才有效。
SD卡的命令
1.SD卡的命令格式:
SD卡的指令由6字节(Byte)组成,如下:
Byte1:01 x x x x x x(命令号,由指令标志定义CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)。
Byte2-5:Command Arguments,命令参数,有些命令没有参数。
Byte6:前7位为CRC(Cyclic Redundacy Check,循环冗余校验)校验位,最后一位为停止位0。
2. SD卡的命令
SD卡命令共分为12类,分别为class0到Class11.
2.1. Class0 :(卡的识别、初始化等基本命令集)
CMD0:复位SD 卡。
CMD1:读OCR寄存器。
CMD9:读CSD寄存器。
CMD10:读CID寄存器。
CMD12:停止读多块时的数据传输。
CMD13:读 Card_Status 寄存器。
2.2.Class2 (读卡命令集):
CMD16:设置块的长度。
CMD17:读单块。
CMD18:读多块,直至主机发送CMD12为止 。
2.3.Class4(写卡命令集) :
CMD24:写单块。
CMD25:写多块。
CMD27:写CSD寄存器 。
2.4.Class5 (擦除卡命令集):
CMD32:设置擦除块的起始地址。
CMD33:设置擦除块的终止地址。
CMD38: 擦除所选择的块。
2.5.Class6(写保护命令集):
CMD28:设置写保护块的地址。
CMD29:擦除写保护块的地址。
CMD30: Ask the card for the status of the write protection bits
class7:卡的锁定,解锁功能命令集。
class8:申请特定命令集 。
class10 -11 :保留。
其中 class1, class3,class9:SPI模式不支持
高均 收集整理 自学用
3.SD卡的工作流程
首先看下脱离操作系统如何在ARM处理器上实现SD卡的读写。过程可以分为3个大的步骤:初始化sd卡、写sd卡、读sd卡。
3.1.工作条件检测
卡在识别模式下的命令流程如图3.1所示(英文版见标准SD卡协议P24)
图3.1 卡在识别模式下的命令流程
结合代码
结合代码
mmc_go_idle(host); CMD0
Idle State
mmc_send_if_cond(host, ocr); CMD8
mmc_send_app_op_cond(host, ocr, NULL); ACMD41
Ready State
mmc_all_send_cid(host, cid); CMD2
IdentificationState
mmc_send_relative_addr(host, &card->rca); CMD3
1)在主机和SD卡进行任何通信之前,主机不知道SD卡支持的工作电压范围,卡也不知道是否支持主机当前提供的电压。