当前位置:文档之家› SD卡详解

SD卡详解

SD卡详解
SD卡详解

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

SD卡是基于flash的存储卡。

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

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

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_STATUS(ACMD13)命令时,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卡接口描述1引脚和寄存器

主机通过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寄存器

名称宽度描述

CID128卡标识号

RCA16相对卡地址(Relative card address):本地系统中卡的地址,动

态变化,在主机初始化的时候确定

*SPI模式中没有

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

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

OCR32操作条件寄存器

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

2SD卡总线拓扑

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

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

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

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

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

?VSS[1:2]—VSS是2根地线。

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

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

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

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

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

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

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

表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个字节的卡唯一标识号,该号在卡生产厂家编程后无法修改。SD和MMC卡的CID寄存器结构不一样。

名称类型宽度CID位内容CID值

厂商ID Binary8[127:120]SD卡协会

管理和分配

0x03

OEM/Appli cation

ID(OID)ASCII16[119:104]识别卡的

OEM或卡

内容,由制

造商分配

0x53,0x44

产品名(PNM)ASCII40[103:64]5个ASCII

字符

SD128

产品版本(PRV)BCD8[65:56]2个二进制

编码的十进

制数

产品版本

(30)1

序列号(PSN)Binary32[55:24]32位无符号

整数

产品序列号

保留4[23:20]

生成日期(MDT)BCD12[19:8]yym(从

2000年的偏

移量)

如:Apr

2001=0x01

4

CRC7校验

和(CRC)

Binary7[7:1]CRC CRC7

Calculation:

G(x)=x7+3+1

M(x)=(MID-MS

B)*x119+...+(C

IN-LSB)*x0

CRC[6...0]=

Remainder[(

M(x)*x7)/G(

x)]

未用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由卡发送给主机。

2协议功能描述

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

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

●寻址(点对点)命令——寻址命令只发送给具有相应地址的卡,并需要从

卡返回一个响应。

对卡而言也有两类操作:

●卡识别模式——在重置(reset)后当主机查找总线上的新卡时,处于卡识

别模式。重置后SD卡将始终处于该模式,直到收到SEND_RCA命令(CMD3)。

●数据传输模式——一旦卡的REC发布后,将进入数据传输模式。主机一旦

识别了所有总线上的卡后,将进入数据传输模式。

操作模式与卡状态关系:

3卡识别模式

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

3.1重置

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

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

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

3.2操作电压范围验证

SD的物理规范标准要求所有SD卡能通过最小和最大供电电压间的任何电压和主机建立通信。然而,数据传输时的最小和最大电压值在操作条件寄存器

OCR中定义,可能并不能覆盖所有的电压范围。SD卡主机希望通过读取卡的OCR寄存器获取合适的电压值或弹出卡。

SD卡

3.3卡识别过程

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

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

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

4数据传输模式

直到主机知道所有CSD寄存器的内容,fpp时钟速率必须保持在fOD,因为一些卡有操作频率限制。主机发送SEND_CSD(CMD9)获取卡定义数据(Card Specific Data,CSD寄存器),如块大小、卡存储容量、最大时钟速率等。

CMD7用来选择一个卡并将它置于传输状态(Transfer state),在任何时间只能有一个卡处于传输状态。如果已有一个卡处于传输状态,它和主机的连接将释放,并返回到Stand-by状态。当CMD7以保留相对地址“0x0000”发送时,所有卡将返回到Stand-by状态。这可以用来识别新的卡而不重置其他已注册的卡。在这种状态下已有一个RCA地址的卡不响应识别命令

(ACMD41,CMD2,CMD3)。

注意:当卡接收到一个带有不匹配RCA的CMD7时,卡将取消选中。在公用CMD线时,选中一个卡时将自动不选中其他卡。因此,在SD卡系统中,主机具有如下功能:

●初始化完成后,在公用CMD线时,不选中卡是自动完成的。

●如果使用单独的CMD线,需要关注不选中卡的操作

在主机和选择的SD卡之间的所有数据通信是点对点的方式。所有寻址命令都需要响应。

不同数据传输模式的关系如图4-8所示,使用如下步骤:

●所有读数据命令可以在任何时候通过停止命令(stop

command,CMD12)中止。数据传输将中止,卡回到传输状态(Transfer

State)。读命令有:块读命令(CMD17),多块读命令(CMD18),发送

读保护(CMD30),发送scr(ACMD51),以及读模式的通用命令(CMD56)。

●所有写数据命令可以在任何时候通过停止命令(stop

command,CMD12)中止。在不选中卡命令CMD7前写命令必须停止。

写命令有:块写命令(CMD24 and CMD25),写CID (CMD26),写

CSD(CMD27), lock/unlock命令(CMD42)以及写模式通用命令(CMD56)。

●一旦数据传输完成,卡将退出数据写状态并进入Programming State(传

输成功)或Transfer State(传输失败)。

●如果一个快写操作停止,而且最后一块块长度和CRC是有效的,那

么数据可以被操作(programmed)。

●卡可能提供块写缓冲。这意味着在前一块数据被操作时,下一块数据

可以传送给卡。如果所有卡写缓冲已满,只要卡在Programming State,

DAT0将保持低电平(BUSY)。

●写CSD、CID、写保护和擦除时没有缓冲。这表明在卡因这些命令而

