SD卡和FAT文件系统示例

1.   初始化SD卡:

我现在用的多是SPI模式,所以在这里只讨论SPI模式。在SPI模式中,所有的指令都要求先将CS脚置0。所以这点,我在后面就不再强调了。

CMD0,使SD卡从SD模式转到SPI模式。判断返回值R0,如果不是CARD IS NOT READY,说明硬件上有问题。

CMD8,参数是0x000001AA,判断SD卡符合哪个标准。如果返回ILLEGALCOMMAND,说明是ver1.x的卡,否则就是ver2.0的卡。

CMD1,如果是ver2.0的卡,参数是1<<30,否则就是0,读取SD卡的状态,反复,直到CARDISREADY或者超时。这里有一 个问题,Spec上建议使用ACMD1,说是通用性比CMD1好,而且CMD1并不是一开始就可以使用的。但是我在实际使用中,发现一些老卡对这个指令会 返回PARAMETERERROR。搞不懂是为什么,而且实际使用中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]) 

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))

这个数字就是这张SD卡里面总共有多少个扇区。

 

4. 读取PartitionTable

读取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]的SectorsPerCluster,就是每个簇的扇区数,也就是你在读取文件是需要一次读取的扇区数。例如8。

buf[14-15]的ReservedSectors,保留扇区数,这个保留扇区是在分区第一个扇区到FAT表之间的扇区数。例如38。

buf[28-31]的HiddenSectors,隐藏扇区数,这个隐藏扇区指的是在这个分区前面有多少个扇区,这个值在分区表里也有的。就是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表后面的,所以第一个扇区是在101+7793*2=15687。

对于FAT32系统,这段忽略。

 

8. 读取数据区

FAT16中,数据区是在根目录后面的,所以第一个扇区是15687+32=15719。就是在SD卡上的第15719个扇区。

而FAT32中,由于没有根目录,所以数据区直接跟在FAT表后面的,所以就是第15687个扇区。这个扇区就是LBA=2的地方。所以之后如果上层的文件操作函数,要对LBA=1000写数据,那就是对1000+15687=16687扇区进行写操作。

 

到此,我们就得到了整个FAT系统的结构和数据,接下来就可以开始操作文件了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值