SD操作学习(转)

来源:互联网 发布:大番长数据修改器 编辑:程序博客网 时间:2024/05/19 06:50

SD卡操作 
一、
      
概述 
1
、简介

SD卡是基于flash的存储卡。

SD卡和MMC卡的区别在于初始化过程不同。

SD卡的通信协议包括SDSPI两类。

 

SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。

 

2、功能介绍 
2.1 
特点

1)        主机无关的FLASH内存擦除和编程

读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。当采用新型的FLASH时,主机代码无需更新。

2)        缺陷管理

3)        错误恢复

4)        电源管理

 

Flash每个扇区有大约10万次的写寿命,读没有限制。

 

擦除操作可以加速写操作,因为在写之前会进行擦除。

 

3 SD总线模式 
3.1 Negotiating Operation Conditions

当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。要退出非活动状态唯一的方法就是重新上电。

 

3.2 SD卡获取和识别

SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。

主机通过READ_CID命令读取CID寄存器。CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。

DAT3线上内置的上拉电阻用来侦测卡。在数据传输时电阻断开(使用 ACMD42)

3.3 卡状态

卡状态分别存放在下面两个区域:

卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。

SD状态(SD_Status),当主机使用SD_STATUSACMD13)命令时,512位以一个数据块的方式发送给主机。SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。

3.4 内存组织

数据读写的基本单元是一个字节,可以按要求组织成不同的块。

 

Block:块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD寄存器。

Sector:和擦除命令相关,由几个块组成。Sector的大小对每个设备是固定的,大小信息存储在CSD寄存器。

WP Group:写保护单位。大小包括几个group,写保护由一位决定,对每个设备大小是固定的,存储在CSD寄存器。

 

3.5 读写操作

 

Single Block Mode:主机根据事先定义的长度读写一个数据块。由发送模块产生一个16位的CRC校验码,接受端根据校验码进行检验。读操作的块长度受设备sector大小 (512 bytes)的限制,但是可以最小为一个字节。不对齐的访问是不允许的,每个数据块必须位于单个物理sector内。写操作的大小必须为sector大小,起始地址必须与sector边界对齐。

Multiple Block Mode:主机可以读写多个数据块(相同长度),根据命令中的地址读取或写入连续的内存地址。操作通过一个停止传输命令结束。写操作必须地址对齐。

3.6 数据传输速率

SD卡可以通过单数据线(DAT0)或四根数据线(DAT0-DAT3)进行数据传输。单根数据线传输最大传输速率为25 Mbit/s,四根数据线最大传输速率为100 Mbit/s

3.7 数据保护

每个sector的数据通过Error Correction Code (ECC)进行保护。在写sector时生成ECC,在读sector时检验ECC。如果发现错误,在传输前进行纠正。

3.8数据擦除

SD卡数据擦除的最小单位是sector。为了加速擦除操作,多个sector可以同时擦除。为了方便选择,第一个指令包含起始地址,第二个指令包含结束地址,在地址范围内的所有sector将被擦除。

 

3.9 写保护

两种写保护方式可供选择,永久保护和临时保护,两种方式都可以通过PROGRAM_CSD指令进行设置。永久保护位一旦设置将无法清除。

3.10 拷贝位

通过CSD寄存器中的拷贝位(copy bit)设置SD卡中的数据是原始数据还是拷贝数据。拷贝位一旦设置,将无法清除,在测试和格式化时使用。

3.11 CSD寄存器

所有SD卡的配置信息存储在CSD寄存器。通过SEND_CSD读取,PROGRAM_CSD修改。

 

4 SPI模式 
二、
      
SD卡接口描述 
引脚和寄存器

主机通过9个引脚和SD卡相连

1.1 SD模式引脚

 

扩展数据线(DAT1-DAT3)上电后为输入,SET_BUS_WIDTH命令执行后作为数据线。即使只有DAT0使用,所有数据线都和外部上拉电阻连接,否则DAT1 & DAT2(如果未被使用)的振荡输入将引起非期望的高电流损耗。

上电后,数据线输入50K(+/-20K)欧姆的上拉(用来进行卡侦测和SPI模式选择)。用户可以在常规数据传输时,通过SET_CLR_CARD_DETECT (ACMD42)命令分离上拉。

1.2 SPI模式引脚

 

 

