while(1)世界STM32学习笔记
STM32学习笔记
----SD卡V2.0协议初始化
《STM32学习笔记》由while(1)世界会员所总结的学习笔记,
供大家参考学习,有问题可以在while(1)世界的STM32版块提问,
共同讨论。
这一笔记是有会员liklon总结的学习笔记,如果有问题可以在
while(1)世界的STM32版块发帖提问!STM32版块也提供源代码下
载。笔记具体类容如下:
while(1)世界STM32学习笔记
现在使用的4G的SD卡,小于或等于2G的卡是属于标准SD卡,而大于2G的卡
小于32G的卡是大容量SD卡,也就是SDHC卡。对于SDHC卡的初始化和操作要
使用V2.0协议。看了几天的SD卡v2.0协议,现在总结一下啊。
首先是一个流程图,这个图在官方资料上有:
SPI模式下SD卡部分操作指令
命令参数回应描述
CM0(0X00)NONER1
复位SD卡
CMD9(0X09)NONER1
读取卡特定寄存器
CMD10(0X0A)NONER1读取卡标志寄存器
CMD16(0X10)块大小R1设置块的大小(字节数)
CMD17(0X11)地址R1
读取一块的数据
CMD24(0X18)地址R1
写入一块的数据
while(1)世界STM32学习笔记
CMD41(0X29)NONER1开始卡的初始化
CMD55(0X37)NONER1
引用命令的前命令
CMD59(0X3B)最后一位有效R1
设置CRC开启(1)或关闭(0)
SD卡R1回应格式:
BIT
7
BIT6BIT5BIT4BIT3BIT2BIT1BIT0
0参数错误地址错误连续擦除错误命令CRC错误非法命令擦除复位IDLE状态
卡会根据不同的时候处在不同的状态
第一步操作:复位 第二步操作发送CMD8来分辨卡的类型,是V2.0卡还是V1.0卡或MMC卡,还可 ApplicationNote: 判断Checkvoltage按照如下标准: 根据流程图就可以看出发送CMD8后SD卡的类型基本上分了两类。 SD_WriteCommand(CMD41,0x40000000,0X01);//发送ACMD41,流程图写的如果主 前面的R1应该为0。 对于V1.0和MMC卡的初始化应该照着流程图搞也是一样的。
SD卡上电后先发送(>74个时钟),因为SD卡有个供电电压上升过程需要大约
64个时钟,之后的10个时钟是用来与SD卡同步(参考《例说STM32》)。参考代
码:
for(count=0;count<15;count++)
SPI_WriteReadByte(0xff);//产生74个以上的脉冲
SD卡默认是SD模式,现在用STM32去操作,切换为SPI模式后更好操作。所以
while(1)世界STM32学习笔记
在片选为低时发送CMD0,此时卡进入IDLE状态,因为CMD0回应的命令是R1,
根据上面R1的回应格式可以看出我们自需要检查最低位就知道是否处于IDLE
状态。参考代码:
do
{
tmp=SD_WriteCommand(CMD0,0,0X95);//发送SD
count++;
}while((tmp!=0x01)&&(count
以检测CMD8响应返回的数据判断是否支持给定的工作电压范围。
根据流程图可以看出。
1.如果SD卡支持当前的电压就会返回R7,并包含CMD8的参数部分,其中包括:
Checkvoltage和checkpattern。
2.如果SD卡不支持当前的工作电压则不会返回任何响应信息,继续处在IDLE
状态。如果是V1.0x的SD卡也不会有响应。
3.在PLV2.0(physicallayerversion2.0)下,在首次执行ACMD41之前,必须
执行CMD8指令,用以初始化SDHC卡,SDHC卡根据是否接收到CMD8指令来鉴别
控制器是否支持PLV2.0协议。使用低电压的控制器也必须在ACMD41命令之前发
送CMD8,避免可以工作在两种电压模式下的SD卡因为没有接收到CMD8,而默
认工作在高电压环境下,被误认为是只支持高电压工作模式。
Itisrecommendedtouse‘10101010b’forthe‘checkpattern’.
R7的格式:
while(1)世界STM32学习笔记
从上面可以看到,R7为5个字节,在发送CMD8后,SD卡响应,发送回来的第一
个字节就是R1,之后的4个字节中就包含了Checkvoltage和checkpattern。
下面是仿真的结果:
第三步:由ACMD41来初始化SD卡,SD卡的初始化从收到ACMD41开始。
ACMD指令的HCS(HostCapacitySupport)位如果设定为1的话,表明控制器
支持SDHC卡,否则表示不支持。
SD卡初始化和识别过程:
在CMD8命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS部分,
在响应里面多了CCS(CardCapacityStatus)部分。HCS参数会被不响应CMD8
命令的SD卡所抛弃。控制器向不响应CMD8的卡发送ACMD41指令时,HCS位应
while(1)世界STM32学习笔记
该设置为零0。如果向SDHC卡发送HCS位为0的ACMD41命令,SDHC卡返回的响
应,其busy标识位永远为0,代表忙状态。HCS标识位用来表明SD卡是否已经
完成初始化,如果未完成,HCS为零,否则为1,如果HCS为0,控制器会重复
发送ACMD41指令,SD卡只检查首次接收到的ACMD41指令的HCS位。
按照流程图,现在发送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:
之后再接收4个字节的数据。并判断bit30位。就可以判断是SDV2.0还是
SDV2.0HC。初始化完成
上面的只是个人的理解,参考了《SD卡2.0协议》,《SD卡协议学习点滴》,《例
说STM32》.