2022年(27)
分类: 嵌入式
2022-05-03 15:24:39
原文地址:STM32下SD卡驱动详解 作者:我本痴情
自己在这几个月中为了毕业设计放下了对S3C2440的学习,从而着手在STM32上的模块开发。我用STM32做的是一个有界面的MP3所以不得不用到SD卡,(当然nandflash也可以不过pcb难画不说,最主要容易坏掉)。SD卡方便快捷。
说道SD卡就会想到他的具体驱动,网上也有很多例子,但是都没这么详细说一个过程对于新手很难吃懂,当然这篇对于做过的同学来说没有什么作用,现在来具体分析一下吧。
我们所说的SD卡只是闪存的一种其全称是Secure Digital,意为“安全数码”,是由日本两大电器集团松下电器和东芝联手SanDisk共同推出的,于1999年8月首次发布。常见的闪存有:SD卡、CF卡、XD卡、MMC卡、SM卡、Mini SD卡、T-Flash卡。而SD卡又分类为:
SD、MiniSD、MicroSD、SDHC、MiniSD、MicroSD、SDXC、smart SD、SDI/O。它们在外形、速度、容量和命令都有区别。说道这就得说说最近的反日了,其实我们真没必要给国家添麻烦了,我们身边很多东西都是别人的,只是都不知道。所以壮大自己的知识为国家多做点事才是真正的爱国。
SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。
这就说明SD卡里面是有一个控制器的,有相应寄存器,我们用SD卡其实是对相应的寄存器的设置,设置好后就可以用命令来对它进行操作了,(所以说SD卡用起来简单,因为很多事SD卡厂商已经做了)。
一,SPI方式驱动SD卡的方法
SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,失去了SD卡的快速的性能优势。(SPI模式下用USB下载测试只有100K~300K的速度,而用SD模式就可以高达3M~10M),这就是SPI严重的缺点,但是对于我们学生用SPI是最简单,SD模式有很复杂的模式转换,转来转去的有一定的难度,不过也可以做SD模式,很多控制器都有SDIO了。
二,SD卡的命令
SD卡最重要的就是初始化,初始化重要的是命令的使用。SD卡初始化成功后几乎都能用了,所以我们要重点看一下初始化,不同的卡又不同的初始化过程(初始化时要注意SPI的速度不要高于400K)
SD卡的典型初始化过程如下:
1、初始化与SD卡连接的硬件条件(MCU的 SPI配置,IO口配置);
2、上电延时(>74 个 CLK)(必须的);
3、复位卡(CMD0);
4、激活卡,内部初始化并获取卡类型(CMD1(用于 MMC卡)、CMD55、CMD41)(不同的地方就在这里)
5.、查询 OCR,获取供电状况(CMD58)(就是电压,一般不判断不然很多卡不能用);
6、是否使用CRC(CMD59)(CRC校验);
7、设置读写块数据长度(CMD16);
8、读取 CSD,获取存储卡的其他信息(CMD9);
9、发送 8CLK 后,禁止片选;
下面用图表示一下:(网上都有)
可以看出操作SD卡都是命令,只要把这些命令作用搞清楚就可以自己驱动SD卡了,我把命令都贴出来:
SPI方式下的要SD模式下的话STM官方有很详细的库文件;
Class0 :(卡的识别、初始化等基本命令集)
CMD0:复位SD 卡.
CMD1:读OCR寄存器.
CMD9:读CSD寄存器.
CMD10:读CID寄存器.
CMD12:停止读多块时的数据传输
CMD13:读 Card_Status 寄存器
Class2 (读卡命令集):
CMD16:设置块的长度
CMD17:读单块.
CMD18:读多块,直至主机发送CMD12为止 .
Class4(写卡命令集) :
CMD24:写单块.
CMD25:写多块.
CMD27:写CSD寄存器 .
Class5 (擦除卡命令集):
CMD32:设置擦除块的起始地址.
CMD33:设置擦除块的终止地址.
CMD38: 擦除所选择的块.
Class6(写保护命令集):
CMD28:设置写保护块的地址.
CMD29:擦除写保护块的地址.
CMD30: Ask the card for the status of the write protection bits
class7:卡的锁定,解锁功能命令集
class8:申请特定命令集。
class10 -11 :保留
其中 class1, class3,class9:SPI模式不支持
命令知道了我们来看一下命令的格式:
SD卡的指令由6字节(Byte)组成,如下:
Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)
Byte2-5:Command Arguments,命令参数,有些命令没有参数
Byte6:前7位为CRC(Cyclic Redundacy Check,循环冗余校验)校验位,最后一位为停止位1
byte1 byte2-5 byte6
01命令号 参数 CRC校验+1
参数是命令需要的没有参数的用0,比如CMD16在这写的就是512。
程序我就不贴了,网上都有我只是把他们组合在一起了让新手更方便。