处于忙时,不再接收其他数据传输命令。在卡忙时DAT0保持低电平,

并处于Programming State。实际上如果CMD和DAT0线分离,而且主

机占有的忙DAT0线和其他DAT0线分开,那么在卡忙时,主机可以访

问其他卡。

●在卡被编程(programming)时,禁止参数设置命令。参数设置命令

包括:设置块长度(CMD16),擦除块开始(CMD32)和擦除块结束

(CMD33)。

●卡在操作时不允许读命令。

●使用CMD7指令把另一个卡从Stand-by状态转移到Transfer状态不会

中止擦除和编程(programming)操作。卡将切换到Disconnect状态并

释放DAT线。

●使用CMD7指令可以不选中处于Disconnect状态的卡。卡将进入

Programming状态,重新激活忙指示。

●使用CMD0或CMD15重置卡将中止所有挂起和活动的编程

(programming)操作。这可能会破坏卡上的数据内容,需要主机保证

避免这样的操作。

4.1宽总线选择/不选择

宽总线(4位总线宽度)操作模式通过ACMD6选择和不选择。在上电后或GO_IDLE(CMD0)命令后默认的总线宽度是1位。ACMD6命令只在“tran state”有效,即只有在卡选中后(CMD7)总线宽度才能修改。

4.2读数据格式

DAT总线在没有数据传输时处于高电平。一个传输数据块包含一个起始位(LOW),接着连续的数据流。数据流包含有效数据(如果使用了ECC了还包括错误纠正位)。数据流以一个结束位(HIGH)结束。数据传输和时钟信号同步。

以块传输的有效数据包含CRC校验和。产生多项式是标准CCITT多项式。

采用了缩短的BCH码,d=4,有效数据长度最长为2048字节。CRC校验和对每个DAT线单独计算并附加在每个数据块后。在宽总线模式操作(DAT0-DAT3)中,16位的CRC校验对每个DAT分别计算。

数据块读

传输的基本单位是数据块,最大尺寸在CSD中定义(READ_BL_LEN)。开始和结束地址完全包含在一个物理数据快(如READ_BL_LEN定义)中的较小

的块也可以传递。CRC附加在每个数据块的尾部用来保证数据传输的完整性。CMD17(READ_SINGLE_BLOCK)开始一个块读操作,然后传输完成后进入Transfer状态。CMD18(READ_MULTIPLE_BLOCK)开始连续的块传输,直到停止命令。停止命令有一个执行延迟。在停止命令最后一位发送完以后数据传输停止。

如果主机使用累计长度不是块对齐的部分块,在第一个不对齐块的开始,卡会发现一个块未对齐错误,在状态寄存器中设置ADDRESS_ERR错误,中止传输并等待(在Data状态)停止命令。

4.3数据写格式

数据写传输格式类似于读格式。对于以块为单位的写数据传输,CRC检验位附加到每个数据块。卡的每根数据线在接收到数据并在写操作前,执行CRC 校验。

数据块写

数据块写(CMD24-27,42,56(W)),一个或多个数据块从主机发送给卡,主机在每个数据块后附加CRC校验。数据块长度WRITE_BL_LEN(512B)。如果CRC校验失败,卡将在DAT数据线上指示错误。传输的数据将被抛弃,而且后续传输的数据块(在多数据块写模式)也都会被忽略。

多数据块写命令比连续的单数据块写命令速度快。不允许部分块写(小于512B)。

当主机试图在写保护区域写数据时写操作将中止。在这种情况下,卡在状态寄存器设置WP_VIOLATION位,并忽略所有后续数据传输,并在Receive-data 状态下等待停止命令。

对CID和CSD寄存器进行编程操作不需要实现设置块长度,传输的数据也是CRC保护的。如果CSD或CID寄存器一部分存储于ROM中,那么不可改变部分必须和接收缓冲中的相应部分内容保持一致。如果匹配失败,卡将报告一个错误,而且不改变任何寄存器内容。

接收到一个数据块并完成CRC校验后,卡将开始写,如果写缓冲满而且不能从一个新的WRITE_BLOCK命令接收新数据时,DAT0线保持为低电平。任何时候主机都可以通过SEND_STATUS(CMD13)命令获取卡的状态。状态位

READY_FOR_DATA指示卡是否可以接收新数据或写操作还在进行中。主机通过CMD7(选中另一个卡)不选中卡,这个操作可以把卡的状态编程Disconnect 并释放DAT线而不中断写操作。当不选中卡时,如果编程还在进行而且写缓冲不可用时,将通过下拉DAT为低电平来重新激活忙信号。实际上,主机通过interleaving可以实现多个卡同时写操作,interleaving过程可以通过在卡忙时访问其他卡实现。

预擦除设置优先于多数据块写操作

设置多个写数据块的预擦除(ACMD23)可以使得接下来的多个数据块写操作比没有预先执行ACMD23的相同操作更快。主机可以通过该命令设置多少个数据块将在接下来的写操作中发送。如果在所有数据块发送给卡时中止了写操作(使用停止传输命令),残余写数据块的内容(指要写入新内容的数据块?)将变得不确定(可能已擦除或还是原来的数据)。如果主机发送了超过ACMD23中定义的数据块数目的数据,卡将逐个擦除数据块(在收到新数据时)。多数据块写操作完成后值将重新设置为默认值1。

