分类: 嵌入式
2015-06-24 14:37:01
本系列博文将详细讲解SylixOS SD 协议栈涉及的诸多细节,以求达到读者能够更轻松地编写SD相关的驱动(应用层驱动和SD控制器驱动)。关于SD协议的解读,在网上已经有很多非常好的文章,但为了保持本博文的完整性,开篇还是从总体上介绍一下SD协议,在后续章节也会围绕SylixOS SD分析SD协议的一些重要细节。
SD协议由MMC发展而来,可在软件上完全兼容MMC协议。其定义了一套完整的物理层规范和总线通信协议,并且在协议层支持SPI传输模式,其目的是为了在没有SD控制器的芯片上也能使用SD设备,算是一种低成本解决方案。SD协议主要包含SD Memory(即SD存储卡)和SDIO规范,SDIO类似于USB一样,同样的接口可支持诸如WIFI、串口、GPS等不同功能的设备。
表2.1分别说明了SD各个引脚接口的功能:
接口编号 |
名称 |
SD模式功能 |
SPI模式功能 |
1 |
DATA3/CS |
数据线3/卡插拔检测 |
SPI从设备片选信号 |
2 |
CMD/DI |
命令线 |
MOSI |
3 |
VSS1 |
电源地 |
电源地 |
4 |
VDD |
电源正 |
电源正 |
5 |
CLK |
时钟 |
SCK |
6 |
VSS2 |
电源地 |
电源地 |
7 |
DATA0/DO |
数据线0 |
MISO |
8 |
DATA1/IRQ |
数据线1/SDIO中断 |
可作SDIO中断 |
9 |
DATA2/NC |
数据线2 |
保留 |
从上表可以看出,在SPI模式下,由DATA1充当SDIO中断信号引脚,但SPI控制器本身无法捕捉该中断信号,因此SPI模式下要支持SDIO设备将对驱动程序有更多额外的需求,且不一定能很好地实现,软件设计中通常不必考虑在SPI模式下支持SDIO。
传输位宽
在SD模式下,可使用一位(DATA0)或四位(DATA0~DATA3)数据线进行传输,该规定可最大限度地兼容不同的SD设备和SD控制器(两者均有可能仅支持单一的数据位宽)。
在SPI模式下,仅仅允许设备工作在一位数据位宽状态下。
传输速率
SD规范主要定义了3种传输速率:低速(400KHZ时钟,通常用于设备初始化阶段);全速(25MHZ时钟,用户设备正常工作阶段);高速(50MHZ时钟,可支持高速设备)。SD规范中明确定义了设备和控制器必须支持低速和全速,高速模式为非必要实现,需要控制器和设备双方均支持才能正常工作。
设备类型
SD存储卡容量分为SDSC(最大2GB)、SDHC(最大32GB)、SDXC(最大2TB)。SD存储卡的传输速度和它的容量类型没有必然联系,所以很多人认为SDHC就是所谓的高速卡是一个误区。SD存储卡的速度分为5类,class0并未规定具体的传输速度,由设备自定义,class2最低2MB/s,class4最低4MB/s,class6最低6MB/s,class10最低10MB/s。SDSC和SDHC速度最低为2MB/s,真正的高速卡应该支持50MHZ时钟,速度达到25MB/s。
SDIO卡主要有单一的SDIO卡和组合SDIO卡(即包含SDIO功能和SD存储卡功能的设备)两大类,其传输速度与SD存储卡的定义相同。
操作电压
MMC规范定义的工作电压范围为1.65V~3.6V,但SD规范的电压范围为2.7V~3.6V,目前少有SD控制器支持MMC规定的1.65V~1.95V的低电压范围,因此不能支持只能工作在低电压范围的MMC卡。定义一个工作电压范围的目的是为了兼容已经存在的SD控制器和SD设备,但带来的历史包袱就是新的设备和控制器厂商需要更多的考虑。
传输协议
如果把SD一次总线传输称作一次会话,那么一次会话由命令、应答和数据组成。由于SD是一个主从总线,命令总是由SD控制器发出,随后可能伴随设备对该命令的应答以及双方的数据传输。这三者均伴随CRC数据校验以保证传输的正确性,CRC计算由SD控制器处理。SD存储卡由不同的命令集分别处理设备初始化和设备数据传输等工作,SDIO卡在SD存储卡命令集的基础上,增加了一些额外的命令完成与SDIO设备相关的工作,从这一点来说,SDIO卡可以看成是SD存储卡的一个扩展功能。
SPI总线协议
SPI模式下的总线协议实际上是SD总线协议的一个子集。由于SPI控制器只能充当SD物理传输层的功能,因此额外定义了专供SPI模式下使用的命令集,这些命令同时也对应不同的应答格式。此模式下,一次SD总线会话将由多个SPI传输完成,这对软件设计有更多的需求。此外,还需要由软件完成CRC校验的处理,也可以在初始化SD设备时关闭CRC功能。
安全
1.设备加密。SD存储卡可由特定的命令操作,让卡处于加密状态,此时该卡不能被读或写。设备是否支持加密功能由它是否支持该加密命令决定。
2.设备硬件写保护。虽然SD规范中定义了写保护命令,但是SDHC和SDXC存储卡并不支持该命令。
3.软件写保护。每一个SD卡上都有一个写保护开关(WP),该开关实际上与SD卡内部没有任何联系,但它提供了实现软件写保护的方法,需要硬件设计上的支持。
如图2.2所示,写保护开关是一块可以上下拨动的塑料滑块,当拨到上面时,A,B未接通,此时GPIO输入高电平(图中a);当拨到下面时,滑块将弹片顶起导致A,B接通,由于A端上拉电阻的原因,此时GPIO输入低电平(图中b)。SD卡规定滑块拨到下面时表示写保护打开,因此,上面的电路可以总结为:当读取到GPIO为低电平时,SD卡处于写保护状态,软件可根据此信息将SD卡标记只读模式;反之未写保护。
总线对设备数量的支持
SD总线定义为一主多从总线,理论上一条总线上可以挂接多个SD从设备,它们以不同的地址区分。但SylixOS SD协议实现上,并不支持一条SD总线上存在多个设备的情况,原因有以下几点:
1.由于SD卡接口完全兼容MMC卡,因此若同一个总线上同时存在SD卡和MMC卡,且它们需要不同的电压支持时,不论是硬件还是软件上都很难处理此类情行。
2.当一个总线上挂接多个SDIO设备时,如何有效区分产生的SDIO中断来自于哪个设备?目前笔者还未能从相关文档找到任何答案。
3.总线上的多个SD设备若需要不同的传输速率,SD规范中也没有给出任何可行的解决方案,因为SD控制器本身不能处理不同速率带来的时序转换问题(这里可以对比一下USB总线,不同速率的设备是通过HUB完成传输转换的)。因此SD规范中也明确说明了,在高速模式下,一个SD控制器只能对应一个SD设备。
4.SD规范没有对一个总线上可同时挂接的设备最大数量进行明确地定义,它可能受限于端口的驱动能力,硬件设计上的抗干扰能力等因素,这增加了应用的不确定性。
5.硬件成本越来越低,实际的应用中也少有此类需求。很多芯片上都同时存在多个SD硬件控制器通道,这已经能满足需要同时使用多个SD设备的场合。
可见在这一点上,SD总线的定义存在诸多缺陷。基于以上几点原因,SylixOS SD协议在软件实现上,一个SD控制器仅能同时支持一个SD设备。同时也建议设计硬件电路时,最好不要将多个SD卡槽挂接到一个SD总线上,因为即使是Linux系统,也是同样的处理方式。
1. SD Memory Card Specifications Part1 Physical Layer Specification ,Version 1.0,March,2000
2. SD Specifications Part 1 Physical Layer Simplified Specification,Version 3.01,May 18,2010
3. SD Specifications Part E1 SDIO Simplified Specification,Version 2.00,February 8,2007
4. SD Specifications Part A2 SD Host Controller Simplified Specification,Version 2.00 ,February 8,2007
5. MMC System Spec v3.31
说明:
1.SD存储卡完整的协议文档第一部分,主要讲物理层规范。
2.SD协议物理规范的简化版本,可快速了解SD协议。主要是围绕SD存储卡进行说明。
3.SDIO协议规范。
4.SD标准控制器规范,即SDHCI规范。
5.MMC协议规范。
(本篇完)