Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38735
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2022-05-02 01:54
文章分类

全部博文(27)

文章存档

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 后,禁止片选;

下面用图表示一下:(网上都有)

STM32下SD卡驱动详解 - stubbron - ChinaHEAVEN

 

STM32下SD卡驱动详解 - stubbron - ChinaHEAVEN

 

STM32下SD卡驱动详解 - stubbron - ChinaHEAVEN

 

STM32下SD卡驱动详解 - stubbron - ChinaHEAVEN
SD卡的每一个BLOCK的大小就是在这决定的一般为512.

 

STM32下SD卡驱动详解 - stubbron - ChinaHEAVEN

 可以看出操作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。        

 

   程序我就不贴了,网上都有我只是把他们组合在一起了让新手更方便。

阅读(1191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~