你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3025|回复: 0

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第四十四章 SD卡实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-4-4 23:09:06 | 显示全部楼层 |阅读模式

<div style="padding-bottom: 5px; line-height: 1.5; background-color: rgb(255,255,255); margin: 0px; padding-left: 5px; padding-right: 5px; color: rgb(0,0,0); font-size: 12px; padding-top: 5px"><a name="_Toc342394335">44.1 SD卡简介
SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于19998月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。按容量分类,可以将SD卡分为3类:SD卡、SDHC卡、SDXC卡。如表44.1.1所示:
            
容量

            
            
命名

            
            
简称

            
            
0~2G

            
            
Standard Capacity SD Memory Card

            
            
SDSC或SD

            
            
2G~32G

            
            
High Capacity SD Memory Card

            
            
SDHC

            
            
32G~2T

            
            
Extended Capacity SD Memory Card

            
            
SDXC

            

44.1.1 SD卡按容量分类

SD卡和SDHC卡协议基本兼容,但是SDXC卡,同这两者区别就比较大了,本章我们讨论的主要是SD/SDHC卡(简称SD卡)。
SD卡一般支持2种操作模式:
1,SD卡模式(通过SDIO通信);
2,SPI模式;
主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。
SD卡的引脚排序如下图44.1.1所示:
图44.1.1 SD卡引脚排序图

SD卡引脚功能描述如表45.1.2所示:
表45.1.2 SD卡引脚功能表SD卡只能使用3.3V的IO电平,所以,MCU一定要能够支持3.3V的IO端口输出。注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉电阻。
SD卡有5个寄存器,如表45.1.3所示:
            名称
            
            宽度
            
            描述
            
            CID
            
            128
            
            卡标识寄存器
            
            RCA
            
            16
            
            相对卡地址(Relative card address)寄存器:本地系统中卡的地址,动态变化,在主机初始化的时候确定
            *SPI模式中没有
            
            CSD
            
            128
            
            卡描述数据:卡操作条件相关的信息数据
            
            SCR
            
            64
            
            SD配置寄存器:SD卡特定信息数据
            
            OCR
            
            32
            
            操作条件寄存器
            

表45.1.3 SD卡相关寄存器

关于这些寄存器的详细描述,请参考光盘相关SD卡资料。我们在这里就不描述了。接下来,我们看看SD卡的命令格式,如表45.1.4所示:
            
字节1

            
            
字节2--5

            
            
字节6

            
            
7

            
            
6

            
            
5      0

            
            
31       0

            
            
7       1

            
            
0

            
            
0

            
            
1

            
            
command

            
            
命令参数

            
            
CRC

            
            
1

            

表45.1.4 SD卡命令格式

SD卡的指令由6个字节组成,字节1的最高2位固定为01,低6位为命令号(比如CMD16,为10000即16进制的0X10,完整的CMD16,第一个字节为01010000,即0X10+0X40)。
字节2~5为命令参数,有些命令是没有参数的。
字节6的高七位为CRC值,最低位恒定为1。
SD卡的命令总共有12类,分为Class0~Class11,本章,我们仅介绍几个比较重要的命令,如表45.1.5所示:
            
命令

            
            
参数

            
            
回应

            
            
描述

            
            
CMD0(0X00)

            
            
NONE

            
            
R1

            
            
复位SD卡

            
            
CMD8(0X08)

            
            
VHS+Check pattern

            
            
R7

            
            
发送接口状态命令

            
            
CMD9(0X09)

            
            
NONE

            
            
R1

            
            
读取卡特定数据寄存器

            
            
CMD10(0X0A)

            
            
NONE

            
            
R1

            
            
读取卡标志数据寄存器

            
            
CMD16(0X10)

            
            
块大小

            
            
R1

            
            
设置块大小(字节数)

            
            
CMD17(0X11)

            
            
地址

            
            
R1

            
            
读取一个块的数据

            
            
CMD24(0X18)

            
            
地址

            
            
R1

            
            
写入一个块的数据

            
            
CMD41(0X29)

            
            
NONE

            
            
R3

            
            
发送给主机容量支持信息和激活
            卡初始化过程

            
            
CMD55(0X37)

            
            
NONE

            
            
R1

            
            
告诉SD卡,下一个是特定应用命令

            
            
CMD58(0X3A)

            
            
NONE

            
            
R3

            
            
读取OCR寄存器

            

表45.1.5 SD卡部分命令

上表中,大部分的命令是初始化的时候用的。表中的R1、R3和R7等是SD卡的回应,SD卡和单片机的通信采用发送应答机制,如图45.1.2所示:

图45.1.2 SD卡命令传输过程

       每发送一个命令,SD卡都会给出一个应答,以告知主机该命令的执行情况,或者返回主机需要获取的数据。SPI模式下,SD卡针对不同的命令,应答可以使R1~R7,R1的应答,各位描述如表45.1.6所示:

 
            
R1响应格式

            
            

            
            
7

            
            
6

            
            
5

            
            
4

            
            
3

            
            
2

            
            
1

            
            
0

            
            
含义

            
            
开始位
            始终为0

            
            
参数
            错误

            
            
地址
            错误

            
            
擦除序列
            错误

            
            
CRC错误

            
            
非法
            命令

            
            
擦除
            复位

            
            
闲置
            状态

            
表45.1.6 R1响应各位描述

       R2~R7的响应,我们就不介绍了,请的大家参考SD卡2.0协议。接下来,我们看看SD卡初始化过程。因为我们使用的是SPI模式,所以先得让SD卡进入SPI模式。方法如下:在SD卡收到复位命令(CMD0)时,CS为有效电平(低电平)则SPI模式被启用。不过在发送CMD0之前,要发送>74个时钟,这是因为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK时钟最大不能超过400Khz!。
接着我们看看SD卡的初始化,SD卡的典型初始化过程如下:
1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);
2、上电延时(>74个CLK);
3、复位卡(CMD0),进入IDLE状态;
4、发送CMD8,检查是否支持2.0协议;
5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
6、取消片选,发多8个CLK,结束初始化
这样我们就完成了对SD卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。
SD卡读取数据,这里通过CMD17来实现,具体过程如下:
1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;
以上就是一个典型的读取SD卡数据过程,SD卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下:
1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;
以上就是一个典型的写SD卡过程。关于SD卡的介绍,我们就介绍到这里,更详细的介绍请参考光盘SD卡的参考资料(SD卡2.0协议)。
<a name="_Toc342394337">44.3 软件设计
打开上一章的工程,首先在HARDWARE文件夹下新建一个SD的文件夹。然后新建一个MMC_SD.C和MMC_SD.H的文件保存在SD文件夹下,并将这个文件夹加入头文件包含路径。
打开MMC_SD.C文件,在该文件里面,我们输入与SD卡相关的操作代码,这里由于篇幅限制,我们不贴出所有代码,仅介绍两个最重要的函数,第一个是SD_Initialize函数,该函数源码如下:                                              
//初始化SD卡
u8 SD_Initialize(void)
{
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用来进行超时计数
    u8 buf[4]; 
       u16 i;
       SD_SPI_Init();             //初始化IO
      SD_SPI_SpeedLow();    //设置到低速模式
<div style="margin: 5px 0px">      for(i=0;i

《STM32开发指南》第四十四章 SD卡实验.rar

下载

686.87 KB, 下载次数: 19, 下载积分: ST金币 -1

实验39 SD卡实验.rar

下载

194.65 KB, 下载次数: 21, 下载积分: ST金币 -1

回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版