1.3 寄存器

名称

宽度

描述

CID

128

卡标识号

RCA

16

相对卡地址(Relative card address:本地系统中卡的地址,动态变化,在主机初始化的时候确定

*SPI模式中没有

CSD

128

卡描述数据:卡操作条件相关的信息数据

SCR

64

SD配置寄存器:SD卡特定信息数据

OCR

32

操作条件寄存器

 

主机通过重新上电来重置(reset)卡。卡有它自身检测上电的电路,当上电后卡状态切换到idle状态。也可以通过GO_IDLE (CMD0)指令来重置。

2       SD卡总线拓扑

SD总线有6根通信线和三根电源供应线:

²        CMD——命令线是双向信号线。主机和卡通过push pull 模式工作。

²        DAT0-3——数据线是双向信号线。主机和卡通过push pull 模式工作。

²        CLK——时钟是从主机到卡的信号。CLK通过push pull 模式操作。

²        VDD—VDD是所有卡的电源供应线。

²        VSS[1:2]—VSS2根地线。

 

 

在初始化的时候,向每个卡分别发送命令,允许应用检测卡并给物理槽(physical slot)分配逻辑地址。数据通常分别传输给每个卡。然后,为了方便处理卡堆栈,初始化后所有命令同时发送给所有卡,在命令数据包中包含了操作地址。

SD总线允许动态配置数据线数目。上电后默认SD卡只用DAT0作为数据传输线。初始化后,主机可以改变总线宽度。这个特性使得在硬件开销和系统性能间取得平衡。

3       SPI总线拓扑 4       电气接口 4.1 上电

 

上电后,包括热插入,卡进入idle状态。在该状态SD卡忽略所有总线操作直到接收到ACMD41命令。ACMD41命令是一个特殊的同步命令,用来协商操作电压范围,并轮询所有的卡。除了操作电压信息,ACMD41的响应还包括一个忙标志,表明卡还在power-up过程工作,还没有准备好识别操作,即告诉主机卡还没有就绪。主机等待(继续轮询)直到忙标志清除。单个卡的最大上电时间不能操作1秒。

上电后,主机开始时钟并在CMD线上发送初始化序列,初始化序列由连续的逻辑“1”组成。序列长度为最大1毫秒,74个时钟或supply-ramp-up时间。额外的10个时钟(64个时钟后卡已准备就绪)用来实现同步。

每个总线控制器必须能执行ACMD41CMD1CMD1要求MMC卡发送操作条件。在任何情况下,ACMD41CMD1必须通过各自的CMD线分别发送给每个卡。

 

5       寄存器 5.1 OCR(Operating Conditions Register)

32位的操作条件寄存器存储了VDD电压范围。SD卡操作电压范围为2~3.6V。然而从内存中访问数据的电压是2.7~3.6VOCR显示了卡数据访问电压范围,结构如下表所示。

3-8 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)置位,表明卡上电过程已结束。

 

5.2 CID(Card Identification)

CID寄存器长度为16个字节的卡唯一标识号,该号在卡生产厂家编程后无法修改。SDMMC卡的CID寄存器结构不一样。

名称

类型

宽度

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]

5ASCII字符

SD128

