SD卡读写开发文档.doc_第1页
SD卡读写开发文档.doc_第2页
SD卡读写开发文档.doc_第3页
SD卡读写开发文档.doc_第4页
SD卡读写开发文档.doc_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

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

文档简介

SD卡读写关键是对SD的初始化、块扇区的读写、以及SD卡文件结构的掌握,初始化SD首先发送 0x40 0x 00 0x00 0x00 0x00 0x59 应答 0x01 进入空闲模式 在发送 0x41 0x 00 0x00 0x00 0x00 0x59 应答 0x00 激活SD卡使用WinHex分析SD卡可以得到第一数据区即根目录区,在第520区,每扇区512字节,等等,分析后得结果用于,读数据的验证。本SD卡为1G的金士顿卡,扇区宽度为512字节,根据WinHex和读SD卡的结论得出解读,可以得出表一:读本SD卡的第0块物理扇区512字节, 即常说的引导扇区。MBR(主引导的区)的长度为446字节(0x000x1BD),以后每16个字节代表一个分区,共四个,该卡仅一个分区所以后面三个都是空的,这16个就是分区表: 地址长度内容详解1BE100激活则为 00 ,否则801BF101分区起始的磁头号1C0201 00起始扇区和柱面号,低6位时扇区号,?1C2106分区类型,0B代表FAT32, 06代表FAT161C3129分区结束的磁头号1C427F E0分区结束的扇区和柱面号1C6400 00 00 20地址20由该地址读到内容就是逻辑地址的0扇区1CA4003C 7B E0分区的总扇区数。493979由上述分析得出本SD卡的逻辑地址的0扇区应该在隐藏扇区中,块的扇区地址为0x00000020,读扇区得到的内容:如下图所示: 具体分析如下图所示 :名称偏移长度内容详细BS_jmpBoot03BUFF0.2一般为EB XX 90 或 E9 xx xxOEMName38BUFF3.A仅一个名字。无所谓每扇区字节数0B2BUFFB.C即0x0200 =512 即每个扇区有512个字节每簇的扇区数0D1BUFFD即每个簇有(64个)0x40扇区,也就是每个簇有64*512=32k保留扇区数0E204 00从第一扇区开始被保留的扇区数为04FAT表份数10102一般都是两个FAT表。两者宽度一样根目录项数11200 02一般FAT16为512即0x0200总扇区数TotSec1613200 00当容量大于1M时,总扇区数就放在TotSec32处,此处放置0介质种类151F8表示固定存储介质,F0表示移动存储介质FATSz16162F2 000X00F2表示一个分区占242个扇区共两分区SecPerTrk1823F 00表示每磁道的扇区数。这里不是硬盘,无意义磁头数1A2无意义HiddSec1C40x00000020FAT表前隐藏的扇区数32TotSec322040x003C7BE0该卡的总扇区数,也即该卡的最大容量为0x003C7BE0*512=1981936MDrvNum24100一般硬盘为80 软盘为00保留25100共NT使用,此处必须为0BootSig26129扩展引导标记,表示后面的域可用VolID274内容随便,仅一IDVolLab2B11卷标11个字节,此处NO MAMEFilesysType368即文件类型,此处为FAT16可执行代码3E448.引导分区字节.1分区头1BE-无1BF-1C0-1C2-1C3-1C4-1C6-1CA-2分区1CE-结构同上签名1FE255 AA结束标志分析得出主目录所在扇区地址:主引导区数(1个) + 保留扇区数(0x04个) + 隐藏数(0x20个)+2个 FAT表宽度(0Xf2*2)=521,即从第521个扇区(扇区地址为520)开始的32个扇区中存放根目录。读本SD卡的根目录的第一个扇区得出如图数据:本卡卷标名为UJNX,可见第一个32字节的文件为该根目录,但是他以文件夹的形式呈现,并且大小Size为0,在大多数正常情况下我们可以认为无后缀名的,大小为零的文件为文件夹(我知道这个并不科学,谁有好的建议?)。可以看出32个扇区的根目录最多可以存储512个目录文件。文件就简单了,直接根据FAT表簇的地址读数据就是了。 读FAT表:在FAT表中每两个字节的数据对应唯一的一个簇地址,每个簇有64个扇区,例如在第一个(地址为0x24)FAT表的第一个扇区中的数据如下: 读文件1、根据32字节的目录获取文件名、类型、大小、起始簇的地址2、根据簇的地址高位和低位计算出簇的位置,并与对应的计算出该簇的起始扇区地址簇的起始扇区地址=根目录起始扇区+目录扇区宽度+(簇地址-2)*每个簇的扇区宽度。3、读下一个簇的地址,根据上个簇对应的FAT表中的两个字节,计算出下个簇所在的簇地址,然后执行1步骤再读出64扇区个连续的数据,直到簇的地址为0xFFFF为止表示文件结束。读文件夹1、 根据目录获取文件名,并跟踪簇地址,到所在第一个扇区,读该扇区下图视 可见该扇区的内容是一张目录表,2E标示目录的级别,其簇地址应该代表上级目录地址,根据每32字节为一文件标示,E5标示已删除的文件,同样读出文件的簇地址,计算所在64个扇区地址,并读出数据,再读取对应的FAT表中的下个簇的地址,如此反复直到FAT表中数据为0xFF。读文件时,有时候SD卡不能初始化,但反复格式化FAT32,和FAT后会很好用,原因不明。写文件:1、首先根据新建的文件,获得其所在目录的索引ID,并的到其size1大小(字节),起始簇Start_clus,起始扇区Start_sctor,2、处理FAT中簇的文件链表根据新建文件的大小size2(字节),计算总文件大小File_Size= size1+ size2;源文件占用的簇数:clus_cnt= size1/(512*64)+1写入后的占用总簇数:File_Clus=File_Size/(512*64) 那么最后一个簇的ID为:last_clus=Start_clus+ clus_cnt-1For(i= 0;i File_Clus - clus_cnt;i+) Writeclusid(last_clus,getnextclus();last_clus= getnextclus();Writeclusid(last_clus,0xffff);3、 写扇区内容源文件所占的扇区数:sctor_cnt= size1/512+1;文件所占的总的扇区数:File_sctor=File_Size/512最后一个扇区地址:Last_sctor=Start_sctor+ sctor_cnt-1读出最后一个扇区数据到BUFFER中ReadBlock(Last_sctor);写最后一个扇区For(i= size1%512;i8、 (File_Size&0Xff0000)16、File_Size 24.假设得到文件在接结束时的,簇结束地址writesdclus_addr,以及文件在簇内的扇区偏移writesdsctor_lab,以及文件内容在扇区内的字节偏移writesdbety_lab,假设目录项ID,所在扇区地址writesddir_sctor_lab,以及字节数据在该扇区内的偏移地址writesdA4、writesdA3、writesdA2、writesdA1。再写文件步骤:1、计算该文件的所占的总簇数。修改FAT簇的练表。 f

温馨提示

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

评论

0/150

提交评论