收藏 分享(赏)

SD卡电路图.doc

上传人:ysd1539 文档编号:6201451 上传时间:2019-04-02 格式:DOC 页数:16 大小:396KB
下载 相关 举报
SD卡电路图.doc_第1页
第1页 / 共16页
SD卡电路图.doc_第2页
第2页 / 共16页
SD卡电路图.doc_第3页
第3页 / 共16页
SD卡电路图.doc_第4页
第4页 / 共16页
SD卡电路图.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、http:/ 卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如 MP3、数码相机等设备上也都采用 SD 卡作为其存储设备。 SD 卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对 SD 卡的硬件与读写时序进行研究。对于 SD 卡的硬件结构,在官方的文档上有很详细的介绍,如 SD 卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用 51 单片机成功实现了对 SD 卡的

2、扇区读写,并对其读写速度进行了评估。下面先来讲解 SD 卡的读写时序。(1) SD 卡的引脚定义: SD 卡引脚功能详述:SD 模式 SPI 模式 引脚 编号 名称 类型 描述 名称 类型 描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 VSS1 S 电源地 VSS S 电源地 4 VDD S 电源 VDD S 电源 5 CLK I 时钟 SCLK I 时钟 6 VSS2 S 电源地 VSS2 S 电源地 7 DAT0 IO或PP 数据线0 DO O或PP 数据输出 8 DAT1 IO或PP 数据线1 RSV

3、9 DAT2 IO或PP 数据线2 RSV 注:S:电源供给 I:输入 O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出 SD 卡 SPI 模式下与单片机的连接图:SD 卡支持两种总线方式:SD 方式与 SPI 方式。其中 SD 方式采用 6 线制,使用CLK、CMD、DAT0DAT3 进行数据通信。而 SPI 方式采用 4 线制,使用CS、CLK 、DataIn 、DataOut 进行数据通信。SD 方式时的数据传输速度与 SPI 方式要快,采用单片机对 SD 卡进行读写时一般都采用 SPI 模式。采用不同的初始化方式可以使 SD 卡工作于 SD 方式或 SPI 方式。这里只对其 SPI

4、 方式进行介绍。(2) SPI 方式驱动 SD 卡的方法SD 卡的 SPI 通信接口使其可以通过 SPI 通道进行数据读写。从应用的角度来看,采用SPI 接口的好处在于,很多单片机内部自带 SPI 控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了 SD 卡的性能优势,要解决这一问题,就要用 SD 方式,因为它提供更大的总线数据带宽。SPI 接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍 SD 卡的驱动方法,只实现简单的扇区读写。1) 命令与数据传输1. 命令传输SD 卡自身有完备的命令系统,以实现各项操作。命令格式如下:命令的传输过程采用发送

5、应答机制,过程如下:每一个命令都有自己命令应答格式。在 SPI 模式中定义了三种应答格式,如下表所示:字节 位 含义 7 开始位,始终为 0 6 参数错误 5 地址错误 4 擦除序列错误 3 CRC 错误 2 非法命令 1 擦除复位 1 0 闲置状态 字节 位 含义 7 开始位,始终为 0 1 6 参数错误 5 地址错误 4 擦除序列错误 3 CRC 错误 2 非法命令 1 擦除复位 0 闲置状态 7 溢出,CSD 覆盖 6 擦除参数 5 写保护非法 4 卡 ECC 失败 3 卡控制器错误 2 未知错误 1 写保护擦除跳过,锁解锁失败 2 0 锁卡 字节 位 含义 7 开始位,始终为 0 6

6、参数错误 5 地址错误 4 擦除序列错误 3 CRC 错误 2 非法命令 1 擦除复位 1 0 闲置状态 25 全部 操作条件寄存器,高位在前 写命令的例程:/-向 SD 卡中写入命令,并返回回应的第二个字节/-unsigned char Write_Command_SD(unsigned char *CMD)unsigned char tmp;unsigned char retry=0;unsigned char i;/禁止 SD 卡片选SPI_CS=1;/发送 8 个时钟信号Write_Byte_SD(0xFF);/使能 SD 卡片选SPI_CS=0;/向 SD 卡发送 6 字节命令for

