您现在正在浏览:首页 > 职教文章 > 职教论文 > SD卡的SPI模式总结

SD卡的SPI模式总结

日期: 2013/6/18 浏览: 2 来源: 学海网收集整理 作者: 学海网

SD卡的SPI模式总结

最初接触SD卡,看了一大推民间高手自己总结的资料,感觉很杂,而且不详细,忽略了很多像我这种菜鸟不明白的问题。

例如SD卡的命令格式,CRC校验码(这个东西困惑了好久)等等。后来我索性找了SD卡的官方数据手册,对着英文一点一点看起来。下面让我来一一的总结一下。

首先、SD卡具有SD和SPI两种通信协议。上电之后,其默认通信模式为SD模式,相较SPI模式而言,SD模式主要的优势在于

速度,也就是说它比SPI通信更快,多用于一些对速度要求较快的地方。而SPI模式相较SD模式的优势则在于线路简单,而且很多

MCU自带了SPI外设,所以SPI模式用起来会相对简单,当然SPI模式的速度比SD模式的速度要慢。

这里我们主要讨论SD卡的SPI模式的应用!

SD卡应用SPI模式与MCU相接时只需六根线,时钟线(SCK)、数据输入线(SI)、数据输出线(SO)、片选(CS)(低电平有效),当然还有两根电源线(注意:电源供电为3.3V,SD卡的供电范围为2.7至3.6V)。上电后,SD卡默认为SD模式,所以我们就得发送命令让SD卡进入SPI模式。既然要发送命令,那就必然得知道这个发命令的程序怎么写,以及SD卡的读写时序。

读写的时序倒是容易明白,既然是SPI模式,那就是选中片选CS后往SD卡里面发送或是接收就是了。当然SD卡还是对SPI的时钟频率有要求的。SPI的时钟频率最快不得超过25MHZ,在发送命令的时候,为了兼容MMC卡,SPI时钟频率最快不得超过400KH

Z,最慢不得低于100KHZ(因为MMC卡的时钟频率为100K至400KHZ)。所以我们在收发命令的时候应将SPI的时钟频率设置在100K至400KHZ之间的慢速模式,在读写卡内数据的时候则可以设置为不超过25MHZ的高速模式。还有就是SD卡收发的数据(命令)都是高位在前低位在后的。

现在我们来说说命令格式。SD卡对命令格式是有要求的,规定一个命令包含六个字节,共分为三部分,如图1所示。

图1:SPI模式下SD卡的命令格式

第一部分是首字节,也就是BYTE1,它由三部分组成,首先是最高位,它表示起始位且总是0;然后是第六位,如果是主机发给SD卡的命令,则该位为1,若是SD卡返回给主机回应,则该位为0,也就是说这一位代表着这个命令是从主机到SD卡的还是从SD卡到主机的;最后是低六位的命令,它代表着命令序号,如果你发命令0给SD卡,则这六位就为0,如果你发命令32,则这六位的值就为32(一开始我看一些资料的时候很纳闷,说发命令0就是复位SD卡,那命令0到底是什么呢,还有就是有人说命令X的数值就是0X40+X,那为什么是0X40呢?后来才知道0X40就是第六位为1)。

第二部分就是BYTE2—5,就是命令参数,那什么是命令参数呢?比如说你要发读SD卡第1个扇区数据的命令,那命令的内容(也就是byte1的0至5位)就是读SD卡的数据。命令参数(byte2-5)就是第一个扇区的地址,也就是你要读SD卡的什么地方。有些命令是没有参数的,那就给0;有些命令是有参数的,参数的具体内容请参照SD卡的官方数据手册,那里有列表说明。

第三部分是BYTE6,它也包含两部分。最低位是结束位,其值总为1;其他7为即为CRC7校验码。校验码是最令我费解的地方,我看的所有民间资料都没有说CRC校验码的值是多少,那我这个命令怎么写呢?苦思不得其所!干脆看人家的程序,有些程序校验码给的都是0X95,有些给的是0XFF,有些是0X01,但有一个特点就是发命令0的时候,CRC码都是0X95,没有人说明这个CRC校验码是怎么计算出来的。于是乎上网搜索,看到了很多复杂而专业的东西,教你怎么计算,都很复杂也看不明白。我想每个命令的校验码应该是固定的而且肯定都不相同,所以根本就不需要你自己去计算!后来仔细看SD卡的官方英文手册的时候才发现,在SPI模式下,根本就不需要CRC码进行数据的校验,CRC码只是用来SD模式用的,到这才终于明白为什么会有各种CRC码了。但是在发送命令0(复位命令)时,一定要加上0X95的CRC码。因为上电后SD卡默认是在SD模式的,你发命令0将其转换为SPI模式时,SD卡还是在SD模式,所以要加CRC码,至于为什么是0X95呢?这就是芯片开发商通过CRC码的计算公式算出来的,至于怎么算的,这就不是我们关心的范围了,你只要知道怎么用就行!

到这里总算是搞明白了SD卡的命令格式了。


SD卡的SPI模式总结.doc

返回顶部