Showing Posts From

Sd

SD卡插入检测后的完整初始化流程解析

本文对SD卡插入后,在SD主控和卡之间的完整初始化流程进行完整的分析和解释:对于一个支持SD卡的消费类电子产品而言,当SD卡插入该产品的SD卡插槽以后,SD主控与SD卡之间的完整初始化通信流程,如何通过这个初始化的设置流程做好进一步读写SD卡的准备。 - 本文仅关注SD卡的SD模式,不考虑SPI模式。 从SD卡插入卡槽,到最后主控对SD卡进行数据内容的读写之间,主要存在以下五个阶段。后续部分对这五个阶段进行详细的解释说明。 - 物理检测与上电阶段 - 卡识别初始化阶段(识别模式) - 卡识别配置阶段 - 数据传输模式准备 - 数据通信阶段 对于本文的理解,需要首先建立SD卡与其主控之间通过CMD引脚在两者之间进行的CMD及其响应消息通信数据的理解,这方面可以参考另外一篇笔记:[[SD卡的CMD命令及其响应消息数据结构]]。 下图是从SD协议文档中对于UHS-I类型的SD卡进行初始化设置的整体流程图,本文的叙述框架就是对这个流程图的具体执行过程进行详细的总结和说明。 !image.png 1. 物理检测与上电阶段 初始未插卡的状态下,由SD主控进行控制,SD引脚上的电源引脚未使能,CLK无时钟输出。在使用CD/DAT3引脚检测卡插入状态的设计中,此时CD引脚上拉为High电平。 当SD卡插入以后,CD引脚拉低触发SD卡的检测中断。 - 此时主控检测到SD卡插入后,控制SD引脚的电源引脚使能,给SD卡供电(默认给SD卡提供3.3V电源供应)。 - 同时,SD引脚开始输出慢速时钟用于对卡访问进行初始化,SD协议要求初始时钟

SD通信命令协议解析之CMD6

在SD协议中,SD主控与SD卡之间交互流程中的CMD6是一个相对比较复杂的命令。其复杂性体现在: - 同一个命令既可以实现对SD卡支持特性的读取,也可以对其进行设置。 - CMD6命令的执行及其从SD卡上读取的响应消息,双方不仅在SD的CMD pin上通信,也涉及到了在DAT引脚上传输部分数据,而其他CMD命令的交互执行基本上都只涉及到CMD pin。 - CMD6命令中所支持的功能比较多,包含多个function group,每个function group又包含多个function mode。 所以,本篇比较在较为深入的学习SD物理层协议规范文件(V6.00版本)的基础上,详细的整理出来CMD6命令交互的流程。 CMD6执行的前提就是,先要通过CMD7指令选中SD卡,让SD卡进入传输状态Transfer Mode。 CMD6命令的交互数据结构 CMD6命令的整体数据结构仍然遵守[[SD卡的CMD命令及其响应消息数据结构]]中对于CMD命令数据结构的定义,CMD Command Index为0x06,Argument的32bit则如下图所示。 - 最高的31bit用于表示该命令是要验证请求设置的数据对于SD卡是否合法,还是要把参数指定的function mode设置进去。 - bit30-bit24为预留位,全部为0。 - bit23-bit0的24个bit,以4个bit为一组,分为6个function group,对应于各个function group的设置参数,其中实际上只用到了前面4个group,group 5和6预留给未来的新group。 !image.png 而Group 1-4这四个Group中,每个function可设置的function mode的值对应于下表所示。 !image.png - 4个function group的设置参数各自独立,分别占用其中的4个bit,所以可以在一条CMD6指令中同时设置或者检查多个function group的设置,例如可同时设置总线速度和驱动强度。 - 对于每个function group而言,同一时间只能选择一个function mode。function mode设置为0表示使用默认值,设置为0xF表示继续使用当前值。 - 每个function group的function 0是其上电后默认的配置,例如默认的SD卡读写总线时钟速度(Access Mode)为SDR12,也就是25MHz。 当处于Transfer Mode的SD卡收到以上CMD6消息时,SD卡会在CMD Pin上返回一个R1消息用于表示自己当前的内部工作状态,以及在DAT数据总线上返回一个512bit的状态消息(对于SD卡而言,就是一个标准的块读操作)。 CMD6命令的执行流程 如上所述,CMD6命令的执行可以分为Check(Mode 0)和Switch(Mode 1)两种操作模式。 - 其中Check模式用于检查SD卡是否可以支持CMD6 Argument中所指定的function mode。 - Switch模式则用于把CMD6 Argument中所指定的function mode设置到SD卡中。 CMD6 Check Operation 对于SD主控而言,在CMD6的Argument设置中,bit31设置为0表示该命令是一个check操作,并且在各个function group中设置要查询的function mode,通过这个命令查询SD卡是否支持指定的function mode。 当SD卡收到以上CMD6命令以后,从CMD pin上返回一个R1响应消息答复自己的当前工作状态,然后在DAT总线上发出一个512bit的信息结构,其中包含有SD卡是否支持指定function mode的信息(在512bit信息结构的bit399到bit376之间),如果支持就返回这个function mode的index,如果不支持就返回0xF。 !image.png CMD6 Switch Operation 对于SD主控的Switch操作而言,与上面的Check操作类似。在CMD6的Argument设置中,bit31设置为1表示该命令是一个switch操作,然后在各个function group中设置要查询的function mode,通过这个命令来向SD卡设置指定的function mode。 当SD卡收到以上CMD6命令以后,从CMD pin上返回一个R1响应消息答复自己的当前工作状态,然后在DAT总线上发出一个512bit的信息结构,其中包含有SD卡是否支持指定function mode的信息(在512bit信息结构的bit399到bit376之间),如果支持就返回这个function mode的index,如果不支持就返回0xF。此外,在这个512bit的信息结构发出的8个clk以后,CLK以及DAT的总线工作时序就切换为function mode所设置的工作模式。 !image.png

