一、SD miniSD microSD SDHC的区分

SD

SD卡 Secure Digital Memory Card 是一种基于半导体闪存工艺的存储卡。为了满足数码产品不断缩小存储卡体积的要求 SD卡逐渐演变出了Mini SD Micro SD两种规格。 

SD卡背面共有9个引脚 包含4根数据线 支持1bit/4bit两种数据传输宽度 时钟最高频率为25MHZ 故理论最高数据传输速率为12.5MB/S 工作电压2.7~3.6V

   


 

 

 

 

 

 



MiniSD
顾名思义 Mini SD卡相比标准SD卡 外形上更加小巧 仅有标准SD卡40 左右的大小。尽管Mini SD卡的外形大小及接口形状与原来的SD卡有所不同 但接口规范保持不变 确保了兼容性。若将Mini SD插入特定的转接卡中 可当作标准SD卡来使用。 

                

TransFlash Micro SD 主角

Transflash卡 也称T-Flash卡 TF或T卡 最早由SanDisk推出。T卡仅有11mmx15mmx1mm大小 仅相当于标准SD卡的1/4 比Mini SD卡还要小巧。 
同样 T卡是与标准SD卡功能也是兼容的 将T卡插入特定的转接卡中 可以当作标准SD卡或Mini SD卡来使用。 
2005年7月 SDA协会正式发布了Micro SD标准 该标准与TransFlash卡完全兼容 市场上的TransFlash卡和Micro SD卡可以不加区分的使用。这好比TransFlash是卡的小名 等长大了就取了个Micro SD的学名 不过大家还是叫其TransFlash的多  

Mini SD、Micro SD这种小体积SD卡的出现 大大拓展了SD卡的应用范围 这使得SD卡应用在一些小型手机中成为可能。另一方面 Mini SD、Micro SD功能与SD卡功能兼容 只要将其插入特定转接卡中 即可当作标准SD卡来使用 这样 Mini SD、Micro SD便可用于那些使用标准SD卡的数码设备 这加速了Mini SD、Micro SD的市场普及。 

                 
  

 

miniSD相对于标准SD 增加了2个NC引脚 
microSD相对于标准SD 减少了1个VSS引脚 


SDHC
目前市场上的SD、Mini SD、Micro SD卡遵循的是SD Spec Ver1.0或1.1规范 最大可能容量仅为2GB。2006年 SDA协会发布了SD Spec Ver2.0规范 符合此新规范的SD卡容量可达4GB或更高。 
符合2.0规范的SD卡 称为SDHC SD high capacity 卡。SDHC卡外形维持与SD卡一致 但是文件系统从FAT12、FAT16改为FAT32型 SDHC卡的最大容量可达32GB。除了SDHC卡外,还有Mini SDHC Micro SDHC类型的卡。 

SDHC卡与标准SD卡不再兼容 必须符合SD Spec Ver2.0的设备才能支持SDHC卡 这样的设备都会带有SDHC logo。而支持SDHC卡的设备可以向下兼容标准SD卡。 
为了充分发挥SDHC卡的性能 保证兼容性 SDA协会为SDHC卡定义了3个速度等级 2 4 6 其含义是各等级分别可以忍受的写速率至少是2MB/S 4MB/S 6MB/S.速度等级定义中使用的是数据写速率 数据读速率要比数据写速率快。 

 

容量大于2GB的SDHC卡必须带有SDHC符号和速度等级标记符号

二、microSD(TF)介绍

SD卡和Micro SD卡其实也就大小和引脚不一样 它们的操作其实是一样的 所以网上的SD卡读写代码其实可以直接拿来用。关于SD卡和Micro SD卡的引脚定义和不同可见下两表







    我们可以发现Micro SD卡只有8个引脚是因为比SD卡少了一个Vss。当然你也可以买个卡套套在Micro SD卡上 这样一来大小就和SD卡一样大 这时候卡套上的9个引脚就和SD卡一样了 你可以完全当做SD卡来操作。



三、micorSD(TF)的驱动

上面Micro SD卡的硬件电路就好了 下面我们讲讲Micro SD卡的软件驱动和指令集。

SD卡的命令格式如下 6字节共48位 传输时最高位(MSB)先传输


    SD卡的command 命令 占6 bit 一般叫CMDx或ACMDx 比如CMD1就是1 CMD13就是13 ACMD41就是41 依此类推。Command Argument 命令参数 占4 byte 并不是所有命令都有参数 没有参数的话该位一般就用置0。最后一个字节由7 bit CRC校验位和1 bit停止位组成。在SPI模式下 CRC是被忽略的 可以都置1或置0.但是发送CMD0时要记得加上CRC 即最后1字节为0x95 因为发送CMD0时还未进入SPI模式 PS CMD8也要 但一般大家都把发送CMD8省略了 。

    每次发送完一次命令后 SD卡都会有回应。SD卡的回应有多种格式 1字节的R1 2字节的R2等 不过一般在SPI模式中我们只用到R1 下面介绍R1的格式


    关于SD卡SPI和command的发送要注意以下几点
    1.SD卡的SPI总线 在读入数据时SD卡的SPI是CLK的上升沿输入锁存 输出数据也是在上升沿。 
    2.向SD卡写入一个CMD或者ACMD指令的过程是这样的 首先使CS为低电平 SD卡使能 其次在SD卡的Din写入指令 写入指令后还要附加8个填充时钟 是SD卡完成内部操作 之后在SD卡的Dout上接受回应 回应接受完毕使CS为低电平 再附加8个填充时钟。 

    3.在SD卡的Din没有数据写入时 应使Din保持高电平。关于这一点我可吃透了苦头 本来也记得要保持高电平的 结果不知怎的鬼使神差的置0拉低了。结果程序出现了各种奇怪的貌似偶然的错误 比如连续两次复位会有一次失败 单步调试成功全速运行又会失败。总之在这个过程中我对时序进行各种改变 每次解决一个问题后又会有新的问题出现 多少次动摇了我对MicroSD卡和SD卡的操作是一样的这个看法。因为这个低级的错误耽误了我三四天 看来细心很重要啊 我已经不止一次因为不细心浪费大量时间了 希望大家也引以为戒。