建议在CMD25命令前使用该命令以加速写操作。如果需要预擦除主机在写命令前发送ACMD23。如果不发送ACMD23命令,设置的预擦除数将在其他指令执行时自动清除。

发送写数据块数目

系统使用管道机制进行数据缓冲管理,有时候在多数据块写操作过程中发生错误,使得无法确定哪一个数据块是最后成功写入的数据块。卡可以把正常写入的数据块数(the number of well-written blocks)作为对命令ACMD22的响应。

擦除

同时擦除多个写数据块可以提高数据吞吐量。通过ERASE_WR_BLK_START(CMD32)和ERASE_WR_BLK_END(CMD33)实现写数据块的识别。

主机必须严格按照下列的命令操作顺序:ERASE_WR_BLK_START,RASE_WR_BLK_END,and ERASE (CMD38)。

如果不按顺序接收到擦除指令(CMD38)或地址设置指令(CMD32,33),卡将在状态寄存器中设置ERASE_SEQ_ERROR位,并重置整个顺序(sequence)。

如果接收到一个不顺序的命令(除了SEND_STATUS),卡将在状态寄存器设置ERASE_RESET状态位,重置擦除顺序和执行最后的命令。

如果擦除范围包括写保护扇区,将不被擦除,擦除命令只擦除无保护的扇区。状态寄存器的WP_ERASE_SKIP位将设置。

地址设置命令中的地址是以字节为单位的块写地址。卡将忽略所有小于WRITE_BLK_LEN(CSD)LSB(最低有效位)。

如上所述的块写操作,卡通过保持DAT0为低电平指示擦除操作正在进行中。实际的擦除操作时间可能会很长,主机可以通过CMD7不选中卡或执行卡断开操作。

卡上擦除操作后的数据为“0”或“1”,由卡制造商确定。SCR寄存器的DATA_STAT_AFTER_ERASE(bit55)定义了是“0”或“1”。

4.4写保护管理

写保护方法如下:

●机械写保护开关(由主机负责)

●卡内部写保护(由卡负责)

●密码保护锁操作

4.4.1 机械写保护开关4.4.2 卡内部写保护4.4.3 密码保护锁操作

5时钟控制

SD卡主机可以使用SD卡总线时钟信号设置卡进入节能模式或控制总线上的数据流。主机可以降低时钟频率或直接关闭。

SD卡主机必须遵循下列约束:

●总线频率可以在任何时候改变(满足最大和最小值的约束)。

●ACMD41(SD_APP_OP_COND)是一个例外。发送ACMD41命令后,主机将执

行下面步骤1和步骤2直到卡进入就绪状态:

1)持续发送100KHZ-400KHZ之间的时钟频率。

2)如果主机要停止时钟,通过ACMD41命令以小于50ms的间隔设置busy位。

6 CRC7错误条件7.1 CRC和非法命令

8命令8.1卡类型

共有四类用来控制SD卡的命令:

●广播命令(bc),无响应——广播命令只有在所有CMD线一起连接到主机

时才能使用。如果分开连接,那么每个卡将单独接收命令。

●带响应的广播命令(bcr)——所有卡同时响应。因为SD卡没有开漏模式,

这个命令只有在所有的CMD线分开时采用使用。该命令将被每个卡分别接收

和响应。(OPEN DRAIN输出只能做输出口,当外部无上拉电阻时,该口为高阻

状态。只有外部有上拉电阻时,才有可能输出高或低的电平。)

●寻址(点对点)命令(ac)——DA T上没有数据传输。

●寻址(点对点)数据传输命令(adtc)——DAT上传输数据。

所有的命令和响应通过CMD线传输。

8.2命令格式

命令长度48位,1.92us@25MHZ

01bit

5...bit 0bit

31 (i)

bit

6...bit 0

1

起始位host命令参数CRC7end bit

7-bit CRC计算: G(x) = x7 + x3 + 1

M(x) = (start bit)*x39 + (host bit)*x38 +...+ (last bit before CRC)*x0

CRC[6...0] =余数[(M(x)*x7)/G(x)]

8.3命令分类

SD卡命令集分为几个类,每个类支持一个卡功能集合操作。

0123456789-11支持命令基本保留读块保留写块擦除写保护锁应用保留CMD0+

CMD2+

CMD3+

CMD4+

CMD7+

CMD9+

CMD10+

CMD12+

CMD13+

CMD15+

CMD16++

CMD17+

CMD18+

CMD24+

CMD25+

CMD27+

CMD28+

CMD29+

CMD30+

CMD32+

CMD33+

CMD38+

CMD42+

CMD55+ CMD56+ ACMD6+ ACMD13+ ACMD22+ ACMD23+ ACMD41+ ACMD42+ ACMD51+ 8.4详细命令描述

*所有无用位必须填入,但是值irrelevant

表4-3基本命令(类0和类1)

命令索引类型参数响应缩写描述

CMD0bc[31:0]无用—GO_IDLE_STATE

重置所有卡到Idle

状态

CMD1保留

CMD2bcr[31:0]无用R2ALL_SEND_CID

要求所有卡发送

CID号

CMD3Bcr[31:0]无用R6SEND_RELATIVE_ADDR 要求所有卡发布一个新的相对地址