SD卡与SDIO接口、eMMC之间的联系与区别

工作中接触到的主控芯片中,在其支持的SD主控及其接口的支持上,大概率都会提到该SD主控可以支持SD协议、SDIO协议以及eMMC协议规范的不同版本。例如下图是君正T41的SD主控对于这些不同协议规范版本的支持情况: !image.png 那么SD主控所支持的SD卡、SDIO以及eMMC等接口和规范协议之间的连续和区别是什么呢? SD卡与SDIO接口的联系与区别 SDIO(Secure Digital Input Output)和SD卡(Secure Digital Memory Card)同属于SD(Secure Digital)的标准体系,但二者的设计目标与功能实现有明显差异:SD卡是存储类的专用设备,而SDIO则为泛用型外设利用相同的SD接口以及类似的SD协议框架提供了高速扩展接口。简单的说,SDIO和SD卡两者在硬件物理层上完全兼容,但是具体的通信协议上各自发展出来自己的体系。 硬件物理层的相互兼容包括: - 相同的引脚定义:SDIO设备与SD卡使用相同的物理接口(也就是9引脚 micro/SD接口)。 - 电气规范一致:SDIO设备和接口均遵循SD协会定义的电压范围(3.3V或1.8V UHS模式)与信号电平标准。 双方在协议层方面的差异: - SD命令集分支:SD卡仅实现SD存储协议(侧重于块读写指令),而SDIO则扩展了SDIO协议用于支持通用设备的控制。 - 初始化流程:SD主控制器通过发送CMD5命令检测来插入设备是存储卡还是SDIO外设。 因此SD卡(存储)与SDIO(扩展外设)规范协议栈两者共享物理层,但核心功能与技术规范的演进方向相互独立发展,因此SD卡与SDIO的标准规范是独立的。这就是为什么大多数主控SOC在SD控制器的规格中都分别给出了SD和SDIO的规范支持版本。以下是SDIO协议规范的演进以及各个版本的重点支持特性: !image.png SD卡与eMMC之间的联系与区别 SD卡和eMMC都是利用SD接口来解决存储存储的问题,不同的只是SD卡针对的应用场合是可移动、可插拔的使用场景,而eMMC针对的则是嵌入式焊接的方式固定到产品中的应用场景。 - 也就是说,SD卡是可以在产品的SD卡槽中可插拔使用,可以更换;而eMMC是直接焊接在产品的电路板上的,不可更换。但是两者都是通过SD接口连接到主控芯片上。 两者的技术根源类似(均衍生自MMC协议),所以大多数主控的SD控制都能够同时兼容SD卡、SDIO以及eMMC,但是SD卡和eMMC在使用方式上的差异还是会导致两者在物理层和驱动命令集方面的差异: - 在物理层的电气信号上,SD卡要求更高的ESD防护(因为支持可插拔),而eMMC则依赖PCB信号的完整性设计。 - 两者支持的SD总线的时钟和规范也有差异,例如eMMC 5.1规范的HS400可支持200MHz DDR双边沿采样数据。 - SD协议通信的命令集方面,两者也有差异,并且包含一些各自独有的命令集。 最重要的是,SD卡和eMMC协议背后的组织不同。SD卡以及SDIO的相关协议规范的组织是SD协会(SD Association),而eMMC的协议规范则是由JEDEC来制定和维护。SD协会重点兼容历史设备(向后兼容SDHC插槽),而JEDEC则推动eMMC与UFS接轨(为UFS铺路),因此随着规范的演进,两者之间的差异会越来越大。