好了 现在SD卡的命令和回应清楚了 我们下面讲讲SD卡的复位 初始化和读写方法。


复位方法

1.拉高CS 发送至少74个clk周期来使SD卡达到正常工作电压和进行同步

2.选低CS 发送CMD0 需要收到回应0x01表示成功进入idle状态

3.拉高CS 发送8个时钟

复位时序图


    初始化

    复位成功后 SD卡就进入了SPI模式 接着应该进行初始化。初始化说白了有两种方法 1 发送CMD1 2 发送CMD55 ACMD41。我从网上查的资料可以看到这种说法 如果是MMC卡就发CMD1 SD卡则发CMD55 ACMD41。但是关于Micro SD卡要发哪种却讲的不太清楚 网上用这两种方法都有人成功过 但有的都成功不了。我自己也碰到了这种问题 刚开始拿了自己手机上的写着Nokia的2GB的Micro SD卡 应该是杂牌的 初始化了两天也没成功 快要放弃的时候想起来为什么不换张试试呢 于是就找室友借了他的手机内存卡 是2GB的Apacer的Micro SD卡 当然也可能是杂牌的 室友买那卡的地方一般都是卖各种廉价电子产品的 大家都知道是杂牌的 结果一试就成功了。后来我用了令一种方法发现也可以初始化 也就是说两种方法都可以初始化成功。但我的那种怎么就不行呢 难道不是所有Micro SD卡都支持SPI模式。我在网上百度了半天也不能确定是不是所有Micro SD卡都支持SPI模式。但我想 现在Micro SD卡的生产公司很多 而且你也并不能保证你的Micro SD卡不是杂牌的。你并不知道生产厂家进行了那些改变 因为确实有些厂家生产的SD卡精简了一些命令。所以初始化的时候建议两种都试一下 不过我记得SD卡的说明书上推荐使用第二种方法。


    下面是初始化方法

    1 使用CMD1

    发送CMD1 收到0x00表示成功

    时序图如下


    2 使用CMD55 ACMD41

    1.发送CMD55 表示使用ACMDx类命令 收到0x01

    2.发送ACMD41 收到0x00表示成功

    记住SD卡的初始化速度不能大于400kHz 所以一开始复位和初始化时spi的速率要设置低一点。


    读单块和多块

    SD卡读单块和多块的命令分别为CMD17和CMD18 他们的参数即要读的区域的开始地址。因为考虑到一般SD卡的读写要求地址对齐 所以一般我们都将地址转为块 并以扇区 块 512Byte 为单位进行读写 比如读扇区0参数就为0 读扇区1参数就为1 9(即地址512 读扇区2参数就为2 9(即地址1024 依此类推。


    读单块方法

    1.发送CMD17 收到0x00表示成功

    2.连续读直到读到开始字节0xFE

    3.读512个字节

    4.读两个CRC字节

    读单块时序图


    读多块方法

    1.发送CMD18读 收到0x00表示成功

    2.连续读直到读到开始字节0xFE

    3.读512字节

    4.读两个CRC字节

    5.如果还想读下一扇区 重复2-4

    6.发送CMD12来停止读多块操作


    写单块和多块

    SD卡用CMD24和CMD25来写单块和多块 参数的定义和读操作是一样的。

    写单块方法

    1.发送CMD24 收到0x00表示成功

    2.发送若干时钟

    3.发送写单块开始字节0xFE

    4.发送512个字节数据

    5.发送2字节CRC 可以均为0xff

    6.连续读直到读到XXX00101表示数据写入成功

    7.继续读进行忙检测 读到0x00表示SD卡正忙 当读到0xff表示写操作完成

    写单块时序图


    写多块方法

    1.发送CMD25 收到0x00表示成功

    2.发送若干时钟

    3.发送写多块开始字节0xFC

    4.发送512字节数据

    5.发送两个CRC 可以均为0xff

    6.连续读直到读到XXX00101表示数据写入成功

    7.继续读进行忙检测 直到读到0xFF表示写操作完成

    8.如果想读下一扇区重复2-7步骤

    9.发送写多块停止字节0xFD来停止写操作

    10.进行忙检测直到读到0xFF


注 以上部分内容引荐其他网上内容




guanyasu