RCA

CMD4不支持CMD5保留CMD6保留

CMD7ac

[31:16]RCA

[15:0]无用R1(

只来

自选

中的

卡)

选中/不选中卡

Command toggles a card

between the Stand-by

and Transfer states or

between the

Programming and

Disconnect state. In both

cases the card is selected

by its own relative

address and deselected

by any other address;

address 0 deselects all.

When the RCA equals 0,

the host may do one of

the following:

—use other RCA

number to perform

card deselection

Or

—re-send CMD3 to

change its RCA

number to other

then 0 and then use

SD卡的使用经验总结

由于自己也在使用SD卡,使用的过程中也遇到了一些问题,通过各方的总结,现将其整理一下,调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道了SD 卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写数据的问题。我自己定义了一个计算公式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。 8. 在写数据块前要先写入若干个dummy data字节,写完一个块数据时,主机要监测MISO数据线,如果从机处于忙状态这根数据线会保持低电平,这样主机就可以根据这根数据线的状态以决定是否发送下一个命令,在从机没有释放MISO数据线之前,主机绝对不能执行其他命令,否则将会导致写入的数据出错,而且从机也不会响应主机的命令。 9. 在SPI模式下,CRC校验是被忽略的,但依然要求主从机发送CRC码,只是数值可以是任意值,一般主机的CRC码通常设为0x00或0xFF。 读多块操作和写多块操作的传输停止形式不一样,读多块操作时用用命令CMD12终止传输,而写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)终止传输。

单片机读写SD卡API模式读写

单片机读写SD卡最简单最基本的程序 处理器:s3c44b0 (arm7) SD卡与处理器的引脚连接:MISO -->SIORxD MOSI -->SIOTxD CLK -->SCLK CS -->PE5 四个文件::用户API函数,移植时不需修改 :中间层函数,移植时不需修改 :硬件层函数,移植时需修改 :一些功能的宏定义,移植时需修改 第一次读写SD卡时,需调用SD_Init(void),然后就可以条用Read_Single_Block或者Write_Single_Block进行读写操作 注意:进行写操作时,最好不要写前700个扇区,应为这些扇区都是FAT文件系统的重要扇区,一旦误写则可能会导致SD无法被电脑识别,需格式化。 /******************************************************* 文件名: 作用:用户API函数,包括四个函数, 读取一块扇区(512字节)U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) 写一个扇区(512字节)U8 Write_Single_Block(U32 blk_addr, U8 *tx_buf) 获取SD卡基本信息,即读CSD寄存器信息(16字节):void SD_info() SD卡初始化:U8 SD_Init(void) ********************************************************/

/******************************************** 功能:读取一个block 输入:blk_addr为第几个block,rx_buf为数据缓存区首地址输出:返回NO_ERR则成功,其它则读取失败 ********************************************/ U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) { U16 rsp = 1; U8 i = 0; SD_sel(); //使能SD卡 while(rsp && (i < 100)) { write_cmd(CMD17, blk_addr << 9); //写命令CMD17 rsp = Get_rsp(R1); //获取答应 send_clk(); } if(i > 99) //如果命令超时,则执行超时处理 {

[XP系统]M9软件直接安装到SD卡教程

[XP 系统]M9 软件直接安装到 SD 卡教程
WIN7 系统魅友请看这里: https://www.doczj.com/doc/4d4475835.html,/thread-221-1-1.html M9 采用的 android2.2 系统, 默认支持 app2sd, 就是可以把软件安装到 sd 卡(前 提是软件支持安装到 sd 卡), 节省 ROM 空间,但是 默认系统 是按软件设置选择 安装位置,而大部分软件都默认安装到手机 ROM 空间。没有开启 app2sd 的情况 下,也不能手动移动到 SD 卡,这就造成经常出现空间不足 的尴尬。那么怎么开 启这项功能呢,请继续往下看。 一、准备篇 开始前,先介绍下要使用的工具--ADB。 adb 的全称为 Android Debug Bridge,是 android sdk 里的一个工具, 用这个工 具可以直接操作管理 android 模拟器或者真实的 andriod 设备(比如 M9)。它的 主要功能有:运行设备的 shell(命令行);管理模拟 器或设备的端口映射;计算 机和设备之间上传/下载文件;将本地 apk 软件安装至模拟器或 android 设备。 首先下载 adb 工具,下载地址:请点这里下载 下载完后解压后得到 4 个文件,将这四个文件全部拷贝到 C:\WINDOWS\system32 目录下。 接着完成 M9 与电脑同步的驱动安装等,假如你已经安装完成,那可以直接手机 端开启调试模式后连接 PC 进入下一步;还没有完成驱动安装的请先安装驱 动, 不会的可以到 https://www.doczj.com/doc/4d4475835.html,/thread-2329141-1-1.html 这里看,按这 个教程安装豌豆荚,自动安装驱 动,完成后不要拔数据线,直接进入下一步。 到此准备工作完成! 二、开启 app2sd 篇 这一步请仔细看截图操作即可,不多作说明。

SD卡-中文学习笔记

SD卡操作 一、概述 1、简介 SD卡是基于flash的存储卡。 SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD和SPI两类。 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_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。 3.4 内存组织 数据读写的基本单元是一个字节,可以按要求组织成不同的块。

STM32读写SD卡要点

3.20SD卡实验 很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有U盘,FLASH芯片,SD卡等。他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32Gb以上),而且支持SPI接口,方便移动,有几种体积的尺寸可供选择(标准的SD 卡尺寸,以及TF卡尺寸),能满足不同应用的要求。只需要4个IO口,就可以外扩一个最大达32GB以上的外部存储器,容量选择尺度很大,更换也很方便,而且方便移动,编程也比较简单,是单片机大容量外部存储器的首选。 ALIENTKE MiniSTM3开发板就带有SD卡接口,利用STM32自带的SPI接口,最大通信速度可达18Mbps,每秒可传输数据2M字节以上,对于一般应用足够了。本节将向大家介绍,如何在ALIENTEK MiniSTM32开发板上读取SD卡。本节分为如下几个部分: 3.20.1 SD卡简介 3.20.2 硬件设计 3.20.3 软件设计 3.20.4 下载与测试

