SD卡读写操作详细说明

上传人:d**** 文档编号:100607068 上传时间:2022-06-03 格式:DOCX 页数:15 大小:230.68KB
返回 下载 相关 举报
SD卡读写操作详细说明_第1页
第1页 / 共15页
SD卡读写操作详细说明_第2页
第2页 / 共15页
SD卡读写操作详细说明_第3页
第3页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
51单片机实现对SD卡的读写51单片机实现对SD卡的读写文章编号:091203224635文章分类:单片机51系列点击:关键词:SD文章来源:网络摘要:对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序.SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方51单片机成功实的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。(1)SD卡的引脚定义:11111111I23456789SDMemoryCardSD卡引脚功能详述:引脚SD模式SPI模式编号K|类型描述名称类型描述1CD/DAT3IO或PP卡检测/数据线3#CSI1片选2CMDPP命令/回应DII数据输入3VSS1S电源地VSSS电源地4VDDS电源VDDS电源5CLK时钟SCLKI时钟6VSS2S电源地VSS2S电源地7DAT0IO或PP数据线0DOO或PP数据输出8DAT1IO或PP数据线1RSV9DAT2IO或PP数据线2RSV注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出SD卡SPI模式下与单片机的连接图:50k-QCMC.Ov&aiYDQ丫做WITOW站g单片机SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、Dataln、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。(2)SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采SD卡的性能优势,要解决这SPI接口的选用是在上电初用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了一问题,就要用SD方式,因为它提供更大的总线数据带宽。始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。1)命令与数据传输命令传输SD开贻位蝠终为q命令的传输过程采用发送应答机制,过程如下:沮顶TDatjin-coininatkdD.itiOntresponse此位为1说明是主机始对卡的命令每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:T也呼验码结束位始籍为1SOCibotttocard01CONTENTCRC1总长度为姑个位即6个字节命令内容字节位邛手义-17三始位,始终为061窍数错误5出也址错误4韦鬃除序列错误3C;RC错误2不E法命令1擦除复位01?目置状态字节位含义k17开始位,始终为06参数错误5地址错误4擦除序列错误3CRC错误2非法命令1擦除复位0闲置状态L27溢出,CSD覆盖6擦除参数5写保护非法4卡ECC失败3卡控制器错误2片口错误1保护擦除跳过,锁/解锁失败0k卡字节位含义开始位,始终为0i6参数错误5地址错误4擦除序列错误3CRC错误2非法命令1擦除复位0用置状态25全部操作条件寄存器,高位在前写命令的例程:1./2.向SD卡中写入命令,并返回回应的第二个字节3./4.unsignedcharWrite_Command_SD(unsignedchar*CMD)5.(6.unsignedchartmp;7.unsignedcharretry=0;8.unsignedchari;9.10./禁止SD卡片选11.SPI_CS=1;12./发送8个时钟信号13.Write_Byte_SD(0xFF);14./使能SD卡片选15.SPI_CS=0;16.17./向SD卡发送6字节命令18.for(i=0;i0x06;i+)19.(20.Write_Byte_SD(*CMD+);21.22.23. /获得16位的回应24. Read_Byte_SD();/readthefirstbyte,ignoreit.25. do26. /读取后8位27. tmp=Read_Byte_SD();28. retry+;29. 30. while(tmp=0xff)&(retry100);31. return(tmp);2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的。在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:(CATAKJT4i4ML?6(DATA)OUT四X风XlXiXI*NcriC5(CMD)INDOh3x4#OWl8ifrsgZ8初始化例程:1. /2. 初始化SD卡至ijSPI模式/-3. unsignedcharSD_Init()6.unsignedcharretry,temp;7.unsignedchari;8.unsignedcharCMD=0x40,0x00,0x00,0x00,0x00,0x95;9. SD_Port_Init();/初始化驱动端口10.10. Init_Flag=1;/将初始化标志置112.11. for(i=0;isector_count=sectorBuffer.dat6&0x03;18. vinf-sector_countsector_count+=sectorBuffer.dat7;20. vinf-sector_countsector_count+=(sectorBuffer.dat8&0xc0)6;22. /获取multiplier23. vinf-sector_multiply=sectorBuffer.dat9&0x03;24. vinf-sector_multiplysector_multiply+=(sectorBuffer.dat10&0x80)7;26. /获取SD卡的容量vinf-size_MB=vinf-sector_count(9-vinf-sector_multiply);28.29.30.31.32.33.35:36.38.39.40.41.43.44./getthenameofthecardRead_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;/endflag)以上程序将信息装载到一个结构体中,这个结构体的定义如下:typedefstructSD_VOLUME_INFO(/SD/SDCardinfounsignedintsize_MB;unsignedcharsector_multiply;unsignedintsector_count;unsignedcharname6;)VOLUME_INFO_TYPE;)扇区读SD卡驱动的目的之一。SD卡的每一个扇区中有512个字节,一次扇区读操512个字节全部读出。过程很简单,先写入命令,在得到相应的回*,-3*SU.7elk,(IM0|INDATA)OVTIBifH-i*#BywtbyCMD16(Mftull612)uooh开始数据读取。扇区读的程序例程:1.unsignedcharSD_Read_Sector(unsignedlongsector,unsignedchar*buffer)2.(3.unsignedcharretry;4./命令165.unsignedcharCMD=0x51,0x00,0x00,0x00,0x00,0xFF;6.unsignedchartemp;7.8./地址变换由逻辑块地址转为字节地址9.sector=sector24);12. CMD2=(sector&0X00FF0000)16);13. CMD3=(sector&0X0000FF00)8);14.14. /将命令16写入SD卡15. retry=0;16. do17. /为了保证写入命令一共写100次18. temp=Write_Command_MMC(CMD);19. retry+;20. if(retry=100)21. 22. return(READ_BLOCK_ERROR);/blockwriteError!23. 24. 25. while(temp!=0);27.26. /ReadStartByteformMMC/SD-Card(FEh/StartByte)27. /Nowdataisready,youcanreaditout.28. while(Read_Byte_MMC()!=0xfe);29. readPos=0;30. SD_get_data(512,buffer);/512字节被读出到buffer中31. return0;32. 33. 其中SD_get_data函数如下:/34. 获取数据到buffer中/35. voidSD_get_data(unsignedintBytes,unsignedchar*buffer)36. 37. unsignedintj;38. for(j=0;jBytes;j+)39. *buffer+=Read_Byte_SD();40. 45.6)扇区写扇区写是SD卡驱动的另一目的。每次扇区写操作将向SD卡的某个扇区中写入512个字节。过程与扇区读相似,只是数据的方向相反与写入命令不同而已。扇区写的时序:(CMD)IN-(DATAtOUT-FEh6yM(3DdftTEhiw-vD3ID1L扇区写的程序例程:1./1. 写512个字节到SD卡的某一个扇区中去返回0说明写入成功2. /3. unsignedcharSD_write_sector(unsignedlongaddr,unsignedchar*Buffer)4. 5. unsignedchartmp,retry;6. unsignedinti;7. /命令248. unsignedcharCMD=0x58,0x00,0x00,0x00,0x00,0xFF;9. addr=addr24);11. CMD2=(addr&0x00FF0000)16);12. CMD3=(addr&0x0000FF00)8);15.13. /写命令24到SD卡中去14. retry=0;15. do16. /为了可靠写入,写100次17. tmp=Write_Command_SD(CMD);18. retry+;19. if(retry=100)24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.return(tmp);/sendcommamdError!)while(tmp!=0);/在写之前先产生100个时钟信号for(i=0;i100;i+)Read_Byte_SD();)/写入开始字节Write_Byte_MMC(0xFE);/现在可以写入512个字节for(i=0;i512;i+)Write_Byte_MMC(*Buffer+);)/CRC-ByteWrite_Byte_MMC(0xFF);Write_Byte_MMC(0xFF);/DummyCRC/CRCCodetmp=Read_Byte_MMC();/readresponseif(tmp&0x1F)!=0x05)/写入的512个字节是未被接受SPI_CS=1;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模式应该不是什么难事。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!