问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SD卡简单介绍-数据传输、模式流程

创作时间:
作者:
@小白创作中心

SD卡简单介绍-数据传输、模式流程

引用
CSDN
1.
https://blog.csdn.net/qq_41650023/article/details/125126013

SD卡(Secure Digital Memory Card)是一种广泛应用于数码相机、手机、MP3播放器等设备的存储卡。本文将详细介绍SD卡的接口、数据传输模式和流程。

SD总线传输

SD总线通信是基于命令和数据传输的。通讯由一个起始位("0"),由一个停止位("1")终止。SD通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。

无响应和无数据模式



来自STM32F10xxx中文参考手册

块读取操作


来自STM32F10xxx中文参考手册

块写操作

SD数据是以块(Black)形式传输的,SDHC卡数据块长度一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功。CRC位由SD卡系统硬件生成。


来自STM32F10xxx中文参考手册

SD数据传输支持单块和多块读写,它们分别对应不同的操作命令,多块写入还需要使用命令来停止整个写入操作。数据写入前需要检测SD卡忙状态,因为SD卡在接收到数据后编程到存储区过程需要一定操作时间。SD卡忙状态通过把D0线拉低表示。

连续读操作

来自STM32F10xxx中文参考手册

连续写操作

来自STM32F10xxx中文参考手册

SD卡数据包

使用4数据线传输时,每次传输4bit数据,每根数据线都必须有起始位、终止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输完后通过D0线反馈给主机。

SD卡有两种数据包格式。

  • 常规数据(8位宽度):常规数据(8位宽度)首先以LSB(最低有效字节)顺序发送,最后以MSB(最高有效字节)顺序发送。但在单个字节中,它首先是MSB(最高有效位),最后是LSB(最低有效位)。
  • 宽数据(SD内存寄存器):宽数据从MSB位移位。

常规数据格式


来自《STM32库开发实战指南》

DAT3数据线发较高位,DAT0数据线发较低位。先发低字节再发高字节,每个字节先发高位再发低位。每根线发送一个字节的其中两位。

宽位数据包格式

对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。

来自《STM32库开发实战指南》

命令格式

命令编码格式

来自《STM32库开发实战指南》

命令组成:

  • 起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为0,终止位为1。
  • 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。
  • 命令号:它固定占用6bit,所以总共有64个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
  • 地址/参数:每个命令有32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址。
  • CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。

命令类型

SD命令有4种类型:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应;
  • 带响应广播命令(bcr),发送到所有卡,同时接收来自所有卡响应;
  • 寻址命令(ac),发送到选定卡,DAT线无数据传输;
  • 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输。

响应编码格式

在CMD中,最高有效位(MSB)首先传输,最低有效位(LSB)最后传输。

响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。SDIO总共有7个响应类型(代号:R1~R7),其中SD卡没有R4、R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。与命令一样,SD卡的响应也是通过CMD线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度为136bit。

除了R3类型之外,其他响应都使用CRC7校验来校验,对于R2类型是使用CID和CSD寄存器内部CRC7。

SD总线

SD卡支持SDIO模式和SPI模式。

SDIO模式

SD卡模式针脚定义针脚名称类型描述
1CDDAT3I/O/PP卡监测数据位3
2CMDPP命令、回复
3VSSS地
4VCCS供电电压
5CLKI时钟
6VSS2S地
7DAT0I/O/PP数据位0
8DAT1I/O/PP数据位1
9DAT2I/O/PP数据位2

注:S:电源供电,I:输入O:输出I/O:双向PP:I/O使用推挽驱动

SD总线允许强大的1线到4线数据信号设置。当默认的上电后,SD卡使用DAT0。初始化之后,主机可以改变线宽(即改为2根线,3根线,4根线。)。

CLK时钟线,由SDIO主机产生。
CMD命令控制线,SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答(响应),SD卡也是通过该线传输应答信息。
D0-3数据线,传输读写数据;SD卡可将D0拉低表示忙状态。

SPI模式

如果接到复位命令(CMD0)时,CS信号有效(低电平),SPI模式启用。

SIP模式允许较为简单的SPI通道接口,相比于SDIO模式传送速度降低。SPI模式需要两根数据线,一根片选。SPI兼容模式使得MMC主机系统通过很小的改动就可使用SD卡。SPI模式使用字节传输。


注意:SPI模式时,这些信号需要在主机端用10~100K欧的电阻上拉

SD卡的操作模式及其切换

SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别模式和数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。在每个操作模式下,SD卡都有几种状态,参考表SD卡状态与操作模式,通过命令控制实现卡状态的切换。

SD卡的几种状态

