SD卡内部构造与工作原理(分享)

上传人:ji****72 文档编号:37548659 上传时间:2018-04-18 格式:DOC 页数:27 大小:287.50KB
返回 下载 相关 举报
SD卡内部构造与工作原理(分享)_第1页
第1页 / 共27页
SD卡内部构造与工作原理(分享)_第2页
第2页 / 共27页
SD卡内部构造与工作原理(分享)_第3页
第3页 / 共27页
SD卡内部构造与工作原理(分享)_第4页
第4页 / 共27页
SD卡内部构造与工作原理(分享)_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《SD卡内部构造与工作原理(分享)》由会员分享,可在线阅读,更多相关《SD卡内部构造与工作原理(分享)(27页珍藏版)》请在金锄头文库上搜索。

1、SDSD 卡内部构造与工作原理(附加基于卡内部构造与工作原理(附加基于 Atmega128Atmega128 单片机单片机 SDSD 卡读写程序卡读写程序)1、简介:SD 卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD 卡允许在两种模式下工作,即 SD 模式和 SPI 模式,本系统采用 SPI模式。本小节仅简要介绍在 SPI 模式下,STM32 处理器如何读写SD 卡,如果读者如希望详细了解 SD 卡,可以参考相关资料。SD 卡内部结构及引脚如下图所示:SD 卡内部图.JPG2、SD 卡管脚图:SD

2、 卡图.JPG3、SPI 模式下 SD 各管脚名称为:sd 卡:SPI 模式下 SD 各管脚名称为.JPG注:一般 SD 有两种模式:SD 模式和 SPI 模式,管脚定义如下:(A) 、SD MODE 1、CD/DATA3 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA0 8、DATA1 9、DATA2(B) 、SPI MODE 1、CS 2、DI 3、VSS 4、VDD 5、SCLK 6、VSS2 7、DO 8、RSV 9、RSVSD 卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在 025MHz 之间变化,SD 卡的总线管理器可

3、以不受任何限制的自由产生 025MHz 的频率;CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;DAT03:数据线,数据可以从卡传向主机也可以从主机传向卡。SD 卡以命令形式来控制 SD 卡的读写等操作。可根据命令对多块或单块进行读写操作。在 SPI 模式下其命令由 6 个字节构成,其中高位在前。SD 卡命令的格式如表 1 所示,其中相关参数可以查阅SD 卡规范。4、MicroSD 卡管脚图:MicroSD 卡管脚图.JPG5、MicroSD 卡管脚名称:MicroSD 卡管脚名称.JPG

4、SD 卡与 MicroSD 卡仅仅是封装上的不同,MicroSD 卡更小,大小上和一个 SIM 卡差不多,但是协议与 SD 卡相同。一般我们用单片机操作 SD 卡时,都不需要对 FAT 分区表信息做处理,原因如下:1) 、操作 FAT 分区表要增加程序代码量、增加 SRAM 的消耗,对于便携应用来说代码大小和占用 SRAM 的多少至关重要。2) 、即使我们对 FAT 分区表不做任何了解,实际上我们一样可以向SD 卡上写入数据,这就表明使用 FAT 对我们做数据存储应用来说如同鸡肋。3) 、耗费大量经历和时间去了解 FAT 分区表对于我们做嵌入式软件开发的人来说有些得不偿失。4) 、SD 卡支持

5、两种操作模式,SD 模式和 SPI 模式,SPI 模式做 SD数据操作时根本不需要知道 FAT,这时候 SD 卡对于我们来说实际上就是个大的、快速的、方便的、容量可变的外部存储器。基于以上原因,一般情况下对 SD 卡的操作只需要了解 SPI 通讯就可以了,而现在大部分单片机都有 SPI 接口,那么操作 SD 卡易如反掌。以下是做 SD 卡试验时使用的电路图:SD 卡试验时使用的电路图.JPGSD_CS/连接到单片机的片选 SD 管脚,只有单片机设置 SD_CS/为低电平时才可以操作 SD 卡。MOSI 连接单片机 SPI 总线的 MOSI 管脚(SPI 数据输入) ,单片机从这个管脚读取 SD