3.20.1 SD卡简介 SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。 SD卡一般支持2种操作模式: 1,SD卡模式; 2,SPI模式; 主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。 SD卡的引脚排序如下图所示: 图3.20.1.1 SD卡引脚排序图 SD卡引脚功能描述如下表所示: 表3.20.1.1 SD卡引脚功能表 SD卡只能使用3.3V的IO电平,所以,MCU一定要能够支持3.3V的IO端口输出。 注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉电阻。 SD卡要进入SPI模式很简单,就是在SD卡收到复位命令(CMD0)时,CS为有效电平(低电平)则SPI模式被启用。不过在发送CMD0之前,要发送>74个时钟,这是因为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK时钟最大不能超过400Khz!。 ALENTEK MiniSTM32开发板使用的是SPI模式来读写SD卡,下面我们就重点介绍一下SD卡在SPI模式下的相关操作。 首先介绍SPI模式下几个重要的操作命令,如下表所示:

超强Android系统SD卡分区教程,加速你的Android系统

强烈分享分区软件 Acronis Disk Director Suite 10 通过读卡器给SD卡分三区的方法 Acronis Disk Director Suite 10 中文免注册版 68MB 下载地址: https://www.doczj.com/doc/4d4475835.html,/groups/@g165358/259136.topic 第一步、安装 Acronis Disk Director Suite 10 中文免注册版 第二步、将SD卡插入读卡器,读卡器再插进电脑USB接口 第三步、打开我的电脑,选择SD卡盘符鼠标右键选择格式化(FAT32)不要选择快速格式化 第四步、打开电脑里面的控制面板选择管理工具选择计算机管理 现在看左边,选择储存 -> 磁盘管理 现在看右边,看到你的 SD卡分区没? 鼠标放在你的 SD卡那个分区上,鼠标右键呼出菜单,选择删除磁盘分区,OK 第五步、打开 Acronis Disk Director Suite 10 你现在实际应该选择的分区顺序和大小是: 分第一个分区“FAT32”格式大小选择,你的卡的总容

量 xxxxMB 减 580MB,得出来的就都是FAT32的空间容量 分第二个分区“EXT3”格式大小选择,580MB-96MB(EXT3这个分区,300-499MB都可以,但注意不要超过499MB)一般来说这个分区大小在四百多MB,这个分区分的时候需要注意,这个区分完后剩余的空间大小不能超过96MB,推荐剩余94.13M,留给最后的一个分区就行了 分第三个分区“Linux交换”格式大小嘛,最后的都是它的咯,推荐94.13M 以上分区的时候,你之前划拨的空间与出来以后显示大小,肯定数字上有出入,这个正常,不去管它,你只要确认你分出来以后的大小就行了! 下面的第18步之前,你要确认你分的区是上面说的三个区,且 ETX3格式分区没有超过499MB、Linux交换格式分区没有超过96MB(或者说94.13MB), 1.点选已删除分区的SD卡,创建新的分区

SD卡读写包括两种模式

SD卡读写包括两种模式:SD模式和SPI模式。其中SD模式又可以分为1bit 和4bit两种传输模式。SD卡缺省使用专有的SD模式。SD卡规范中主要讲了一些命令,响应和CRC效验等等,整个规范的内容还是很多的。 SD卡上电后,卡处于空闲状态,主机发送CMD0复位SD卡,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。在得到了正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据块长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可以获知卡容量,支持的命令集等重要参数。此时,卡以进入了传输状态,主机就可以通过CMD17/18和CMD24/25对卡进行读写。CRC校验是为了防止SD卡的命令,应答,数据传输出现错误。每个命令和应答信号都会产生CRC效验码,每个数据块的传输也会长生CRC效验码。 这段程序是友善之臂推出的mini2440开发板中带的ADS测试源码。整个阅读代码的过程是对这S3C2440的芯片手册和SD卡规范来看的,对于MMC卡没有给出注释,其实和SD卡是大同小异。由于是初次接触ARM,对SD规范的认识也不是很深入,再加上自己水平有限,还不能完全读懂源代码,其中的肯定存在一些错误,欢迎大家一起交流讨论。

