自己在这几个月中为了毕业设计放下了对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。