SD卡和FAT文件系统示例.doc

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SD卡和FAT文件系统示例

SD卡和FAT文件系统示例 (2009-08-29 15:55:18) 转载 标签: fat32 电脑 嵌入式 it 分类: SD卡和FAT文件系统示例 这几天,公司里事情不多,看大家好像对SD卡上的FAT系统有点问题,所以就决定写一个例子给大家参考参考。 1. 初始化SD卡。 我现在用的多是SPI模式,所以在这里只讨论SPI模式。在SPI模式中,所有的指令都要求先将CS脚置0。所以这点,我在后面就不再强调了。 CMD0,使SD卡从SD模式转到SPI模式。判断返回值R0,如果不是CARD IS NOT READY,说明硬件上有问题。 CMD8,参数是0x000001AA,判断SD卡符合哪个标准。如果返回ILLEGAL COMMAND,说明是ver1.x的卡,否则就是ver2.0的卡。 CMD1,如果是ver2.0的卡,参数是130,否则就是0,读取SD卡的状态,反复,直到CARD IS READY或者超时。这里有一个问题,Spec上建议使用ACMD1,说是通用性比CMD1好,而且CMD1并不是一开始就可以使用的。但是我在实际使用中,发现一些老卡对这个指令会返回PARAMETER ERROR。搞不懂是为什么,而且实际使用中CMD1也很好用,并没有出现SD卡不能初始化的问题,所以我现在都直接用CMD1。 到这里基本上SD卡就初始化完毕了。接下来就可以读取数据了。 2. 读取CID(CMD10),SD卡鉴别信息,这一步不是必须的。 鉴别信息中包括了生产商ID,应用ID,产品名称,产品版本,产品序列号,生产日期。 3. 读取CSD(CMD9),SD卡信息。 返回的CSD有两个版本。 if (CSD[0] 0x40 == 0x40)? ???// ver2.0的卡 容量 = 1024L*(CSD[8]8+CSD[9]) 这个数字就是这张SD卡里面总共有多少个扇区。 if (CSD[0] 0x40 != 0x40)? ? // ver1.x的卡 容量 = (((CSD[6]0x03)10) | (CSD[7]2) | ((CSD[8]0xC0)6) + 1) * (1 ((((CSD[9]0x03)1) | ((CSD[10]0x80)7)) + 2)) 4. 读取Partition Table。 读取SD卡的扇区0到buf。 如果buf[0]不是0xEB或者0xE9,说明这是一个分区表。 buf[454]开始的四个byte是该分区前的扇区数。例如63表示在这个分区前有63个扇区,那么这个分区的第一个扇区就是扇区63。 buf[458]开始的四个byte是该分区的扇区数。例如7990000,不是这个分区有7990000个扇区。那么这个分区的块地址就是63~7990063。 一个设备可以最多有四个分区,其他三个分区的相关数据是在buf[470]/buf[474],buf[486]/buf[490],buf[502]/buf[506]。 注意,读取buf的时候检查最好两位,应该是55AA。 5. 读取BPB。 好,到这里我们已经知道第一个分区是在什么位置了。现在需要做的就是读取这个分区的0扇区。也就是SD卡的第36个扇区。 这个512个byte就是这个分区的详细资料了。 检查buf[0],应该是0xEB或者0xE9。如果是的话,那就是BPB表了。接下来比较重要的几个数字是: buf[13]的Sectors Per Cluster,就是每个簇的扇区数,也就是你在读取文件是需要一次读取的扇区数。例如8。 buf[14-15]的Reserved Sectors,保留扇区数,这个保留扇区是在分区第一个扇区到FAT表之间的扇区数。例如38。 buf[28-31]的Hidden Sectors,隐藏扇区数,这个隐藏扇区指的是在这个分区前面有多少个扇区,这个值在分区表里也有的。就是63。 buf[19-20]和buf[32-35],前者是FAT16格式中的扇区数,后者是FAT32格式中的扇区数。这个值在分区表里也是有的。就是7990000。 buf[16],FAT表数,一般是2。 buf[22-23],buf[36-39],FAT表占用的扇区数,前者是FAT16的,后者是FAT32的。例如7793。 好了,到这里我们就可以读取FAT文件系统中的数据了。 6. 读取FAT表。 在上面的例子中,FAT表的位置应该是分区的第一个扇区再偏移隐藏扇区数,就是63+38,等于101。所以从SD卡的101扇区开始,就是分区一的FAT表,一共有7793个扇区。 7. 读取根目录。 在FAT16中,根目录是单独的。应该是可以建立512个文件,每个文件占用32byte,所以总共是512*32/512=32个扇区。 根目录是跟在FAT

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档