操作模式SD卡状态
无效模式(Inactive)无效状态(Inactive State)
卡识别模式(Card identification mode)空闲状态(Idle State)准备状态(Ready State)识别状态(Identification State)
数据传输模式(Data transfer mode)待机状态(Stand-by State)传输状态(Transfer State)发送数据状态(Sending-data State)接收数据状态(Receive-data State)编程状态(Programming State)断开连接状态(Disconnect State)

SD卡状态转换

重新上电时为Idle状态

  • CMD0上电重置到Idle状态(防止一些机型关机不掉电,如某些FPGA平台)
  • ACMD41获取SD卡支持的电压信息(还需要通过主机控制器设置电压)
  • CMD2获取卡商信息
  • CMD3请求SD卡发布相对地址
  • CMD9获取CSD寄存器,即卡的电气特性数据(需要使用SD卡相对地址)
  • CMD7通过相对地址选择对应的SD卡,该卡进入数据传输Transfer State状态
  • 各种CMD进行block读写

SD存储卡状态图
来自《STM32库开发实战指南》

主机上电后,所有卡处于空闲状态,包括当前处于无效状态的卡。主机也可以发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态,但当前处于无效状态的卡并不会复位。

主机在开始与卡通信前,需要先确定双方在互相支持的电压范围内。SD卡有一个电压支持范围,主机当前电压必须在该范围可能才能与卡正常通信。SEND_IF_COND(CMD8)命令就是用于验证卡接口操作条件的(主要是电压支持)。卡会根据命令的参数来检测操作条件匹配性,如果卡支持主机电压就产生响应,否则不响应。而主机则根据响应内容确定卡的电压匹配性。CMD8是SD卡标准V2.0版本才有的新命令,所以如果主机有接收到响应,可以判断卡为V2.0或更高版本SD卡。

SD_SEND_OP_COND(ACMD41)命令可以识别或拒绝不匹配它的电压范围的卡。ACMD41命令的VDD电压参数用于设置主机支持电压范围,卡响应会返回卡支持的电压范围。对于对CMD8有响应的卡,把ACMD41命令的HCS位设置为1,可以测试卡的容量类型,如果卡响应的CCS位为1说明为高容量SD卡,否则为标准卡。卡在响应ACMD41之后进入准备状态,不响应ACMD41的卡为不可用卡,进入无效状态。ACMD41是应用特定命令,发送该命令之前必须先发CMD55。

ALL_SEND_CID(CMD2)用来控制所有卡返回它们的卡识别号(CID),处于准备状态的卡在发送CID之后就进入识别状态。之后主机就发送SEND_RELATIVE_ADDR(CMD3)命令,让卡自己推荐一个相对地址(RCA)并响应命令。这个RCA是16bit地址,而CID是128bit地址,使用RCA简化通信。卡在接收到CMD3并发出响应后就进入数据传输模式,并处于待机状态,主机在获取所有卡RCA之后也进入数据传输模式。

卡初始化流程

要实现SDIO驱动SD卡,最重要的步骤就是SD卡的初始化,只要SD卡初始化完成了,那么剩下的(读写操作)就简单了。


卡片初始化和识别流程

从图中,我们看到,不管什么卡(这里我们将卡分为4类:SD2.0高容量卡(SDHC,最大32G),SD2.0标准容量卡(SDSC,最大2G),SD1.x卡和MMC卡),首先我们要执行的是卡上电,上电后发送CMD0对卡进行软复位,之后发送CMD8命令,用于区分SD卡2.0,只有2.0及以后的卡才支持CMD8命令,MMC卡和V1.x的卡,是不支持该命令的。

不同种类的卡初始化过程是不一样的,通过流程差异我们可以判断不同类型的卡。

SDIO:CMD0之后执行CMD5,CMD5只有SDIO类型才会有响应。
MMC:ACMD41换为CMD1,ACMD类命令只有SD或SDIO卡才有响应。所以要先检测是否是SDIO,再检测是否是SD,最后检测是否是MMC(core层代码中也是这个顺序),否则会出现误判。

数据传输模式

只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。

SD存储卡状态图
来自《STM32库开发实战指南》

CMD7用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡都是出于待机状态,必须选择一个RCA地址目标卡使其进入传输状态才可以进行数据通信。同时通过CMD7命令也可以让已经被选择的目标卡返回到待机状态。

数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用表SD部分命令描述中面向块的读写以及擦除命令对卡进行数据读写、擦除。CMD12可以中断正在进行的数据通信,让卡返回到传输状态。CMD0和CMD15会中止任何数据编程操作,返回卡识别模式,这可能导致卡数据被损坏。

最后,因为是计划到用STM32开发,所以大部分都为V2版本的协议内容。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号