SD卡的CMD命令及其响应消息数据结构

众所周知,在SD卡与其控制器之间的SD接口上,有一个专门的CMD引脚。CMD与CLK引脚配合,在SD卡和其主控之间进行控制和配置命令的传输。每次命令模式的通信,SD主控向卡在CMD引脚上发出一个CMD命令结构,根据CMD命令的不同由SD卡给出该命令的答复消息Rx。 - 当然对于CMD6和CMD16等少数命令而言,除了在CMD引脚上,SD卡会给出响应消息以外,在DAT总线上也会有一些通信活动。 CMD命令结构 所有Native模式(即非SPI模式)的SD卡命令都采用相同的48位(6字节)固定长度的传输结构: !image.png - 起始位(Start Bit):固定为0(低电平),占1个CLK周期。 - CMD命令索引(Command Index):占据6个bit的二进制值,用于定义命令类型(如CMD0=0x00, CMD8=0x08),其编码范围为0-63之间。 - 参数(Argument):固定占据32位的CMD参数,在进行传输时MSB(bit31)优先传输,不同命令之间的参数结构差异极大。 - CRC7校验:7位循环冗余校验码,CRC运算覆盖命令索引和参数字段 - 结束位(End Bit):固定为1(高电平),占1个CLK周期 响应消息Rx 而当SD卡接收到以上的CMD指令后,通过同样CMD引脚配合CLK的跳变,根据之前CMD的不同向SD主控发出不同的响应消息。 - 所有从SD卡到主控的命令响应均通过CMD引脚传输,单向串行通信。 - 所有响应均以Start Bit (0)开头,以End Bit (1)结束。这一点与CMD命令的结构类似。 - 时序方面,响应数据的传输由主控控制的CLK信号同步,采样点在CLK下降沿。 - SD卡与主控之间的通信中,针对各种CMD命令,SD卡所发回的响应消息主要有R1,R1b,R2,R3,R6,R7这几种。后续在初始化流程中对各个响应消息的数据结构进行说明。 R1:普通应答消息 下图是R1响应消息的数据结构。整个响应消息长度为48bit,其中Command Index需要与这个响应消息前面的CMD命令的CMD Index相同,Card Index部分则包含一个32位的SD卡内部状态,这个SD卡状态在SD卡内部维护。 !image.png R1b:带busy bit的普通应答消息 R1b的消息结构与R1完全相同。只不过部分CMD命令要求SD卡响应R1消息的时候,同时在DAT0引脚上提供一个busy位,例如CMD12,在SD卡接收到这个命令以后,执行操作处于busy状态时,就会把DAT0拉低来提供这个busy状态信息给Host。 R2:CID,CSD寄存器 当SD卡收到CMD2和CMD10的时候,通过这个响应消息发回CID寄存器;当SD卡收到CMD9的时候,通过这个响应消息发回CSD寄存器。下图是R2消息的数据结构: !image.png - 注意,R2的总长度是136bit,只有CID和CSD的bit127到bit1会包含在R2消息中,最后的bit0会被最后的end bit 1替代。 R3:OCR寄存器 R3响应消息的长度为固定的48bit,用于响应ACMD41命令,向SD主控返回SD卡OCR寄存器的值。 !image.png R6:响应RCA地址 R6响应消息固定长度48bit,用于响应CMD3。其中Argument的高16位为SD卡自己生成的RCA地址,低16bit则是SD卡当前的部分状态位。 !image.png R7:卡接口状态 R7实际上就是当卡收到CMD8的时候,向SD主控返回卡支持的电压范围。R7响应消息的长度固定为48bit,其中最主要的就是bit19到bit16之间的Voltage Accepted的四个bit。 !image.png ACMD SD卡与SD主控之间的命令通信,除了以上的CMD命令及其响应消息以外,还有一个ACMD命令。所谓的ACMD命令,就是Appilication CMD即应用模式CMD。SD协议中增加ACMD的原因主要是: - CMD结构中的CMD Index总共只有6bit,能够支持的命令有限,通过这个ACMD模式可以在当前命令数据结构的条件下扩展命令的功能。 - 对SD命令进行分层,CMD负责处理硬件方面的操作,ACMD负责处理应用层面的功能。 在具体的ACMD通信流程上,ACMD的每次通信,需要先发出一个CMD55指令,要求SD卡进入应用模式,SD卡返回一个R1响应消息,在这个响应消息中用APP_CMD状态表示自己处于等待接收ACMD命令的状态中;SD主控接着发送ACMD命令,SD卡收到后,再按照ACMD命令要求返回与之对应的响应消息。每个ACMD命令的通信流程都如下所示: 主控发出ACMD命令后,从SD卡读到的响应消息也是以上所总结出来的R1-R7的这几个消息。

