STM32学习笔记之SD卡V2.0协议初始化

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32学习笔记

----SD卡V2.0协议初始化

现在使用的4G的SD卡,小于或等于2G的卡是属于标准SD卡,而大于2G的卡小于32G的卡是大容量SD卡,也就是SDHC卡。对于SDHC卡的初始化和操作要使用V2.0协议。看了几天的SD卡v2.0协议,现在总结一下啊。

首先是一个流程图,这个图在官方资料上有:

第一步操作:复位

SD卡上电后先发送(>74个时钟),因为SD卡有个供电电压上升过程需要大约64个时钟,之后的10个时钟是用来与SD卡同步(参考《例说STM32》)。参考代码:

for(count=0;count<15;count++)

SPI_WriteReadByte(0xff);//产生74个以上的脉冲

SD卡默认是SD模式,现在用STM32去操作,切换为SPI模式后更好操作。所以

在片选为低时发送CMD0,此时卡进入IDLE状态,因为CMD0回应的命令是R1,根据上面R1的回应格式可以看出我们自需要检查最低位就知道是否处于IDLE 状态。参考代码:

do

{

tmp=SD_WriteCommand(CMD0,0,0X95);//发送SD

count++;

}while((tmp!=0x01)&&(count

第二步操作发送CMD8来分辨卡的类型,是V2.0卡还是V1.0卡或MMC卡,还可以检测CMD8响应返回的数据判断是否支持给定的工作电压范围。

根据流程图可以看出。

1.如果SD卡支持当前的电压就会返回R7,并包含CMD8的参数部分,其中包括:Check voltage和check pattern。

2.如果SD卡不支持当前的工作电压则不会返回任何响应信息,继续处在IDLE 状态。如果是V1.0x的SD卡也不会有响应。

3.在PLV2.0(physical layer version2.0)下,在首次执行ACMD41之前,必须执行CMD8指令,用以初始化SDHC卡,SDHC卡根据是否接收到CMD8指令来鉴别控制器是否支持PLV2.0协议。使用低电压的控制器也必须在ACMD41命令之前发送CMD8,避免可以工作在两种电压模式下的SD卡因为没有接收到CMD8,而默认工作在高电压环境下,被误认为是只支持高电压工作模式。

Application Note:

It is recommended to use‘10101010b’for the‘check pattern’.

R7的格式:

从上面可以看到,R7为5个字节,在发送CMD8后,SD卡响应,发送回来的第一个字节就是R1,之后的4个字节中就包含了Check voltage和check pattern。下面是仿真的结果:

判断Check voltage按照如下标准:

根据流程图就可以看出发送CMD8后SD卡的类型基本上分了两类。

第三步:由ACMD41来初始化SD卡,SD卡的初始化从收到ACMD41开始。ACMD指令的HCS(Host Capacity Support)位如果设定为1的话,表明控制器支持SDHC卡,否则表示不支持。

SD卡初始化和识别过程:

在CMD8命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS部分,在响应里面多了CCS(Card Capacity Status)部分。HCS参数会被不响应CMD8命令的SD卡所抛弃。控制器向不响应CMD8的卡发送ACMD41指令时,HCS位应

该设置为零0。如果向SDHC卡发送HCS位为0的ACMD41命令,SDHC卡返回的响应,其busy标识位永远为0,代表忙状态。HCS标识位用来表明SD卡是否已经完成初始化,如果未完成,HCS为零,否则为1,如果HCS为0,控制器会重复发送ACMD41指令,SD卡只检查首次接收到的ACMD41指令的HCS位。

按照流程图,现在发送ACMD41可以用来分辨是否为高容量卡。

SD_WriteCommand(CMD41,0x40000000,0X01);//发送ACMD41,流程图写的如果主机支持大容量就将HCS置1.所以发送0x40000000

因为ACMD41为应用型指令,所以前面要加上CMD55一起使用。

SD_WriteCommand(CMD55,0,0x01);

SD_WriteCommand(CMD41,0x40000000,0X01);

一直发送这两条指令,直到卡准备好。处于Ready状态。

所以接收到响应为0之后就可以开始读取OCR信息。并检测bit30位(CCS位),如果此位是1就是高容量卡,如果为0则是标准SD卡。读取OCR的指令是CMD58,其响应是R3:

前面的R1应该为0。

之后再接收4个字节的数据。并判断bit30位。就可以判断是SDV2.0还是SDV2.0HC。初始化完成

对于V1.0和MMC卡的初始化应该照着流程图搞也是一样的。

上面的只是个人的理解,参考了《SD卡2.0协议》,《SD卡协议学习点滴》,《例说STM32》.

相关文档
最新文档