SD卡中文学习笔记.docx
- 文档编号:28061558
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:59
- 大小:687.60KB
SD卡中文学习笔记.docx
《SD卡中文学习笔记.docx》由会员分享,可在线阅读,更多相关《SD卡中文学习笔记.docx(59页珍藏版)》请在冰豆网上搜索。
SD卡中文学习笔记
SD卡操作
一、概述
1、简介
SD卡是基于flash的存储卡。
SD卡和MMC卡的区别在于初始化过程不同。
SD卡的通信协议包括SD和SPI两类。
SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。
2、功能介绍
2.1特点
1)主机无关的FLASH内存擦除和编程
读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。
当采用新型的FLASH时,主机代码无需更新。
2)缺陷管理
3)错误恢复
4)电源管理
Flash每个扇区有大约10万次的写寿命,读没有限制。
擦除操作可以加速写操作,因为在写之前会进行擦除。
3SD总线模式
3.1NegotiatingOperationConditions
当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。
要退出非活动状态唯一的方法就是重新上电。
3.2SD卡获取和识别
SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。
主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。
主机通过READ_CID命令读取CID寄存器。
CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。
DAT3线上内置的上拉电阻用来侦测卡。
在数据传输时电阻断开(使用ACMD42)。
3.3卡状态
卡状态分别存放在下面两个区域:
卡状态(CardStatus),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。
SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。
SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。
3.4内存组织
数据读写的基本单元是一个字节,可以按要求组织成不同的块。
Block:
块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD寄存器。
Sector:
和擦除命令相关,由几个块组成。
Sector的大小对每个设备是固定的,大小信息存储在CSD寄存器。
WPGroup:
写保护单位。
大小包括几个group,写保护由一位决定,对每个设备大小是固定的,存储在CSD寄存器。
3.5读写操作
SingleBlockMode:
主机根据事先定义的长度读写一个数据块。
由发送模块产生一个16位的CRC校验码,接受端根据校验码进行检验。
读操作的块长度受设备sector大小(512bytes)的限制,但是可以最小为一个字节。
不对齐的访问是不允许的,每个数据块必须位于单个物理sector内。
写操作的大小必须为sector大小,起始地址必须与sector边界对齐。
MultipleBlockMode:
主机可以读写多个数据块(相同长度),根据命令中的地址读取或写入连续的内存地址。
操作通过一个停止传输命令结束。
写操作必须地址对齐。
3.6数据传输速率
SD卡可以通过单数据线(DAT0)或四根数据线(DAT0-DAT3)进行数据传输。
单根数据线传输最大传输速率为25Mbit/s,四根数据线最大传输速率为100Mbit/s。
3.7数据保护
每个sector的数据通过ErrorCorrectionCode(ECC)进行保护。
在写sector时生成ECC,在读sector时检验ECC。
如果发现错误,在传输前进行纠正。
3.8数据擦除
SD卡数据擦除的最小单位是sector。
为了加速擦除操作,多个sector可以同时擦除。
为了方便选择,第一个指令包含起始地址,第二个指令包含结束地址,在地址范围内的所有sector将被擦除。
3.9写保护
两种写保护方式可供选择,永久保护和临时保护,两种方式都可以通过PROGRAM_CSD指令进行设置。
永久保护位一旦设置将无法清除。
3.10拷贝位
通过CSD寄存器中的拷贝位(copybit)设置SD卡中的数据是原始数据还是拷贝数据。
拷贝位一旦设置,将无法清除,在测试和格式化时使用。
3.11CSD寄存器
所有SD卡的配置信息存储在CSD寄存器。
通过SEND_CSD读取,PROGRAM_CSD修改。
4SPI模式
二、SD卡接口描述
1引脚和寄存器
主机通过9个引脚和SD卡相连
1.1SD模式引脚
扩展数据线(DAT1-DAT3)上电后为输入,SET_BUS_WIDTH命令执行后作为数据线。
即使只有DAT0使用,所有数据线都和外部上拉电阻连接,否则DAT1&DAT2(如果未被使用)的振荡输入将引起非期望的高电流损耗。
上电后,数据线输入50K(+/-20K)欧姆的上拉(用来进行卡侦测和SPI模式选择)。
用户可以在常规数据传输时,通过SET_CLR_CARD_DETECT(ACMD42)命令分离上拉。
1.2SPI模式引脚
1.3寄存器
名称
宽度
描述
CID
128
卡标识号
RCA
16
相对卡地址(Relativecardaddress):
本地系统中卡的地址,动态变化,在主机初始化的时候确定
*SPI模式中没有
CSD
128
卡描述数据:
卡操作条件相关的信息数据
SCR
64
SD配置寄存器:
SD卡特定信息数据
OCR
32
操作条件寄存器
主机通过重新上电来重置(reset)卡。
卡有它自身检测上电的电路,当上电后卡状态切换到idle状态。
也可以通过GO_IDLE(CMD0)指令来重置。
2SD卡总线拓扑
SD总线有6根通信线和三根电源供应线:
✧CMD——命令线是双向信号线。
主机和卡通过pushpull模式工作。
✧DAT0-3——数据线是双向信号线。
主机和卡通过pushpull模式工作。
✧CLK——时钟是从主机到卡的信号。
CLK通过pushpull模式操作。
✧VDD—VDD是所有卡的电源供应线。
✧VSS[1:
2]—VSS是2根地线。
在初始化的时候,向每个卡分别发送命令,允许应用检测卡并给物理槽(physicalslot)分配逻辑地址。
数据通常分别传输给每个卡。
然后,为了方便处理卡堆栈,初始化后所有命令同时发送给所有卡,在命令数据包中包含了操作地址。
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.1OCR(OperatingConditionsRegister)
32位的操作条件寄存器存储了VDD电压范围。
SD卡操作电压范围为2~3.6V。
然而从内存中访问数据的电压是2.7~3.6V。
OCR显示了卡数据访问电压范围,结构如下表所示。
表3-8OCR寄存器定义
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位(busybit)置位,表明卡上电过程已结束。
5.2CID(CardIdentification)
CID寄存器长度为16个字节的卡唯一标识号,该号在卡生产厂家编程后无法修改。
SD和MMC卡的CID寄存器结构不一样。
名称
类型
宽度
CID位
内容
CID值
厂商ID
Binary
8
[127:
120]
SD卡协会管理和分配
0x03
OEM/ApplicationID(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年的偏移量)
如:
Apr2001=0x014
CRC7校验和(CRC)
Binary
7
[7:
1]
CRCCalculation:
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”表示为01100010
5.3CSD(CardSpecificData)
CSD寄存器包含访问卡数据所需的配置信息。
SD卡和MMC卡的CSD不同。
6数据交互格式和卡容量
通常,SD卡分为2个区:
✧用户区—用户通过读写命令存储安全和非安全数据。
✧安全保护区(SecurityProtectedArea)—版权保护应用程序用来保存安全相关数据,通过SD安全规范中定义的条件验证后,由主机使用安全的读写指令完成操作。
安全保护区的大小大概是总大小的1%。
三、SD卡协议
1SD总线协议
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驱动。
总线激活后,主机要求卡发送它们的有效操作条件(ACMD41precedingwithAPP_CMD—CMD55withRCA=0x0000)。
ACMD41命令的响应是卡的操作条件寄存器。
相同的命令将发送给系统中所有的卡。
不兼容的卡将进入Inactive状态。
主机然后发送命令ALL_SEND_CID(CMD2)到每个卡以获取每个卡的唯一标识CID号。
未识别的卡通过CMD线发送CID号作为响应。
当卡发送CID号后,进入识别状态(IdentificationState)。
此后,主机发送CMD3(SEND_RELATIVE_ADDR)要求卡发布一个新的相对卡地址RCA,地址比CID短,在以后的数据传输模式中用来寻址卡。
一旦获得RCA后,卡状态变成就绪状态(Stand-bystate)。
此时,如果主机要求卡换成其他的RCA号,可以通过发送另一个SEND_RELATIVE_ADDR命令给卡,要求发布一个新的RCA,最后发布的RCA是实际使用的RCA。
主机对系统中的每个卡重复识别过程。
所有的SD卡初始化完以后,系统将开始初始化MMC卡(如果有的话),使用MMC卡的CMD2和CMD3。
4数据传输模式
直到主机知道所有CSD寄存器的内容,fpp时钟速率必须保持在fOD,因为一些卡有操作频率限制。
主机发送SEND_CSD(CMD9)获取卡定义数据(CardSpecificData,CSD寄存器),如块大小、卡存储容量、最大时钟速率等。
CMD7用来选择一个卡并将它置于传输状态(Transferstate),在任何时间只能有一个卡处于传输状态。
如果已有一个卡处于传输状态,它和主机的连接将释放,并返回到Stand-by状态。
当CMD7以保留相对地址“0x0000”发送时,所有卡将返回到Stand-by状态。
这可以用来识别新的卡而不重置其他已注册的卡。
在这种状态下已有一个RCA地址的卡不响应识别命令(ACMD41,CMD2,CMD3)。
注意:
当卡接收到一个带有不匹配RCA的CMD7时,卡将取消选中。
在公用CMD线时,选中一个卡时将自动不选中其他卡。
因此,在SD卡系统中,主机具有如下功能:
●初始化完成后,在公用CMD线时,不选中卡是自动完成的。
●如果使用单独的CMD线,需要关注不选中卡的操作
在主机和选择的SD卡之间的所有数据通信是点对点的方式。
所有寻址命令都需要响应。
不同数据传输模式的关系如图4-8所示,使用如下步骤:
●所有读数据命令可以在任何时候通过停止命令(stopcommand,CMD12)中止。
数据传输将中止,卡回到传输状态(TransferState)。
读命令有:
块读命令(CMD17),多块读命令(CMD18),发送读保护(CMD30),发送scr(ACMD51),以及读模式的通用命令(CMD56)。
●所有写数据命令可以在任何时候通过停止命令(stopcommand,CMD12)中止。
在不选中卡命令CMD7前写命令必须停止。
写命令有:
块写命令(CMD24andCMD25),写CID(CMD26),写CSD(CMD27),lock/unlock命令(CMD42)以及写模式通用命令(CMD56)。
●一旦数据传输完成,卡将退出数据写状态并进入ProgrammingState(传输成功)或TransferState(传输失败)。
●如果一个快写操作停止,而且最后一块块长度和CRC是有效的,那么数据可以被操作(programmed)。
●卡可能提供块写缓冲。
这意味着在前一块数据被操作时,下一块数据可以传送给卡。
如果所有卡写缓冲已满,只要卡在ProgrammingState,DAT0将保持低电平(BUSY)。
●写CSD、CID、写保护和擦除时没有缓冲。
这表明在卡因这些命令而处于忙时,不再接收其他数据传输命令。
在卡忙时DAT0保持低电平,并处于ProgrammingState。
实际上如果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命令只在“transtate”有效,即只有在卡选中后(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命令,设置的预擦除数将在其他指令执行时自动清除。
发送写数据块数目
系统使用管道机制
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SD 中文 学习 笔记