SD卡原理及内部结构_第1页
SD卡原理及内部结构_第2页
SD卡原理及内部结构_第3页
SD卡原理及内部结构_第4页
SD卡原理及内部结构_第5页
免费预览已结束,剩余19页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简介:SD卡(Secure Digital Memory Card )是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。本小节仅简要介绍在SPI模式下,STM32处理器如何读写 SD卡,如果读者如希望详细了解 SD卡,可以参考相关资料。SD卡内部结构及引脚如下图所示:I I 11DAT2CMDCLKDATOCDZDAT3Interface driverDAT1JjrCSD1:?:QFsmeToO*Card interlace controllerr«eTI QCRIjI:01 lo

2、 CID127:0 |OI RCA( 15:011 joI DSFJ1;QI OMemory core interface 怦獣 _2、SD卡管脚图:SD卡内部图JPG6-1.MIN4HIH_ _wt -CL25M1H L/fl 2 M CD/ CUD 3 DAT* DAT2Mi3、SPI模式下SD各管脚名称为:sd卡:阳.<>5$5- rr引.1.M|N區鯉酸3 4 5 S 7 Gvss ADD CLl ¥SIDATDDAT(LockPo51 h&nSD卡图JPGin./birri Te 叮 ofE"1(JIHOinliirGeneral To ler

3、<in<e O 15I讪恥 32 SIM B恥 Mlnde Pad DdinitionPm#NameType'SPI Description1CSI'Chip Select (Active low)2Daialn ,1Host to Card CcmTards and Dala3VSS)SSupply Vcrtage Ground4VDDS 'Supply Voltage5CLKIIClock6VSS2S 1Sup,ply Vollagie Gfcufk7DataOu:0Card to Host Data 日躲d Status8RSVffllReserved

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

5、令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,卡或所有卡;也可以是到所有卡;回复是对之前命令的回答,回复可以来自单DAT03 :数据线,数据可以从卡传向主机也可以从主机传向卡。SPISD卡以命令形式来控制 SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在模式下其命令由6个字节构成,其中高位在前。SD卡命令 的格式如表1所示,其中相关参数 可以查阅SD卡规范。MicroSD卡管脚图:MicroSD卡管脚图JPGMicroSD卡管脚名称:Pin#SD ModeSPI ModeNameDescriptionNameTypeDescription1DAT2I'

6、;/O/PPData Lune IBrt 2RSVReserved2CD/DAT3"iopKCard Delecl / Datd Line fBrt 3CS1Chip Select Ineg Irtie)3CMDppCommcfDd/ResponseDI1Data iln4Vnc _sS<jpply voJiageVk)SSupply voltage5CLK1ClockSCLK1Clock6VjissSijpp voilaqe groundVs5SSupply voltaqe qrcjnd7DATOIfO/PPData Line |Brt 0DO6PPData OutSDAfi

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

8、人来说有些得不偿失。SPI模式做SD数据操作时根本不需要4 )、SD卡支持 两种操作模式,SD模式和SPI模式,知道FAT ,这时候SD卡对于我们来说实际上就是个大的、快速的、方便的、容量可变的外部存储器。基于以上原因,一般情况下对 SD卡的操作只需要了解SPI通讯就可以了,而现在大部分单片机都有SPI接口,那么操作 SD卡易如反掌。以下是做SD卡试验时使用的电路图:R647K(iSD CR7 -|47K(1RSVlfRS -I47KiiIRSV2SDSD CSDC51(4MOS 2SV SD 59 4SC K 5MISO?RSWRSV29CSDOLTGND cc SCKGND DINRS V

9、IRSV2SD_CARD SD痕ISD卡试验时使用的电路图JPG#defineSD SS HSD_P 0RT|=(1vSD_CS/连接到单片机的片选 MOSI连接单片机 的数据。SPI总线的SD管脚,只有单片机设置 SD_CS/为低电平时才可以操作 SD卡。MOSI管脚(SPI数据输入),单片机从这个管脚读取SD卡内MISO连接单片机入数据。SCK连接单片机SD管脚实际上在SPI总线的MISO管脚(SPI数据输岀)、单片机通过这个管脚向SD卡内写SPI总线的SCK(SPI时钟)SD卡内部连接到了 GND,当SD插座上没插入 SD卡时,单 片机从这个管脚能读到高电平(前提是使用单片机内部上拉输入

10、,或者外部增加一个上拉电阻),一旦插入SD卡,这个管脚就变成低电平,这个功能用来检测是否RSV1和RSV2是保留功能管脚,不需要操作。MicroSD卡的连接和SD卡大同小异,只是 MicroSD卡比SD卡少 一个GND管脚,所以不能 使用上面做的这种插入卡的检测,实际上现在很多SD卡/MicroSD卡插座都有插入检测管脚,当然,一分钱一分货,价格上当然也要贵一些顺便提一下,普通 SD卡插座最多5块钱。插入SD卡。SPI命令格式Byte 1Byte2-5Byte 631CommandCommand ArgumentCRC 1以下是一个简单的测试SD卡读 写的程序,程序是基于 Atmega128单

11、片机编写的,对于Atmega的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。sd.h*SPI各线所占用的端口#define SD SSPB6#define SD SCKPB1#define SD MOSIPB2#define SD MISOPB3*#define SD DDRDDRB#define SD PORTP ORTB#define SD PINPINB#define SDSS LSD_P ORT &= (1v#define SD SCK HSD_P ORT |= (1<#define SD SCK LSD_P ORT &= (1v#defineSD

12、MOSI HSD_P ORT|=(1v#defineSD MOSI LSD_P ORT &= (1v#defineSD MISO IN(SD_PIN&(1</错误号/#define INIT CMD0 ERROROxFF#define INIT CMD1 ERROR0xFE0xFD#define WRITE BLOCK ERROR#define READ BLOCK ERROR0xFC0x01#define TRUE / MMC/SD 命令(命令号从40开始,只列岀基本命令,并没有都使用/#define SD RESET0x40 + 0#define SD INIT0x4

13、0 + 1#define SD READ CSD0x40 + 9#define SD READ CID0x40 + 10#define SD STOP TRANSMISSION0x40 + 12#define SD SEND STATUS0x40 + 13#define SD SET BLOCKLEN0x40 + 16#define SD READ BLOCK0x40 + 17#define SD READ MULTI BLOCK0x40 + 18#define SD WRITE BLOCK0x40 + 240x40 + 25#define SD WRITE MULTI BLOCK/ 片选关(

14、MMC/SD-Card In valid)#defi ne SD_Disable()SD SS H/ 片选开(MMC/SD-Card Active)#defi ne SD_E nableOSD SS LSD TEST.C /*/ /ICC-AVR app lication builder : 03-5-20 8:39:11 / Target : M128 / Crystal: 3.6864Mhz#in clude #in clude #i nclude 'sd.h' void uart0 _in it(void);void p utchar(u nsig ned char co

15、nten t);void p utstr(u nsig ned char *s);void SD_Port_ln it(void);un sig ned char SD_ln it(void);un sig ned char SD_write_sector(u nsig ned long addr,u nsig ned char *Buffer);un sig ned char SD_read_sector(u nsig ned long addr,u nsig ned char *Buffer);un sig ned char SP I_Tra nsferByte(u nsig ned ch

16、ar byte);un sig ned char Write_Comma nd_SD(u nsig ned char cmd,u nsig ned long address);un sig ned long SD_fi nd(void);/*/串口调试程序 /* void uart0_ in it(void)UCSR0B = 0x00; /disable while setti ng baud rateUCSR0A = 0x00;UCSR0C = 0x06; / 00000110 UART0设置为异步模式、无奇偶校验、1位停止位、8位数据位UBRR0L = 0x17; /set baud ra

17、te loUBRR0H = 0x00; /set baud rate hi设置UART0 口通信速率 9600UCSR0B = 0x18;void p utchar(u nsig ned char content)while(!(UCSR0A & (1 << UDRE0); /*判断上次发送有没有完成*/UDR0 = con te nt;/*发送数据*/void p utstr(u nsig ned char *s) while(*s) p utchar(*s);s+;/*/端口初始化 void SD_Port_ln it(void) /*SP I_Tra nsferByt

18、e(0xff); /延迟74个以上的时钟SD PORT|= (1<<SD DDR|= (1<<<SD DDR&= (1</* /初始化 MMC/SD 卡为SPI模式un sig ned char SD_ln it(void) /* un sig ned char retry,te mp;un sig ned char i;SP CR=0x53;/设定SPI为128分频,慢速进行初始化SP SR=0x00;for (i=0;i<0x0f;i+)SD_E nableO;/开片选SP l_Tra nsferByte(SD_RESET);/发送复位命令

19、SP I_Tra nsferByte(OxOO);SP I_Tra nsferByte(0x00);SP I_Tra nsferByte(0x00);SP I_Tra nsferByte(0x00);SP I_Tra nsferByte(0x95);SP I_Tra nsferByte(0xff);SP I_Tra nsferByte(0xff);retry=0;dotemp="Write"_Comma nd_SD(SD_INIT,0);/发送初始化命令retry+;if(retry=100)重试100次SD_Disable();/关片选return(INIT_CMD1_E

20、RROR);如果重试100次失败返回错误号while(te mp !=0);MSD_Disable();/关片选SP CR=0x50;/设置SPI为2分频。进行高速读写返回成功SP SR=0x01;return(TRUE);/* /发送命令给 MMC/SD 卡/Return:返回MMC/SD卡对命令响应的第 2字节,作为命令成功判断 un sig ned char Write_Comma nd_SD(u nsig ned char cmd,u nsig ned long address) /* un sig ned char tmp;un sig ned char retry="0&

21、quot;SD_Disable();SP I_Tra nsferByte(OxFF);SD_E nableO;SP I_Tra nsferByte(cmd);将32位地址进行移位作为地址字SP I_Tra nsferByte(address>>24);SP I_Tra nsferByte(address>>16);SP I_Tra nsferByte(address>>8);SP I_Tra nsferByte(address);SP I_Tra nsferByte(0xFF);SP I_Tra nsferByte(0xFF);dotmp = SP I_Tr

22、a nsferByte(0xFF);/发送8个时钟接受最后一个字retry+;while(tm p=0xff)&&( retry<8);return(t mp);/* / 写一个扇区(512Byte) to MMC/SD-Card如果写完成返回 TRUE un sig ned char SD_write_sector(u nsig ned long addr,u nsig ned char *Buffer) /*un sig ned char temp;un sig ned int i;SP l_Tra nsferByte(OxFF);/延迟8个时钟SD_E nableO

23、;/开片选temp = Write_Comma nd_MMC(MMC_WRITE_BLOCK,addrvv9);/发送写扇区命令if(te mp != 0x00)SD_Disable();return(tem p);SP I_Tra nsferByte(0xFF);SP I_Tra nsferByte(0xFF);SP I_Tra nsferByte(0xFE);for (i=0;i<512;i+)SPI_TransferByte(*Buffe叶+); /发送 512 字节数据/CRC-ByteSP I_Tra nsferByte(0xFF); /Dummy CRCSP I_Tra ns

24、ferByte(0xFF); /CRC Codetemp = SP I_Tra nsferByte(0xFF);/读SD卡运行响应if(te mp & 0x1F)!=0x05)如果最后4位为0101,为操作成功。否则为操作失败。SD_Disable();return(WRITE_BLOCK_ERROR); / 返回错误while (SP I_Tra nsferByte(0xFF) != 0xFF);SD_DisableO;return(TRUE);返回成功/*/ 读 512 字节 from MMC/SD-Card如果成功返回TRUEun sig ned char SD_read_sec

25、tor(u nsig ned long addr,u nsig ned char *Buffer)/*un sig ned char temp;un sig ned int i;un sig ned char data;SP I_Tra nsferByte(Oxff);MMC_E nableO;temp = Write_Comma nd_SD(SD_READ_BLOCK,addrvv9);/发送读扇区命令if(te mp != 0x00)SD_Disable();return(READ_BLOCK_ERROR);/返回错误号while(S PI_Tra nsferByte(0xff) != 0

26、xfe);for(i=0;i<512;i+)data = SP I_Tra nsferByte(0xff);/存数据*Buffer+=data;SP l_Tra nsferByte(Oxff);/读CRC码SP I_Tra nsferByte(Oxff);/读CRC码SD_Disable();return(TRUE);/返回成功/*/查找数据开始标志(预设 DATASTART )根据实际需要删改/*un sig ned long SD_fi nd(void)un sig ned long tmp="400"un sig ned char data512;doSD_re

27、ad_sector(t mp ,data);从0扇区开始查找tmp+;/查找 DATASTARTwhile(!(data0=D)&&( data1='A')&&( data2='T')&&(data3='A')&&(data4=S)&&(data5='T')&&(data 6='A')&&(data7='R')&&(data8='T');return tmp

28、;/返回开始标志的下一个扇区/*/发送一个字节 /* un sig ned char SP I_Tra nsferByte(u nsig ned char byte)/检测线路是否空闲SPDR = byte;while (!(S PSR & 0x80);return SP DR;/*/主程序例子 /* void main (void) un sig ned long temp;un sig ned char data512;un sig ned char data2512='sssssssssssssssssssssssss'un sig ned char comm1=

29、'rnhello worldrn'un sig ned char comm2='rnSD_INIT OKrn'uart0_i ni t();SD_Port_Ini t();/端口初始化if(SD_ In itO= 0x01)/SD卡初始化,并读取返回值p utstr(comm2);temp="SD"_fi nd();/查找DATASTART 数据开始标志,返回下一扇区地址SD_read_sector(1001,data);/读取temp地址的512字节数据,512字节数据存入data数组P utstr(data);SD_write_sector(te mp ,data2);/将data2数组512字节数据写入temp扇区测试程序很简单,仅仅是做了一下读写SD卡的测试。关于SD卡的几点注意事项。1、无论我们愿意不愿意,SD卡每次读写数据的最小单位是1个扇区,即512个字节。2、SD卡与单片机连接的 SPI总线不能太长,要尽量短。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论