#define INT 1 #define DMA 2 int CMD13(void);// Send card status int CMD9(void); unsigned int*Tx_buffer;//128[word]*16[blk]=8192[byte] unsigned int*Rx_buffer;//128[word]*16[blk]=8192[byte] volatile unsigned int rd_cnt;//读数据计数器 volatile unsigned int wt_cnt;//写数据计数器 volatile unsigned int block;//读写块总数 volatile unsigned int TR_end=0; int Wide=0;// 0:1bit, 1:4bit int MMC=0;// 0:SD , 1:MMC int Maker_ID; char Product_Name[7]; int Serial_Num; volatile int RCA; void Test_SDI(void) { U32 save_rGPEUP, save_rGPECON; RCA=0;

SD卡分区简单教程

小田教你Sd卡分区,将程序从手机搬到SD卡,空间瞬间够用哒。。。忽忽~~~ 经过学习网上的一些教程以及自己操作过程出现的各种问题,给新人参考一哈子。 首先解释一哈为什么要给SD卡分区? 答:为了android手机能转移安装程序到SD卡并能自动将新下载的软件直接安装到SD卡中. PS:我的S4机身16G,一般情况下分析手机存储空间一定是够的,但我在实际使用过程中竟然出现了手机存储空间不够的提示,当时我手机里仅仅安装了不到20个软件,就以每个软件平均50M为例(实际最多30-40M),那实际软件占用的存储空间仅仅1000M,还不到1G,出现提示的时候我并没有多想,就只想想办法扩充空间,于是想到了运用SD卡,然后就有了今天大半天的辛勤劳动。其实在这个过程中我知道了提示信息的关键所在,那是因为我相册的信息也全部保存在设备里导致存储空间不足。而这个存储位置是支持修改的,修改过来就完全够用了,不过偶很执着,连续分区失败严重激发偶不服输滴精神,坚持要转移到SD卡,然后然后终于成功了! 下面,上菜: 1.电脑上下载Acronis Disk Director Suite汉化包并安装。 该软件是一款简单易用的磁盘分区软件。 2.用读卡器装上SD卡连接计算机 不可直接用手机数据线连接,因为识别方式不同,读取方式也不同。 3.格式化SD卡 也可以不格式化,但我直接格式化了 4.下面进行两次创建分区的操作,一个ext2,一个linux交换区,以下以其中一个为例图 文展示。 A.运行Acronis Disk Director Suite软件,可以看到读出来的盘符 B.选中盘符,点击左上方【创建分区】,出现以下界面:

sd卡电路图学习

,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI 控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

SD卡初始化及读写流程

SD卡初始化及读写流程 默认分类2010-03-03 21:03:00 阅读264 评论0 字号:大中小 SD卡调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程 序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8, 返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中 由于事先都知道了SD卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时: 100ms;写超时:250ms),这个值要在程序中准确计算出来,否

则将会出现不能正常读写数据的问题。我自己定义了一个计算公 式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在 地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节, 对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速 度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区 内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。

安卓软件安装到sd卡教程

安卓软件安装到sd卡教程,Android软件装到SD卡方法 很多android手机用户都在因手机内存而烦恼,自己的android机子一买来,安装了几个软件后就出现内存不足,而且无法安装大型的软件和游戏。普通的软件和游戏对于一些小内存的手机也是难以承受,装不了多少,这让我们看着android电子市场上成千上万的应用却无福享用啊。其实这是因为手机的ROM不支持app2SD,也就是所谓的把程序装进内存卡中,而不是手机内存中。对于app2SD的解释这里就不多说了,下面我们重点看一下如何实现app2SD吧。 App2SD操作原理如下: 将SD卡进行分区,分成三个区,第一分区:FA T32格式(windows可查看)第二分区:Linux Ext3 第三分区:Swap交换区(内存不足时调用)对内存卡分区需要用到的软件是WinPM,这是一款无损分区软件,非常强大,大家在网上很容易就能搜到,而且还有中文版的。 记得此软件安装在电脑端,并非安装在手机上,下载好WinPM以后,如果是绿色版的就直接解压,安装版的就先安装,接着打开winpm目录下的winpm.exe文件,运行WinPM 程序。 下面开始的分区过程操作: 1.打开winpm.exe后界面如下: 磁盘0是硬盘,一般磁盘1才是SD或TF卡。 2.在分区之前先将SD进行旧有分区进行删除操作,右键SD卡,点删除进入下面的窗口。 记得将“下一次不再询问”勾打上,否则无法删除。 3.删除好后,右键磁盘1的,绿色“自由”条,出现菜单后选择“创建” 创建分区为选择”主“分区不变。分区如下: 在此之前的自由空间:可以用于EXT3做为卡的第二分区,一般选512M,如果卡够大可以增加一些,其实一般512MB就足够了,多了也是浪费,即使装在卡上,装多了程序也会卡。 新大小:就是在电脑上可以看到的SD卡,也是软件安装的地方,建议1G以上 在此之后的自由空间:这分区用于交换区Swap,96M-256M之间够用了。 4.分区完成后点击确定,显示如下图: 这个是主区,系统类型选择“FA T32”然后点击确定即可。 5.创建Linux EXT3区,右键第一个自由条空间, 在弹出的菜单中选择“创建”确定后 系统类型选择EXTS3即可。 6.用同样方法选择第三个自由空间,右键“创建”, 系统类型选择:L-swap2 ,点击确定即可。 目前三个分区就已经全部分区完毕了。