7、 (i=0;isector_count = sectorBuffer.dat6 vinf-sector_count sector_count += sectorBuffer.dat7;vinf-sector_count sector_count += (sectorBuffer.dat8 / 获取 multipliervinf-sector_multiply = sectorBuffer.dat9 vinf-sector_multiply sector_multiply += (sectorBuffer.dat10 /获取 SD 卡的容量vinf-size_MB = vinf-sector_c

8、ount (9-vinf-sector_multiply);/ get the name of the cardRead_CID_SD(sectorBuffer.dat);vinf-name0 = sectorBuffer.dat3;vinf-name1 = sectorBuffer.dat4;vinf-name2 = sectorBuffer.dat5;vinf-name3 = sectorBuffer.dat6;vinf-name4 = sectorBuffer.dat7;vinf-name5 = 0x00; /end flag 以上程序将信息装载到一个结构体中,这个结构体的定义如下:ty

9、pedef struct SD_VOLUME_INFO /SD/SD Card infounsigned int size_MB;unsigned char sector_multiply;unsigned int sector_count;unsigned char name6; VOLUME_INFO_TYPE;5) 扇区读扇区读是对 SD 卡驱动的目的之一。SD 卡的每一个扇区中有 512 个字节,一次扇区读操作将把某一个扇区内的 512 个字节全部读出。过程很简单,先写入命令,在得到相应的回应后,开始数据读取。扇区读的时序:扇区读的程序例程:unsigned char SD_Read_

10、Sector(unsigned long sector,unsigned char *buffer) unsigned char retry;/命令 16unsigned char CMD = 0x51,0x00,0x00,0x00,0x00,0xFF; unsigned char temp;/地址变换 由逻辑块地址转为字节地址sector = sector 24 );CMD2 = (sector CMD3 = (sector /将命令 16 写入 SD 卡retry=0;do /为了保证写入命令 一共写 100 次temp=Write_Command_MMC(CMD);retry+;if(r

11、etry=100) return(READ_BLOCK_ERROR); /block write Error!while(temp!=0); /Read Start Byte form MMC/SD-Card (FEh/Start Byte)/Now data is ready,you can read it out.while (Read_Byte_MMC() != 0xfe);readPos=0;SD_get_data(512,buffer) ; /512 字节被读出到 buffer 中return 0;其中 SD_get_data 函数如下:/-获取数据到 buffer 中/-void

12、SD_get_data(unsigned int Bytes,unsigned char *buffer) unsigned int j;for (j=0;j24 );CMD2 = (addr CMD3 = (addr /写命令 24 到 SD 卡中去retry=0;do /为了可靠写入,写 100 次tmp=Write_Command_SD(CMD);retry+;if(retry=100) return(tmp); /send commamd Error!while(tmp!=0); /在写之前先产生 100 个时钟信号for (i=0;i100;i+)Read_Byte_SD();/写入

13、开始字节Write_Byte_MMC(0xFE); /现在可以写入 512 个字节for (i=0;i512;i+)Write_Byte_MMC(*Buffer+); /CRC-Byte Write_Byte_MMC(0xFF); /Dummy CRCWrite_Byte_MMC(0xFF); /CRC Codetmp=Read_Byte_MMC(); / read responseif(tmp return(WRITE_BLOCK_ERROR); /Error!/等到 SD 卡不忙为止/因为数据被接受后,SD 卡在向储存阵列中编程数据while (Read_Byte_MMC()!=0xff);/禁止 SD 卡SPI_CS=1;return(0);/写入成功此上内容在笔者的实验中都已调试通过。单片机采用 STC89LE 单片机(SD 卡的初始化电压为 2.0V3.6V,操作电压为 3.1V3.5V,因此不能用 5V 单片机,或进行分压处理) ,工作于 22.1184M 的时钟下,由于所采用的单片机中没硬件 SPI,采用软件模拟 SPI,因此读写速率都较慢。如果要半 SD 卡应用于音频、视频等要求高速场合,则需要选用有硬件 SPI的控制器,或使用 SD 模式,当然这就需要各位读者对 SD 模式加以研究,有了 SPI 模式的基础,SD 模式应该不是什么难事。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 通信信息 > 电子设计

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报