产品版本(PRV

BCD

8

[65:56]

2个二进制编码的十进制数

产品版本(301

序列号(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]

 

 

1、格式为“n.m”,如“6.2表示为0110 0010

 

5.3 CSD(Card Specific Data)

CSD寄存器包含访问卡数据所需的配置信息。SD卡和MMC卡的CSD不同。

6       数据交互格式和卡容量

通常,SD卡分为2个区:

²       用户区用户通过读写命令存储安全和非安全数据。

²       安全保护区(Security Protected Area版权保护应用程序用来保存安全相关数据,通过SD安全规范中定义的条件验证后,由主机使用安全的读写指令完成操作。安全保护区的大小大概是总大小的1%

 

 

 

三、      SD卡协议 1 SD总线协议

SD总线通信是基于命令和数据位流方式的,由一个起始位开始,以一个停止位结束:

命令——命令是开始开始操作的标记。命令从主机发送一个卡(寻址命令)或所有连接的卡(广播命令)。命令在CMD线上串行传送。

响应——响应是从寻址卡或所有连接的卡(同步)发送给主机用来响应接受到的命令的标记。命令在CMD线上串行传送。

数据——数据可以通过数据线在卡和主机间双向传送。

 

 

卡寻址通过会话地址方式实现,地址在初始化的时候分配给卡。SD总线上的基本操作是command/response

数据传送采用块方式,数据块后接CRC校验位,操作包括单数据块和多数据块。多数据块更适合快速写操作,多数据块传输当在CMD线出现停止命令时结束。  数据传输可以在主机端设置采用单数据线或多数据线方式。

 

块写操作在DAT0数据线写操作期间使用忙信号,无论用来传输的信号线数目是多少。

 

命令格式如下所示:

 

响应标记(token)根据内容不同具有四种格式,标记长度。长度为48位或136位。数据块的CRC算法采用16位的CCITT多项式。

 

在命令行中,MSB位首先传送,LSB位最后传送。

当使用宽总线模式时,数据同时在4根数据线上传输。开始位、结束位和CRC在每根数据线上传送。CRC对每根数据线单独计算。CRC状态响应和Busy信号只通过DAT0由卡发送给主机。

 

协议功能描述

所有主机和SD卡间的通信由主机控制。主机发送下述两类命令:

l         广播命令——广播命令发送给所有SD卡,有些命令需要响应。

l         寻址(点对点)命令——寻址命令只发送给具有相应地址的卡,并需要从卡返回一个响应。

对卡而言也有两类操作:

l         卡识别模式——在重置(reset)后当主机查找总线上的新卡时,处于卡识别模式。重置后SD卡将始终处于该模式,直到收到SEND_RCA命令(CMD3)。

l         数据传输模式——一旦卡的REC发布后,将进入数据传输模式。主机一旦识别了所有总线上的卡后,将进入数据传输模式。

 

操作模式与卡状态关系:

 

卡识别模式

在卡识别模式,主机重置所有处于卡识别模式的SD卡,检验操作电压范围,识别卡并请求卡发送相对卡地址RCA。操作对每个卡在各自的CMD线上单独进行,所有的数据传送只使用CMD线。

 

3.1 重置

GO_IDLE_STATE(CMD0)是软件重置命令,设置每个SD卡进入Idle状态。处于Inactive状态的卡不受此命令影响。

主机上电后,所有SD卡进入Idle状态,包括处于Inactive状态的卡。至少74个时钟周期后才能开始总线传输。

上电或CMD0(重置)后,所有SD卡的命令线处于输入模式,等待下一个命令的起始位。卡通过一个默认的相对卡地址RCARCA=0x0000)和默认驱动寄存器设置(最低速,最高驱动电流)初始化。

3.2 操作电压范围验证

SD的物理规范标准要求所有SD卡能通过最小和最大供电电压间的任何电压和主机建立通信。然而,数据传输时的最小和最大电压值在操作条件寄存器OCR中定义,可能并不能覆盖所有的电压范围。SD卡主机希望通过读取卡的OCR寄存器获取合适的电压值或弹出卡。

SD

3.3 卡识别过程

在识别时钟速率fOD下主机开始卡识别过程。SD卡的CMD线输出驱动是push-pull驱动。

总线激活后,主机要求卡发送它们的有效操作条件(ACMD41 preceding with APP_CMDCMD55 with RCA=0x0000)。ACMD41命令的响应是卡的操作条件寄存器。相同的命令将发送给系统中所有的卡。不兼容的卡将进入Inactive状态。主机然后发送命令ALL_SEND_CIDCMD2)到每个卡以获取每个卡的唯一标识CID号。未识别的卡通过CMD线发送CID号作为响应。当卡发送CID号后,进入识别状态(Identification State)。此后,主机发送CMD3SEND_RELATIVE_ADDR)要求卡发布一个新的相对卡地址RCA,地址比CID短,在以后的数据传输模式中用来寻址卡。一旦获得RCA后,卡状态变成就绪状态(Stand-by state)。此时,如果主机要求卡换成其他的RCA号,可以通过发送另一个SEND_RELATIVE_ADDR命令给卡,要求发布一个新的RCA,最后发布的RCA是实际使用的RCA。主机对系统中的每个卡重复识别过程。

所有的SD卡初始化完以后,系统将开始初始化MMC卡(如果有的话),使用MMC卡的CMD2CMD3

原创粉丝点击