STM32下SD卡驱动详解

发布者:艺泉阁最新更新时间:2016-08-14 来源: eefocus关键字: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。 

关键字:STM32  SD卡驱动 引用地址:STM32下SD卡驱动详解

上一篇:STM32直接驱动ov7670 开发笔记
下一篇:ARM汇编语言中的中括号(“[”和“]”)是什么意思

推荐阅读最新更新时间:2024-03-16 15:05

创建keil工程并点亮STM32板子的LED灯
打开之前创建的工程,如下图所示(keil工程的创建在之前的文章中有,不了解的同学可以翻一下上一篇文章。)翻 (上图是已经建立完成的工程) 然后,再次打开我们之前下载的对应开发板版本的例程包中的点亮LED灯的例程 (路径为:en.stsw-stm32077 STM32L1xx_StdPeriph_Lib_V1.3.1 projectSTM32L1xx_StdPeriph_Examples GPIO IOToggle) 找到mian.c文件打开,全选复制里面的内容 再回到我们之前已经创建完毕的工程中,打开mian.c文件清空,并将GPIO文件中的main.c里面的内容粘贴到我们工程的mian.c中。 此时可以看到
[单片机]
创建keil工程并点亮<font color='red'>STM32</font>板子的LED灯
嵌入式学习②——STM32入门初步之LED闪烁
前言 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。 现在我们就来一起从头开始学习STM32的技术 一、STM32实现LED闪烁 示例 1.安装mdk5和stm32 安装mdk5 安装STM32 完成下载 2.使用μVision5创建工程 打开软件 创建工程 选择单片机
[单片机]
嵌入式学习②——<font color='red'>STM32</font>入门初步之LED闪烁
stm32+ucosII建立串口通信等多任务的实现
关于ucos的知识,目前是边做项目边加深理解,感觉还是有些欠缺,希望能从自己的代码经历中能总结出精髓。个人能力有限,编写边更新,难免有误,还望轻拍. 一、mailbox还是全局变量的问题 一般在任务间传递数据是采用mialbox,全局变量无法实现多任务按照时间片执行的目的。 设计的大概思想是: 中断接收,然后邮箱传递。目的任务去接收信息 void USART1_IRQHandler(void) { static unsigned char msg ; unsigned int i; OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL();
[单片机]
全新Netduino 3登陆Mouser 新增Wi-Fi连接功能 助力快速建立原型
贸泽电子(Mouser Electronics) 开始分销Netduino 3电子平台,能够使商业硬件解决方案和个人电子项目快速上市,同时提供了最大的设计灵活性并降低了风险。最新版本的开源Netduino平台不但具有让先前版本广受欢迎的最佳功能,还增加了Wi-Fi连接功能。 Mouser分销的 Netduino 3为针对Microsoft .NET Micro Framework而设计的开源电子平台,结合了高级编码的便利性与STM32 F4系列微控制器的原始功能集。Netduino 3基板型采用搭载168MHz ARM Cortex-M4处理器的32位STM32F427VG 微控制器(内置可实现读写同步的1MB双区
[嵌入式]
STM32 I2C AT24C02驱动
如果搞过51的I2C的同志,再来看看STM32的I2C驱动,一定有相见恨晚的感觉。STM32自带I2C硬件模块,再配合ST的官方库函数,I2C在STM32这里可以玩得如火的地步。这里的这个I2C驱动算是很完整了的,可以直接拿来用到项目开发中去。好,不废话,上图: 工程结构图: 1、main.c #include stm32f10x.h #include usart1.h #include led.h #include i2c_at24c02.h #include struct Contact{ u8 Name ; //姓名 u8 Phone ; //电话
[单片机]
STM32用IO口控制步进电机的简单程序
练习IO口库函数操作。 //相序 uint16_t phasecw ={0x2000,0x0001,0x0004,0x0008};// D-C-B-A uint16_t phaseccw ={0x0008,0x0004,0x0001,0x2000};// A-B-C-D //步进电机相关IO口初始化 // IN4: PC13 // IN3: PC0 // IN2: PC2 // IN1: PC3 void Moto_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph
[单片机]
基于STM32设计的数码相册
一、项目介绍 项目是基于 STM32 设计的 数码 相册,能够通过LCD显示屏解码显示主流的图片,支持bmp、jpg、gif等格式。用户可以通过按键或者触摸屏来切换图片,同时还可以旋转显示,并能够自适应居中显示,小尺寸图片居中显示,大尺寸图片自动缩小显示(超出屏幕范围)。图片从 SD 卡中获取。 二、设计思路 2.1 硬件 设计 本项目所需的主要硬件: STM32F103ZET6 LCD屏幕 SD卡模块 按键和触摸屏 2.2 软件设计 (1)解码图片 在STM32 芯片 中,解码图片需要将读取到的数据存入图形缓冲区中,以便进行图画显示。常用的解码 算法 有JPEG解码和BMP解码。 (2)图片显示 为了更好的实现
[单片机]
基于<font color='red'>STM32</font>设计的数码相册
stm32的DMA串口应用(以串口1为例)
stm32的DMA串口应用(以串口1为例) 1.定义宏常量 #define BuffSize 12 #define DATA_HEAD 0xAA #define DATA_END 0x55 #define USART1_DR_Address (u32)0x40013804 2.声明DMA初始化函数 void DMA_Configuration(void); 3.打开DMA1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 4.调用初始化函数 DMA_Configuration(); 5.DMA初始化函数 void DMA_C
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved