2023年12月15日发(作者:)
SD卡操作
一、 概述
1、简介
SD卡是基于flash的存储卡。
SD卡和MMC卡的区别在于初始化过程不同。
SD卡的通信协议包括SD和SPI两类。
SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。
2、功能介绍
1) ** 特点
主机无关的FLASH内存擦除和编程
读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。当采用新型的FLASH时,主机代码无需更新。
2) 缺陷管理
3) 错误恢复
4) 电源管理
Flash每个扇区有大约10万次的写寿命,读没有限制。
擦除操作可以加速写操作,因为在写之前会进行擦除。
3 SD总线模式
** Negotiating Operation Conditions
当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。要退出非活动状态唯一的方法就是重新上电。
** SD卡获取和识别
SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。
主机通过READ_CID命令读取CID寄存器。CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。
DAT3线上内置的上拉电阻用来侦测卡。在数据传输时电阻断开(使用 ACMD42)。
** 卡状态
卡状态分别存放在下面两个区域:
卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。
SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。
** 内存组织
数据读写的基本单元是一个字节,可以按要求组织成不同的块。
Block:块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD寄存器。
Sector:和擦除命令相关,由几个块组成。Sector的大小对每个设备是固定的,大小信息存储在CSD寄存器。
WP Group:写保护单位。大小包括几个group,写保护由一位决定,对每个设备大小是固定的,存储在CSD寄存器。
** 读写操作
Single Block Mode:主机根据事先定义的长度读写一个数据块。由发送模块产生一个16位的CRC校验码,接受端根据校验码进行检验。读操作的块长度受设备sector大小 (512
bytes)的限制,但是可以最小为一个字节。不对齐的访问是不允许的,每个数据块必须位于单个物理sector内。写操作的大小必须为sector大小,起始地址必须与sector边界对齐。
Multiple Block Mode:主机可以读写多个数据块(相同长度),根据命令中的地址读取或写入连续的内存地址。操作通过一个停止传输命令结束。写操作必须地址对齐。
** 数据传输速率
SD卡可以通过单数据线(DAT0)或四根数据线(DAT0-DAT3)进行数据传输。单根数据线传输最大传输速率为25 Mbit/s,四根数据线最大传输速率为100 Mbit/s。
** 数据保护
每个sector的数据通过Error Correction Code (ECC)进行保护。在写sector时生成ECC,在读sector时检验ECC。如果发现错误,在传输前进行纠正。
**数据擦除
SD卡数据擦除的最小单位是sector。为了加速擦除操作,多个sector可以同时擦除。为了方便选择,第一个指令包含起始地址,第二个指令包含结束地址,在地址范围内的所有sector将被擦除。
** 写保护
两种写保护方式可供选择,永久保护和临时保护,两种方式都可以通过PROGRAM_CSD指令进行设置。永久保护位一旦设置将无法清除。
** 拷贝位
通过CSD寄存器中的拷贝位(copy bit)设置SD卡中的数据是原始数据还是拷贝数据。拷贝位一旦设置,将无法清除,在测试和格式化时使用。
** CSD寄存器
所有SD卡的配置信息存储在CSD寄存器。通过SEND_CSD读取,PROGRAM_CSD修改。
4 SPI模式
二、 SD卡接口描述
1 引脚和寄存器
主机通过9个引脚和SD卡相连
** SD模式引脚
扩展数据线(DAT1-DAT3)上电后为输入,SET_BUS_WIDTH命令执行后作为数据线。即使只有DAT0使用,所有数据线都和外部上拉电阻连接,否则DAT1 & DAT2(如果未被使用)的振荡输入将引起非期望的高电流损耗。
上电后,数据线输入50K(+/-20K)欧姆的上拉(用来进行卡侦测和SPI模式选择)。用户可以在常规数据传输时,通过SET_CLR_CARD_DETECT (ACMD42)命令分离上拉。
** SPI模式引脚
** 寄存器
名称
CID
RCA
宽度 描述
128
16
卡标识号
相对卡地址(Relative card address):本地系统中卡的地址,动态变化,在主机初始化的时候确定
*SPI模式中没有
卡描述数据:卡操作条件相关的信息数据
SD配置寄存器:SD卡特定信息数据
操作条件寄存器
CSD
SCR
OCR
128
64
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]—VSS是2根地线。
在初始化的时候,向每个卡分别发送命令,允许应用检测卡并给物理槽(physical slot)分配逻辑地址。数据通常分别传输给每个卡。然后,为了方便处理卡堆栈,初始化后所有命令同时发送给所有卡,在命令数据包中包含了操作地址。
SD总线允许动态配置数据线数目。上电后默认SD卡只用DAT0作为数据传输线。初始化后,主机可以改变总线宽度。这个特性使得在硬件开销和系统性能间取得平衡。
3 SPI总线拓扑
4 电气接口
** 上电
上电后,包括热插入,卡进入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 寄存器
** OCR(Operating Conditions Register)
32位的操作条件寄存器存储了VDD电压范围。SD卡操作电压范围为2~3.6V。然而从内存中访问数据的电压是2.7~3.6V。OCR显示了卡数据访问电压范围,结构如下表所示。
表3-8 OCR寄存器定义
OCR位
0-3
4
VDD电压范围
保留
**~1.7
**~1.8
5
6
**~1.9
**~2.0
7
8
**~2.1
**~2.2
9
10
**~2.3
**~2.4
11
12
**~2.5
**~2.6
13
14
**~2.7
**~1.8
15
16
**~2.9
17
**~3.0
**~3.1
18
19
**~3.2
**~3.3
20
21
**~3.4
**~3.5
22
23
**~3.6
保留
卡上电状态位(忙)
24-30
31
OCR结构如下图所示。如果第32位(busy bit)置位,表明卡上电过程已结束。
** CID(Card Identification)
CID寄存器长度为16个字节的卡唯一标识号,该号在卡生产厂家编程后无法修改。SD和MMC卡的CID寄存器结构不一样。
名称 类型 宽度
CID位 内容 CID值
厂商ID
Binary 8
16
[127:120]
SD卡协会管理和分配
0x03
OEM/Application ASCII
ID(OID)
产品名(PNM)
ASCII
产品版本(PRV)
BCD
[119:104]
识别卡的OEM或卡内容,由制0x53,0x44
造商分配
40
8
[103:64]
[65:56]
5个ASCII字符
2个二进制编码的十进制数
SD128
产品版本(30)1
序列号(PSN)
保留
Binary
32
4
12
[55:24]
[23:20]
[19:8]
32位无符号整数
yym(从2000年的偏移量)
产品序列号
如:Apr 生成日期(MDT)
BCD
2001=0x014
CRC7校验和Binary
(CRC)
7 [7:1]
CRC Calculation: G(x)=x7+3+1
M(x)=(MID-MSB)*x119+...+(CIN-LSB)*x0
0]=Remainder[(M(x)*x7)/G(x)]
CRC7
未用
1 [0:0]
1、格式为“n.m”,如“6.2”表示为0110 0010
** 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线。
** 重置
GO_IDLE_STATE(CMD0)是软件重置命令,设置每个SD卡进入Idle状态。处于Inactive状态的卡不受此命令影响。
主机上电后,所有SD卡进入Idle状态,包括处于Inactive状态的卡。至少74个时钟周期后才能开始总线传输。
上电或CMD0后,所有SD卡的命令线处于输入模式,等待下一个命令的起始位。卡通过一个默认的相对卡地址RCA(RCA=0x0000)和默认驱动寄存器设置(最低速,最高驱动电流)初始化。
** 操作电压范围验证
SD的物理规范标准要求所有SD卡能通过最小和最大供电电压间的任何电压和主机建立通信。然而,数据传输时的最小和最大电压值在操作条件寄存器OCR中定义,可能并不能覆盖所有的电压范围。SD卡主机希望通过读取卡的OCR寄存器获取合适的电压值或弹出卡。
SD卡
** 卡识别过程
在识别时钟速率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所示,使用如下步骤:
所有读数据命令可以在任何时候通过停止命令(**mand,CMD12)中止。数据传输将中止,卡回到传输状态(Transfer State)。读命令有:块读命令(CMD17),多块读命令(CMD18),发送读保护(CMD30),发送scr(ACMD51),以及读模式的通用命令(CMD56)。
所有写数据命令可以在任何时候通过停止命令(**mand,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位总线宽度)操作模式通过ACMD6选择和不选择。在上电后或GO_IDLE(CMD0)命令后默认的总线宽度是1位。ACMD6命令只在“tran
state”有效,即只有在卡选中后(CMD7)总线宽度才能修改。
** 读数据格式
DAT总线在没有数据传输时处于高电平。一个传输数据块包含一个起始位(LOW),接着连续的数据流。数据流包含有效数据(如果使用了ECC了还包括错误纠正位)。数据流以一个结束位(HIGH)结束。数据传输和时钟信号同步。
以块传输的有效数据包含CRC校验和。产生多项式是标准 CCITT多项式。
xxx1
采用了缩短的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状态)停止命令。
16125** 数据写格式
数据写传输格式类似于读格式。对于以块为单位的写数据传输,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”。
** 写保护管理
写保护方法如下:
机械写保护开关(由主机负责)
卡内部写保护(由卡负责)
密码保护锁操作
** 机械写保护开关
** 卡内部写保护
** 密码保护锁操作
5 时钟控制
SD卡主机可以使用SD卡总线时钟信号设置卡进入节能模式或控制总线上的数据流。主机可以降低时钟频率或直接关闭。
SD卡主机必须遵循下列约束:
总线频率可以在任何时候改变(满足最大和最小值的约束)。
ACMD41(SD_APP_OP_COND)是一个例外。发送ACMD41命令后,主机将执行下面步骤1和步骤2直到卡进入就绪状态:
1) 持续发送100KHZ-400KHZ之间的时钟频率。
2) 如果主机要停止时钟,通过ACMD41命令以小于50ms的间隔设置busy位。
6 CRC
7 错误条件
** CRC和非法命令
8 命令
** 卡类型
共有四类用来控制SD卡的命令:
广播命令(bc),无响应——广播命令只有在所有CMD线一起连接到主机时才能使用。如果分开连接,那么每个卡将单独接收命令。
带响应的广播命令(bcr)——所有卡同时响应。因为SD卡没有开漏模式,这个命令只有在所有的CMD线分开时采用使用。该命令将被每个卡分别接收和响应。(OPEN DRAIN输出只能做输出口,当外部无上拉电阻时,该口为高阻状态。只有外部有上拉电阻时,才有可能输出高或低的电平。)
寻址(点对点)命令(ac)——DAT上没有数据传输。
寻址(点对点)数据传输命令(adtc)——DAT上传输数据。
所有的命令和响应通过CMD线传输。
** 命令格式
命令长度48位,1.92us@25MHZ
0
起始位
1
host
bit 0
命令
bit 0
参数
bit 0
CRC7
1
end bit
7-bit CRC 计算: G(x) = x7 + x3 + 1
M(x) = (start bit)x39 + (host bit)x38 +...+ (last bit before CRC)x0
0] = 余数[(M(x)x7)/G(x)]
** 命令分类
SD卡命令集分为几个类,每个类支持一个卡功能集合操作。
支持命令
0
基本
1
保留
2
读块
3
保留
4
写块
5
擦除
6
写保护
7 8 9-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
+
+
+
+
+
+
+
+
+
+
+
** 详细命令描述
*所有无用位必须填入,但是值irrelevant
表4-3 基本命令(类0和类1)
命令索引 类型
CMD0
CMD1
CMD2 bcr [31:0]无用 R2
bc
参数
[31:0]无用
响应
—
缩写
GO_IDLE_STATE
状态
保留
要求所有卡发送ALL_SEND_CID
CID号
要求所有卡发布一CMD3 Bcr [31:0]无用 R6 SEND_RELATIVE_ADDR 个新的相对地址RCA
CMD4
CMD5
CMD6
CMD7 ac [31:16]RCA R1(只不支持
保留
保留
选中/不选中卡
Command toggles a
card between the
描述
重置所有卡到Idle
[15:0]无用 来自选中的卡)
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 CMD7
with RCA=0 for card
de-selection.
CMD8
[31:16] RCA
CMD9 ac
[15:0]无用
[31:16] RCA
CMD10 ac
[15:0]无用
[31:0]数据CMD11 adtc
地址
R1
R2
R2
保留
寻址卡并让其发送SEND_CSD
卡定义数据CSD
寻址卡并让其发送SEND_CID
卡识别号CID
从卡读取数据流,从READ_DAT_UNTIL_STOP 给定地址开始,知道停止传输命令结束
中止多个块的读/写CMD12 ac [31:0]无用
[31:16] RCA
R1b STOP
操作
寻址卡并发送卡状CMD13
CMD14
ac
[15:0]无用
R1 SEND_STATUS
态寄存器
保留
[31:16] RCA
CMD15 ac
[15:0]无用
_ GO_INACTIVE_STATE
设置卡到inactive状态
表4-4 块读操作命令(类2)
命令索引
CMD16
类型
ac
度
[31:0]数据CMD17 adtc
地址
[31:0]数据CMD18
CMD19-23
adtc
地址
保留
R1 READ_MULTIPLE_BLOCK
直到停止命令
连续读取多个块,R1 READ_SINGLE_BLOCK 读取一个块
参数
[31:0]块长R1 SET_BLOCKLEN
指令设置块长度
响应 缩写 描述
为接下来的块操作
表4-5 块写操作命令(类4)
类命令索引
型
[31:0]
CMD24 adtc 数据地址
[31:0]数CMD25 adtc
据地址
CMD26
[31:0]无CMD27 adtc
用
R1 PROGRAM_CSD 编辑CSD位
R1
_BLOCK
命令
不支持
WRITE_ MULTIPLE
STOP_TRANSMISSIONR1 WRITE_BLOCK
参数
应
写一个长度由SET_BLOCKLEN指定的块
连续写多个块直到响缩写 描述
表4-6 写保护(类6)
命令索引 类型 参数
[31:0]
CMD28 ac 数据地址
R1b SET_WRITE_PROT
响应 缩写 描述
设置地址组保护位。写保护由卡配置数据的WP_GRP_SIZE指定
[31:0]CMD29 ac 数据地址
[31:0]写保护CMD30 adtc
数据地址
CMD31 保留
R1 SEND_WRITE_PROT
态
要求卡发送写保护位状R1b CLR_WRITE_PROT 清除保护位
表4-7 擦除命令(类5)
命令索引 类型 参数
[31:0]
设置要擦除的第一个写CMD32 ac 数据地址
[31:0]
设置要擦除的最后一个CMD32 ac 数据地址
CMD34
…
CMD37
[31:0]CMD38
CMD39
…
CMD41
保留
ac
无用
R1b ERASE
块
擦除所有选中的写数据保留
R1 ERASE_WR_BLK_END
写数据块地址
R1 ERASE_WR_BLK_START
数据块地址
响应 缩写 描述
表4-7 擦除命令(类5)
命令索引
CMD32
类型
ac
数据地参数
[31:0]
R1 ERASE_WR_BLK_START
数据块地址
响应 缩写 描述
设置要擦除的第一个写
址
[31:0]
设置要擦除的最后一个CMD32 ac 数据地址
CMD34
…
CMD37
[31:0]CMD38
CMD39
…
CMD41
保留
ac
无用
R1b ERASE
块
擦除所有选中的写数据保留
R1 ERASE_WR_BLK_END
写数据块地址
表4-8 卡锁命令(类7)
命令索引
CMD42
….
CMD54
SDA可选命令
类型 参数 响应 缩写 描述
表4-9 应用相关(Application Specific)命令(类8)
命令索引
CMD55
类型
ac
[15:0]填充位
[31:1] 填充位
应用相关(通用目的)的数据CMD56 adtc [0]:RD/WR,1读,0写
CMD57 保留
R1 GEN_CMD
块读写命令
参数
[31:16] RCA
R1 APP_CMD
相关命令,而非标准命令。
响应 缩写 描述
告诉卡接下来的命令是应用
…
CMD59
CMD60
…
CMD63
厂商保留
*命令相关命令,可能指SD卡专用命令
所有应用相关命令之前必须先执行APP_CMD(CMD55)。
表4-10 SD卡使用/保留的应用相关命令
ACMD
类型
索引
[31:2] 填充位
ACMD6 ac
[1:0]总线宽度
ACMD13
adtc
位
ACMD17
ACMD18
ACMD19
…
ACMD21
ACMD22
adtc
应为32位+CRC
ACMD23
ac
[31:23]填充位
[22:0]数据块数目
R1 SET_WR_BLK_ERASE_COUNT
设置写前预擦除的数据块数目(用来加速多数据块写操作)。“1”=默认(一个块)(1)
ACMD24 保留
[31:0]填充位 R1
—
— — —
保留
保留作为SD安全应用
保留
SEND_NUM_WR_BLOCKS
发送写数据块的数目。响[31:0] 填充R1 SD_STATUS 设置SD卡状态
R1 SET_BUS_WIDTH
10:4bit
00:1bit
参数 响应 缩写 描述
ACMD25
ACMD26
ACMD38
ACMD39
…
ACMD40
ACMD41
—
—
—
—
—
—
—
—
—
—
—
—
保留作为SD安全应用
保留作为SD安全应用
保留作为SD安全应用
保留
[31:0]OCR
without busy
bcr
R3 SD_APP_OP_COND
要求访问的卡发送它的操作条件寄存器(OCR)内容
ACMD42
ac
[31:1]填充位 R1
[0]set_cd
SET_CLR_CARD_DETECT
连接[1]/断开[0]卡上CD/DAT3(pin 1]的50K欧姆上拉电阻。上拉电阻可用来检测卡
ACMD43
—
ACMD49
ACMD51 adtc
— — —
保留作为SD安全应用
[31:0]填充位 R1 SEND_SCR
读取SD配置寄存器SCR
(1)不管是否使用ACMD23,在多数据块写操作中都需要STOP_TRAN(CMD12)命令
9 卡状态迁移表
10 响应
所有响应通过CMD线传输,响应以MSB开始,不同类型的响应长度根据类型不同而不同。
响应以起始位开始(通常为“0”),接着这是传输方向的位(卡为0)。除了R3外其他响应都有CRC。每个响应都以结束位(通常为“1”)结束。
共有四类响应,格式分别为:
R1(标准响应):长度48位
Bits45:40指示被响应的命令索引号。如果有到卡的数据传输,每个数据块传输后数据线上都会出现忙信号。主机在数据块传输后检测忙信号。
表4-12 响应R1
起始位
Width
值
描述
47
1
0
起始位
46
1
0
传输位
[45:40]
6
x
命令索引
[39:8]
32
x
卡状态
[7:1]
7
x
CRC7
0
1
1
结束位
Rb1和 R1相同,带有一个可选的忙信号传输。根据接收到命令前的状态和接收到的命令可能变成忙。主机可以在响应时检测忙信号。
R2(CID,CSD):响应长度为136位
CID寄存器内容作为CMD2和CMD10的响应发送。CSD寄存器内容作为CMD9的响应发送。只传输CID和CSD的[127…1]位,寄存器的[0]位被响应的结束位取代。
表4-13 响应R1
起始位
Width
值
描述
135
1
0
起始位
134
1
0
传输位
[133:128]
6
‘111111’
保留
[127:1]
127
x
CID或CSD,包括内容CRC7
0
1
1
结束位
R1(OCR寄存器):长度48位
OCR寄存器作为ACMD41的响应发送。
四、 在S3C2410中的使用
1 基本操作
** SDI操作
根据传输频率设置SDIPRE寄存器,改变频率可以调整波特率。
操作步骤:
1) 设置SDICON,设置时钟和中断
2) 设置SDIPRE
3) 等待74SDCLK,初始化卡
1) ** CMD Path Programming
写命令参数(32-bit)到SDICARG寄存器
2) 通过设置SDICCON[8]确定命令类型和起始命令
3) 当SDICSTA的特殊标记设置时,确定SDI命令操作的结束方式:
a) 如果是无响应(no-response)命令,标记是SDICSTA[11]
b) 如果是有响应(with-response)命令,标记是SDICSTA [9]
4) 清除SDICSTA寄存器相应标记
1) ** DAT Path Programming
在SDIDTIMER寄存器中设置超时
2) 在SDIBSIZE中设置块大小,通常为0x200
3) 在SDIDCON寄存器中设置块模式(mode of block)、总线宽度(bus width)、DMA等以及开始数据传送
4) 通过检查SDIFSTA判断Tx FIFO的可用性(available,half or empty),当可用时(available)写Tx-data到SDIDAT寄存器
5) 通过检查SDIFSTA判断Rx FIFO的可用性(available,half or empty),当可用时(available)从SDIDAT寄存器读数据到Rx-data
6) 当传输结束标记SDIDSTA[4]置位时,确定SDI数据操作的数据
7) 清除SDIDSTA寄存器相应位
2 SDIO操作
两类SDIO操作:SDIO中断接收和读等待请求,分别通过SDICON寄存器的RcvIOInt位和RwaitEn位标记。
** SDIO中断
在SD1位模式,中断从SDDAT1脚接收所有范围的中断。
在SD4位模式,SDDAT1脚共享为接收数据和中断。中断检测范围(Interrupt Period):
1) 单数据块:A和B之间的间隔
——A:数据组装(packet)结束后2个时钟周期
2) ——B:下一条带数据命令(with-**mand)最后一位发送结束
多数据块,SDIDCON[21]=0:A和B之间的时间,在范围C检测重启动(restart)中断
——A:数据组装结束后2个时钟周期
——B:A后2个时钟周期
——C:中止命令响应最后一位后2个时钟
3) 多数据快,SDIDCON[21]=1:A和B之间,在A重启动
——A:数据组装结束后2个时钟周期
——A后2个时钟周期
** 读等待请求(Read Wait Request)
无论1位还是4位模式,读等待请求信号在下述情况下通过SDDAT2脚传送:
1) 在读多块操作,请求信号在数据块结束后2个时钟开始传输
2) 传输在用户向SDIDSTA[10]中写1后结束
3寄存器
** SDICON
寄存器名
SDICON
0x5A000000
地址 R/W 描述 重置值
R/W
SDI控制寄存器
0x0
SDICON
字节顺序类型
(ByteOrder)
位
[4]
描述
确定读写时的字节顺序类型
0=Type A, 1=Type B
- Type A: D[7:0] D[15:8] D[23:16] D[31:24]
- Type B: D[31:24] D[23:16] D[15:8] D[7:0]
初始值
0
从卡接收SDIO中断
(RcvIOInt)
读等待使能
(RWaitEn)
[2]
[3] 确定SD主机是否接收卡(或SDIO)的SDIO中断
0:不接收 1:接收
在多数据块读模式中当SD主机等待下一个数据块时是否产生读等待请求信号。这一位需要延迟从卡传输下一数据块。
0: 不产生 1:产生
FIFO重置
(FRST)
Clock out Enable
(ENCLK)
[0]
[1] 重置FIFO值,该位自动清除
0: 普通模式 1:FIFO重置
是否使能SDCLK Out
0: 禁止(不分频) 1:使能
0
0
0
0
**
SDIPRE(SDI模特率分频寄存器)
寄存器名
SDIPRE
SDIPRE名 位
分频值
[7:0]
地址 R/W 描述 重置值
0x5A000004
R/W SDI模特率分频寄存器
0x0
描述
确定SDI时钟率:
Baud rate=PCLK/2/(prescaler value+1)
地址 R/W 描述
初始值
0x00
**
SDICARG(SDI命令参数寄存重置值
器)
寄存器名
SDICARG
SDICARG 位
CmdArg
[31:0]
描述
命令参数
地址 R/W 描述
初始值
0x00000000
0x5A000008
R/W SDI命令参数寄存器
0x0
**
SDICCON(SDI命令控制寄存器)
寄存器名
SDICCON
SDICCON 位
重置值
0x5A00000C
R/W SDI命令控制寄存器
0x0
描述
确定是否是中止命令类型
0: 普通命令 1:中止命令(CMD12,CMD52)
确定命令类型是否是带数据命令
0: 否,无数据 1:带数据
确定主机是否接收136位长的响应
0: 短响应格式 1:长响应格式
确定主机是否等待响应
0: 不等待 1:等待
确定命令是否开始操作
0: 命令就绪 1:命令开始
带2个开始位的命令索引
R/W 描述
初始值
0
中止命令 [12]
(AbortCmd)
带数据命令
(WithData)
LongRsp
WaitRsp
命令开始
(CMST)
CmdIndex
[11]
[10]
[9]
[8]
[7:0]
0
0
0
0
0x00
重置值
**
SDICSTA(SDI地址
命令状态寄存器)
寄存器名
SDICSTA
SDICSTA 位 描述
当接收到命令响应时CRC校验是否失败,该位通过写1清0
0: 无 1:失败
命令发送(不管是否响应),该位通过写1清0
0: 无 1:命令结束
命令响应超时(64clk),该位通过写1清0
0: 无 1:超时
响应接收结束,该位通过写1清0
0: 无 1:响应结束
命令传输操作中
0: 无 1:操作中
带2个开始位的响应命令索引
初始值
0
0x5A000010
R/W SDI命令状态寄存器
0x0
响应CRC失败 [12]
(RspCrc) R/W
命令发送
(CmdSent)
命令超时
(CmdTout)
响应接收结束
(RspFin)
CMD线忙
(CmdOn)
RspIndex
[11]
R/W
[10]
R/W
[9]
R/W
[8]
R
[7:0]
R
0
0
0
0
0x00
**
SDIRSP0(SDI响应寄存器0)
寄存器名
SDIRSP0
SDIRSP0
Response0
地址 R/W 描述 重置值
0x5A000014
R SDI响应寄存器0
0x0
位
[31:0]
地址
描述
卡状态[31:0](短格式);卡状态[127:96](长格式)
R/W 描述
初始值
0x00000000
**
重置值
SDIRSP1(SDI响应寄存器1)
寄存器名
SDIRSP1
SDIRSP1
RCRC7
Response1
位
[23:0]
描述
未用(带结束位,短格式);卡状态[87:64](长格式)
R/W 描述
[31:24] CRC7(带结束位,短格式);卡状态[95:88](长格式)
初始值
0x00
0x000000
0x5A000018
R SDI响应寄存器1
0x0
**
SDIRSP2(SDI响应寄存器2)
寄存器名
SDIRSP2
SDIRSP1
Response2
位
地址 重置值
0x5A00001C
R SDI响应寄存器2
0x0
描述
未用(带结束位,短格式);卡状态[63:32](长格式)
R/W 描述
初始值
0x00000000
[31:0]
**
SDIRSP3(SDI响应寄存器3)
寄存器名
SDIRSP3
SDIRSP1
Response3
位
地址 重置值
0x5A000020
R SDI响应寄存器3
0x0
描述
未用(带结束位,短格式);卡状态[31:0](长格式)
初始值
0x00000000
[31:0]
**
SDIDTIMER(SDI数据/忙时钟)
寄存器名
SDIDTIMER
SDIDTIMER
DataTimer
位
[15:0]
地址 R/W 描述 重置值
0x5A000024
R/W SDI数据/忙时钟寄存器
0x0
描述
数据/忙超时周期(0~65535周期)
R/W 描述
初始值
0x2000
重置值
**
SDIBSIZE(SDI块大小寄存器)
寄存器名
SDIBSIZE
SDIBSIZE 位
BlkSize
地址
0x5A000028
R/W SDI块大小寄存器
0x0
描述
[11:0] 块大小值(0~4095byte),在流模式中没有用。
在多块传输中,BlkSize必须是字对齐的,即BlkSize[1:0]=00
地址 R/W 描述
初始值
0x000
**
SDIDCON(SDI数据控制寄存器)
寄存器名
重置值
SDIDCON
SDIDCON
SDIO中断周期(Period)类型
PryType
响应后传输
TARSP
命令后数据接收方式
RACMD
命令后忙信号接收方式
BACMD
块模式
BlkMode
宽总线使能
WideBus
DMA使能
EnDMA
强制停止
(STOP)
数据传输模式
DatMode
BlkNum
位
0x5A00002C
R/W SDI数据控制寄存器
0x0
描述 初始值
[21] 确定最后一个块传输时SDIO中断周期是2个时钟0
周期(cycle)还是更多周期
0: 2个周期 1:更多周期(如单块传输)
确定是否在接收到响应后开始数据传输
0: DatMode设置后开始
1:接收到响应后开始(假设DatMode设置为11)
确定何时数据开始接收
0: DatMode设置后开始
1:命令发送后开始(假设DatMode设置为10)
确定何时开始接收忙信号
0: DatMode设置后开始
1:命令发送后开始(假设DatMode设置为01)
数据传输模式
0: 流模式 1:块模式
使能宽总线
0:标准总线(只使用SDIDAT[0])
1:宽总线模式(使用SDIDAT[3:0] )
使能DMA
0: 禁止(polling) 1:允许
*DMA操作结束后,需要清除该位
确定是否允许强制停止
0:标准(normal) 1:强制停止
数据传输方向
00=ready 01=only busy check start
10=data receive start 11=data transmit start
块数目(0~4095),在流模式中无用
R/W 描述
0 [20]
[19] 0
[18] 0
[17]
[16]
0
0
[15] 0
[14]
[13:12]
0
00
[11:0]
地址
0x000
重置值
**
SDIDCNT(SDI数据剩余计数寄存器)
寄存器名
SDIDCNT
0x5A000030
R SDI数据剩余计数寄存器
0x0
SDIDCNT
BlkCnt
位
[11:0]
描述
1块中的剩余字节
初始值
0x000
0x000
BlkNumCnt [23:12] 剩余块数目
**
SDIDSTA(SDI数据状态寄存器)
寄存器名
SDIDSTA
SDIDSTA
读等待请求
(RWaitReq)
SDIO中断检测
(IOIntDet)
FIFO失败错误
(Fffail)
CRC状态错误
(CrcSta)
数据接收CRC错误
(DatCRC)
数据超时
(DatTout)
数据传输结束
(DatFin)
忙结束
(BusyFin)
开始位错误
(SbitErr)
Tx数据操作进行中
地址 R/W 描述 重置值
0x5A000034
R/(W) SDI数据状态寄存器
0x0
位
[10]
R/W
[9]
R/W
[8]
R/W
[7]
R/W
[6]
R/W
[5]
R/W
[4]
R/W
[3]
R/W
[2]
R/W
[1]
描述
读等待请求信号发送给SD卡。通过写1清0清除该位,并停止请求。写1清0。
0=未发生(occur) 1=读等待请求发生
中断检测,该位通过写1清0
0=没有检测到 1= 检测到中断
是否FIFO出现满栈写错误、空栈读错误、未对准数据保存等错误。写1清0。
0: 无 1:FIFO fail
数据块发送时出现CRC状态错误(从卡返回的CRC校验失败)。写1清0。
0: 无 1=CRC status fail
初始值
0
0
0
0
数据块接收错误(主机CRC校验失败)。写1清0。 0
0: 无 1=CRC status fail
数据/忙接收超时。写1清0。
0: 无 1=超时
数据传输结束,计数为0。写1清0。
0: 无 1=数据结束
忙检测结束。写1清0。
0: 无 1=忙结束
在宽总线模式中在所有的信号中没有检测到起始位。写1清0。
0: 无 1=命令结束,即无开始位
数据传输进行中
0
0
0
0
0
(TxDatOn)
Rx数据操作进行中
(RxDatOn)
R
[0]
R
0: 没有 1=进行中
数据接收进行中
0: 没有 1=进行中
R/W 描述 重置值
0
** SDIFSTA
(SDI数据FIFO状态寄存器)
寄存器名
SDIFSTA
SDIFSTA
地址
0x5A000038
R SDI数据FIFO状态寄存器
0x0
初始值
0
位 描述
当DatMode(SDIDCON[12])设置为数据传输模式,指示FIFO数据是否可用。如果使能了DMA模式,SD主机请求DMA操作。
0=没有发现(FIFO满) 1=发现(0≤FIFO≤63)
当DatMode(SDIDCON[12])设置为数据接收模式,指示FIFO是否可用来接收。如果使能了DMA模式,SD主机请求DMA操作。
0=没有发现(FIFO空) 1=发现(0≤FIFO≤64)
Tx FIFO数据少于33个字节时置为1
0=33≤Tx FIFO≤64 1=0≤Tx FIFO≤32
Tx FIFO为空时置为1
0=1≤Tx FIFO≤64 1=Empty
当Rx FIFO有所有数据块的最后数据时
0=还没有接收到 1=最后数据就绪
当Rx FIFO满时置为1
0=0≤Rx FIFO≤63 1=Full(64byte)
当Rx FIFO超过31byte时置为1
0=0≤Rx FIFO≤31 1=32≤Rx FIFO≤64
FIFO中数据的字节数
传输时检测[13]
FIFO是否可用
(TFDET)
接收时检测[12]
FIFO是否可用
(RFDET)
Tx FIFO半满
(TFHalf)
Tx FIFO空
(TFEmpty)
Rx FIFO最后数据就绪
(RFLast)
[11]
[10]
[9]
0
0
0
0
Rx FIFO FULL [8]
(RFFull)
Rx FIFO Half [7]
FULL
(RFHalf)
FIFO 计数 [6:0]
(FIFOCNT)
地址
0
0
0000000
**
R/W 描述 重置值


发布评论