6、 卡内的数据。MISO 连接单片机 SPI 总线的 MISO 管脚(SPI 数据输出) 、单片机通过这个管脚向 SD 卡内写入数据。SCK 连接单片机 SPI 总线的 SCK(SPI 时钟)SD 管脚实际上在 SD 卡内部连接到了 GND,当 SD 插座上没插入SD 卡时,单片机从这个管脚能读到高电平(前提是使用单片机内部上拉输入,或者外部增加一个上拉电阻) ,一旦插入 SD 卡,这个管脚就变成低电平,这个功能用来检测是否插入 SD 卡。RSV1 和 RSV2 是保留功能管脚,不需要操作。MicroSD 卡的连接和 SD 卡大同小异,只是 MicroSD 卡比 SD 卡少一个 GND 管脚,所

7、以不能使用上面做的这种插入卡的检测,实际上现在很多 SD 卡/MicroSD 卡插座都有插入检测管脚,当然,一分钱一分货,价格上当然也要贵一些顺便提一下,普通 SD 卡插座最多 5 块钱。SPI 命令格式Byte 1Byte2-5Byte 6765 031 07001CommandCommand ArgumentCRC1以下是一个简单的测试 SD 卡读写的程序,程序是基于 Atmega128单片机编写的,对于 Atmega 的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。sd.h/*/SPI 各线所占用的端口#define SD_SS PB6 #define SD_SCK PB1

8、#define SD_MOSI PB2#define SD_MISO PB3/*#define SD_DDR DDRB#define SD_PORT PORTB#define SD_PIN PINB#define SD_SS_H SD_PORT |= (124);SPI_TransferByte(address16);SPI_TransferByte(address8);SPI_TransferByte(address);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);dotmp = SPI_TransferByte(0xFF); /发送 8 个时钟

9、接受最后一个字节 retry+;while(tmp=0xff)return(tmp);/*/写一个扇区(512Byte) to MMC/SD-Card/如果写完成返回 TRUEunsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;SPI_TransferByte(0xFF); /延迟 8 个时钟 SD_Enable(); /开片选temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr9); /发送写扇

10、区命令if(temp != 0x00)SD_Disable();return(temp);SPI_TransferByte(0xFF);SPI_TransferByte(0xFF);SPI_TransferByte(0xFE);for (i=0;i512;i+)SPI_TransferByte(*Buffer+); /发送 512 字节数据/CRC-ByteSPI_TransferByte(0xFF); /Dummy CRCSPI_TransferByte(0xFF); /CRC Codetemp = SPI_TransferByte(0xFF); /读 SD 卡运行响应if(temp ret

11、urn(WRITE_BLOCK_ERROR); /返回错误while (SPI_TransferByte(0xFF) != 0xFF);SD_Disable();return(TRUE); /返回成功 /*/读 512 字节 from MMC/SD-Card/如果成功返回 TRUEunsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer)/*unsigned char temp;unsigned int i;unsigned char data;SPI_TransferByte(0xff); MMC_Enable

12、();temp = Write_Command_SD(SD_READ_BLOCK,addr9);/发送读扇区命令if(temp != 0x00)SD_Disable();return(READ_BLOCK_ERROR); /返回错误号 while(SPI_TransferByte(0xff) != 0xfe);for(i=0;i512;i+)data = SPI_TransferByte(0xff); /存数据 *Buffer+=data;SPI_TransferByte(0xff); /读 CRC 码SPI_TransferByte(0xff); /读 CRC 码SD_Disable();return(TRUE); /返回成功/*/查找数据开始标志(预设 DATASTART)根据实际需要删改/*unsigned long SD_find(void) unsigned long tmp=“400“;unsigned char data512;doSD_read_sector(tmp,data); /从 0 扇区开始查找tmp+; /查找 DATASTART while(!(data0=D)return tmp;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号