SD卡读写操作 SD卡电路

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI 方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

sd卡读写程序(SDcardreadandwriteprogram)

sd 卡读写程序( SD card read and write program ) SD card read and write program Objective: To study the SD card / / operation Design / software 1, using SPI communication / / SD card 2, go to SD / / in order to 0-255 a total of 256 data, and then read back LCD1602 display / / hardware requirements: S11 ON / / dial switch Jumper J18 / / all connected #include //dsPIC30F6014 standard header file _FOSC( CSW_FSCM_O&F FX T_PLL4); //4 doubler crystal oscillator, Failsafe clock closed _FWDT (WDT_OFF); / / close the watchdog timer _FBORPO(RP BOR_OFF& MCLR_EN);/ / reset prohibited MCLRr eset enable. _FGS (CODE_PROT_OFF); / / code protection against #define CS PORTGbits.RG9 / / SD card selection pin definition #define RSL https://www.doczj.com/doc/4d4475835.html,TB4 / / definition LCDc ontrol bits (note here can only register with LATB, you cannot directly use the

moto里程碑sd卡教程

https://www.doczj.com/doc/4d4475835.html,/misc.php?action=rate&tid=214408&pid=4429744(经过这天各位广大同胞的测试和证实,证实了此方法大多数rom通用的猜想。童鞋们的回复里面大家自己翻一翻,也许也 能找到自己想要的答案,2楼我也更新了。) 这个方法是在下亲测的,理论上2.1、2.2rom通用。 当然,我用的是终结者2 终结版 rom,成功了! 大家自己看吧。当然,没有读卡器已经机器没有root的童鞋请直接无视此贴! 感谢clawneo实习斑竹收集来的教程https://www.doczj.com/doc/4d4475835.html,/android-208319-1-1.html。在下只 是做个整合而已。 gdisk_sd.rar (904.56 KB) sufbs.apk (683.75 KB) app2sd-2.1.rar (576.05 KB) app2sd-2.2.rar (1.99 KB) 废话不说,先把需要用到的附件下好,看看自己的rom版本。 (注:除gdisk_sd.rar和sufbs.apk必须下载之外 2.1rom的童鞋们请下app2sd-2.1.rar 2.2rom的童鞋们请下app2sd-2.2.rar) 步骤一:分区SD卡。 首先,把咱们的石头的内存卡取下来,放入读卡器中,连接电脑,格式化SD卡。 你可以选择快速格式化! 然后解压gdisk_sd.rar 运行里面的sd_gb文件。 按文字提示操作 1.第一步是选择磁盘,箭头指的数字是几就输入几。 2.第二步是选择要做的事情,选切出一个新磁区,选3 3.第三步了,记得,如果你是8G卡,读出来可能只有7600左右

SD卡引脚及spi模式基本操作过程

SD卡引脚及spi模式基本操作过程 (摘自网络) 对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 SD卡的引脚定义 SD卡引脚功能详述: 引脚编号 SD模式SPI模式 名称类型描述名称类型描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 VSS1 S 电源地VSS S 电源地 4 VDD S 电源VDD S 电源 5 CLK I 时钟SCLK I 时钟 6 VSS2 S 电源地VSS2 S 电源地 7 DAT0 IO或PP 数据线0 DO O或PP 数据输出 8 DAT1 IO或PP 数据线1 RSV 9 DAT2 IO或PP 数据线2 RSV 注:S:电源供给I:输入O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出 SD卡SPI模式下与单片机的连接图:

SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI 方式。这里只对其SPI方式进行介绍。 SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下:

单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡

点击查找(ctrl+F) 输入FAT(找到DBR处)

发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。注意有的winhex编址是十进制 看看程序吧 #include #define uchar unsigned char #define uint unsigned int //============================================================= //定义SD卡需要的4根信号线 sbit SD_CLK = P1^1; sbit SD_DI = P1^2; sbit SD_DO = P1^0; sbit SD_CS = P1^3; sbit Beep=P2^0;//用来调程序标志 //=========================================================== //=========================================================== //定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char xdata DATA[512]; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--); for(y=110;y>0;y--); }

基于Atmega128单片机SD卡读写程序(免费分享)

基于Atmega128单片机SD卡读写程序实物图对照 接线图

以下是一个简单的测试SD卡读写的程序,程序是基于Atmega128单片机编写的,对于Atmega的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。 sd.h //********************************************************** ******** //SPI各线所占用的端口 #define SD_SS PB6 #define SD_SCK PB1 #define SD_MOSI PB2 #define SD_MISO PB3 //********************************************************** ******** #define SD_DDR DDRB #define SD_PORT PORTB #define SD_PIN PINB #define SD_SS_H SD_PORT |= (1<#define SDSS_L SD_PORT &= ~(1<#define SD_SCK_H SD_PORT |= (1<#define SD_SCK_L SD_PORT &= ~(1<#define SD_MOSI_H SD_PORT |= (1<#define SD_MOSI_L SD_PORT