SD卡的分类及其各种规格参数总结

SD卡的基本规格总结 尺寸类型 - SD:32×24×2.1mm(全尺寸),基本上以及很少使用了 - microSD:11×15×1.0mm,目前应用的主流 引脚触点差异: - UHS-I及其之前:9个触点(VCC,两个VSS,CLK,CMD,DAT3-DAT0),仍然是目前应用的主流 - UHS-II/UHS-III:17个触点(新增差分对) - SD Express:保留传统触点+隐式PCIe通道设计 电压兼容性 - 普通SD卡:仅支持3.3V - UHS卡:可支持3.3V/1.8V双电压(需主控匹配,双方协商电压切换) !image.png - 可以看到,SD卡除了标准的SD模式以外,还能够支持SPI Mode,在这种情况下,数据线从SD模式的四根(DAT3-DAT0)变成了一根。 SD卡的分类 当前SD卡的标准体系较为复杂,涉及到存储容量、总线协议、速度等级等多个维度的定义。因此也就有多个不同维度的SD卡分类规则。 基于容量进行分类 从SD卡的存储容量角度上,可以分为以下四类,分别在不同的SD规范中定义。需要注意的是因为FAT3文件系统支持的文件系统大小以及单个文件大小的限制均比较小,所以SDXC卡默认采用exFAT文件系统。 !image.png - 目前应用的主流是SDHC和SDXC,SDSC因为容量太小,已经被淘汰了。 - 其实无论是对于开发者还是用户而言,都只需要关注自己产品应用的存储容量就好,不需要关注究竟属于哪个容量分类。 基于总线接口及总线速度进行分类 从SD卡所连接的系统总线接口以及总线读写速度的角度,SD卡可以分为以下分类。对于开发者而言,需要关注主控芯片的SD接口规范,这一点限定了SDIO接口的时钟、电压、引脚分布等。 !image.png 关于SD卡的引脚结构,UHS-I及其之前的SD卡规范使用传统的9个引脚:CLK,CMD,DAT3-DAT0(其中DAT3也用于卡检测的CD引脚),VCC,两个VSS。从UHS-II开始,在传统的SD卡接口规范的基础上增加了两组LVDS差分对,共8个引脚,因此新的UHS-II/III接口和卡共包含17个接口。但是,新的UHS-II/III卡插入旧的SD卡插槽时,新增的差分引脚无电气连接,对于SD卡的读写访问会自动回退至UHS-I模式或更低,这一点有点像USB TypeC接口对之前USB2.0接口的兼容一样。下图是UHS-II/III卡的引脚结构示意图: !image.png 关于SD卡所支持的电压,在SD2.0及其之前的规范,SD接口的主机和SD卡只支持3.3V单电压模式,不支持电压的动态切换;但是从SD3.0也就是UHS-I开始,SD主机接口以及SD卡均应支持3.3V和1.8V双电压模式,否则无法通过UHS认证。在支持双电压的情况下,主机在给SD卡初始上电后首先提供3.3V电压,然后通过CMD8+ACMD41+CMD11的协议序列在双方之间交换双电压的支持能力,根据交互信息决定是否切换电压到1.8V。 关于通信的单端SDR和双端DDR模式。在UHS-I之前的规范中,SD卡只能支持单端的SDR通信,UHS-I规范则引入了可选的DDR模式,可以支持在一个时钟周期发送两次数据,这样相同的时钟周期下传输数据可以翻倍。对于UHS-I而言,该规范可以支持SDR12、SDR25、SDR50、SDR104以及DDR50这几种模式,其中前四种是单端SDR模式,只不过是在之前SD规范的基础上进一步提升了时钟频率,时钟最高可以达到208MHz,因此最高可以提供104MB/s理论带宽;而DDR50则是双边沿触发发送数据,DDR模式下最高时钟50MHz,可以提供最高50MB/s的理论带宽。当然,能否支持UHS-I的高规格时钟速度以及DDR模式,需要主控SD控制器与SD卡之间进行协商,只有双方都支持的情况下才能使用。 > SD 2.0 High Speed以及UHS-I的单端SDR是目前多数消费类产品应用中的主流。 除了以上基于传统SD接口的总线接口以外,目前还出现了基于PCIe总线通信规范的SD Express总线接口,不过这种接口的SD卡以及主控目前在产品开发中还比较少见: !image.png 基于SD卡的读写速度进行分类 相比于前面的SD接口的速度而言,SD读的读写速度的分类和等级就更加复杂了。首先是按照C开头进行的基本速度等级: !image.png 接下来是UHS速度等级,跟C开头的速度等级一样,主要关注的仍然是大块数据的写入速度,既然是同样的评估标准,为什么不继续用C? !image.png 还有专门针对视频文件写入应用的V速度等级。跟C/U开头的速度等级有啥区别? !image.png 最后还有一个针对手机APP应用随机访问速度的A速度等级: !image.png 无论如何,对于包含SD卡产品的开发者而言,重点只需要关注自己的主控SD控制器的规范版本,按照规范版本来实现具体的电路和驱动程序/功能即可,不太需要关注这些不同的SD卡速度等级。而对于普通用户而言,则需要根据自己的产品应用需求,选择符合产品应用的SD卡速度等级,当然选择的SD卡速度等级需要与其主控能够支持的SD卡规范相匹配才能发挥出来最佳的性能。 容量、接口和速度等级分类的例子 下图是参考文档1中所提供的一个真实SD卡标注信息的说明,结合以上的理论知识应该是可以很好的理解了: !image.png SD卡标准规范版本的演进 以下是SD卡各个主要版本的协议规范的发布时间,以及各版本新增加的主要特性。结合以上对于SD卡进行不同分类标准的说明可以更容易理解。 !image.png 参考资料 - 存储印象:浅谈存储卡UHS-I、UHS-II、UHS-III总线标准