&= ~(1< #define SD_MISO_IN (SD_PIN&(1

SD卡SPI读写中文资料

7S P I模式 本文是小弟自己翻译的(处女作哦~~~~~),难免有不妥之处,望交流指教! 联系方式 QQ:286225453 Email:ioro55555@https://www.doczj.com/doc/4d4475835.html, 7.1介绍 SPI模式 SPI模式由二次传递协议组成,这个协议由Flash(基于SD卡)提供。本模式是SD卡协议的子协议,目的是用SPI信道通讯。SPI模式在SD卡上电后第一个复位指令(CMD0)执行后被选择,并且在接通电源时不能改变。SPI标准定义 7.2 SPI总线 SD卡信道由指令和数据位(起始位和结束位)组成,SPI信道由字节定向。每一个指令或数据块由8位的字节和CS标志构成。类似SD卡协议, SPI通讯由指令、响应和数据组成。全部的主机与SD卡之间的通信由主机控制。主机执行每一跟CS标志为低的总线。SPI模式与SD模式的响应特性有以下三方面不同∶ 1、被选择的卡始终对指令作出反应。 2、一个附加的(8BIT)响应产生。 3、在SD卡遇到数据检索问题时,它会作出错误反应,而不是像在SD模式中一样执行一次空操作。 除命令响应之外,每一个数据块在写操作期间会作出专门的信息响应标志反应发送给SD卡。数据块可以大到一个扇区小到一个字节。读/写操作由CSD(指令信号译码器)寄存器操作。 7.2.1模式选择 SD卡在上电后自动SD模式。如果CS标志在接受复位指令(CMD0)期间为低,它将进入SPI模式并且处于空闲状态。如果SD卡识别到需要保持SD模式,它不会对指令作出任何反应并且保持在SD模式中。如果需要SPI模式,SD卡将转到SPI模式并且进行SPI模式R1响应。回到SD模式的必须重新上电。在SPI 模式下,SD卡遵守部分协议系统。支持SPI模式的SD卡指令始终有效。 7.2.2总线传送保护 SPI模式

安卓手机SD卡分区和软件转移SD教程

1、先将SD卡分区,用winpm,分成一个FAT32,一个EXT2。两个分区都要是主分区(就是那个Pri......). SD卡分区: PS:对SD卡进行分区的软件和方法很多。本贴只举一例。另外。分区会导致卡里的内容全部丢失,所以请提前将卡里的内容复制出来备份好 SD卡分区软件WinPM.rar自己下载 安卓系统SD卡分区介绍 不要问我这个教程可以分几G的卡。我这教程里的卡是8G的。多大的卡都是可以分的 1.打开下载好的 win pm 2.将内存卡用读卡器连接至电脑,注意一定要使用读卡器,使用手机的磁盘模式会出问题 3.如图,我们可以看到内存卡盘符,右键点击删除,勾选“下一次不询问卷标”,"确定","确定"

4.之后,看到内存卡盘符已成为自由分区,这是我么再次右键点击创建,按图分配大小,其中新大小是之后能被电脑识别用来做存储用的空间大小,剩下的空间即是用来装手机程序的,大小自定,一般剩余留下512M做EXt分区就够了,我这里留下200M

5.随意输入卷名,分区FAT32,确定 6.这是会看到又多了一个自由分区,就是刚刚剩下的那一部分,再次右键创建,新大小天上剩下的空间即可,在此之后的自由空间为0,确定

7. 随意输入卷名,格式为EXT2FS,确定 8.这时候所有的更改都已经完成,但是这些更改并不是真的发生了,我们还需要点击左上角的应用,使刚才的更改生效。提示选是,然后耐心等待操作完成,完成后点击下方关闭按钮即可。

9.(重要的一步)这时候依然无法在电脑上看到FAT32分区的盘符,我们右键点击我的电脑(计算机)——管理,进入磁盘管理器,找到刚才分出的FAT分区,右键更改驱动器名和路径,点击添加,默认即可,确定。

读写SD卡的设计及其程序硬件

前言 长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD作为存储媒质。本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。 设计方案 应用AT89C52读写SD卡有两点需要注意。首先,需要寻找一个实现AT89C52单片机与SD卡通讯的解决方案;其次,SD卡所能接受的逻辑电平与AT89C52提供的逻辑电平不匹配,需要解决电平匹配问题。 通讯模式 SD卡有两个可选的通讯协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD卡控制器接口的MCU,或者必须加入额外的SD 卡控制单元以支持SD卡的读写。然而,AT89C52单片机没有集成SD卡控制器接口,若选用SD模式通讯就无形中增加了产品的硬件成本。在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。 虽然AT89C52不带SD卡硬件控制器,也没有现成的SPI接口模块,但是可以用软件模拟出SPI总线时序。本文用SPI总线模式读写SD卡。 电平匹配 SD卡的逻辑电平相当于3.3V TTL电平标准,而控制芯片AT89C52的逻辑电平为5V CMOS 电平标准。因此,它们之间不能直接相连,否则会有烧毁SD卡的可能。出于对安全工作的考虑,有必要解决电平匹配问题。 要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。 一般来说,通用的电平转换方案是采用类似SN74ALVC4245的专用电平转换芯片,这类芯片不仅可以用作升压和降压,而且允许两边电源不同步。但是,这个方案代价相对昂贵,而且一般的专用电平转换芯片都是同时转换8路、16路或者更多路数的电平,相对本系统仅仅需要转换3路来说是一种资源的浪费。

相关主题
文本预览
相关文档 最新文档