jicheng0622

【原创】SD卡驱动和FAT文件系统自学笔记

0
阅读(9910)

    最近在微博上看“热闹”看的太酣了,结果都忘记更新下博客了,哈哈。互联网真是从来都不缺平淡,这句话真的很对,先是“815”电商大战,上演新世纪的“东京战美苏”(京东商城对抗国美苏宁),不过目前看来跟1945年的结果不同,这次貌似强哥带领的“东京”稍战上峰,而且硝烟貌似还没结束,呵呵;然后又是“816”小米手机2代的发布会,雷布斯(雷军,发布会上穿的还真有当年乔帮主的范儿来)在会上发布了真正的发烧级android手机(哎,android手机现在纯是在拼硬件配置,这点跟IPhone比不了),光看配置就是眼前一亮,再看价格差点把我眼神亮瞎了,哎,继续走国产机的模式,靠价格打天下,不过后来看了篇关于小米手机“期货价格”的分析,再结合前段时间我转载的一篇关于雷军在GMIC 2012大会上总结的那“七字诀”,细想想里面的营销模式真的很有技巧(有兴趣的可以看看那篇关于期货价格分析,感觉很有道理);最后仍在同一天,从来就不甘寂寞的周老板这次却出人意料低调的推出了奇虎搜索(这个的确很低调,估计很多人都不知道,不知道这次周老板在打什么算盘来,呵呵)。。。哎,热闹看完了,感觉跟自己没啥关系,才想起来跟自己有关的事来,该更新更新博客了嗨,嘿嘿,所以还是继续老实都走技术路线吧~

    咳咳,强调一下哈,本篇仍是技术博客,上述内容虽然有点多不过纯是给大家娱乐一下了(要是还想听且待下回分解,哈哈),该回归老本行还得回来。晚上在以前的文件夹下无意之中看到了自己3年前(还像是大三的时候的,太久远了,呵呵)写SD卡驱动和文件系统时做的自学笔记,打开了看了看,有些东西都快忘了,再不管它就快尘封在硬盘里了,索性贴出来分享给大家,“独乐了不如众乐乐”嘛,希望对一些博友有所帮助,不过也别抱太大的期望,只写了一些当时觉着最重点的东西,不过有聊胜于无嘛,再说现在关于SD卡的技术已经开源了很多了,所以如数家珍的抱着不放也没意思,呵呵。下面分SD卡部分和FAT文件系统两部分说说吧:

1.SD卡部分:

(1)Sd卡内部管脚图:

(2)SPI模式下sd卡管脚配置:

(3)SD卡需要注意的地方:

sd卡的电压是3.3v,所以必须要使CPU支持3.3vIO口输出。

SD卡spi初始化:(CMD0,CMD55,ACMD41)从卡正确回应内容

CMD0——0x01(sd卡处于in_idle_state)

CMD55——0x01(sd卡处于in_idle_state)

ACMD41——0x00(sd卡跳出in_idle_state,完成初始化准备接受下一条指令)

 如果最后回应的内容还是0x01的话,可以循环发送CMD55+ACMD41,直到回应的内容0x00。在所有指令中唯独CMD0特殊,在向SD卡发送以前需要向sd卡发送74+个时钟,之所以要有74个CLK是因为在上电之初,电压的上升过程据sd卡组织的计算约合64个CLK周期才能到达SD卡的正常工作电压即supply ramp up time,其后的10个CLk是为了与SD卡同步,之后开始CMD0的操作,严格按照此项操作一定没有问题。

关于sd卡的spi总线,在读入数据时sd卡的spi事clk的上升沿输入锁存,输出数据也是在上升沿。向sd卡写入一个CMD或者ACMD指令的过程:首先使cs为低电平,sd卡使能;其次在sd卡的Din写入指令;写入指令后还要附加8个填充时钟,使sd卡完成内部操作;之后在sd卡的Dout上接受回应;回应接受完毕使CS为低电平,在附加8个填充时钟。

 在sd卡的DIN没有数据写入时应使Din保持高电平。

无论是读还是写,都要求在读写之后有数据起始令牌0xfe。

2.FAT文件系统部分:

(1)起始扇区(即物理0扇区)中MBR(main boot recorder)占用446字节用于系统启动程序和启动参数,DBT(disk boot table),记录四个磁盘分区基本信息(sd卡只有一个分区),每个分区16个字节描述,具体分配:

0字节                         分区状态:0=非活动分区80=活动分区

1字节                         分区起始头

2,3字节                      该分区起始扇区和起始柱面

4字节                         系统ID

5字节                         分区终止头

6,7字节                      分区终止扇区和终止柱面

8,9,10,11字节               该分区起始绝对扇区

12,13,14,15字节            该分区占用的扇区数

(2)

(3)任何扇区地址=(记录簇号-2)*每簇多少扇区+根目录的扇区地址

文件目录32字节含义:

(1)   0--   7字节                          文件正名。   

(2)   8--10字节                            文件扩展名。

(3)   11字节                               文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。

(4) 12字节                                 系统保留

(5)13字节                                  文件创建时间10毫秒位

(6) 14—15字节                             文件创建时间(小时*2048+分钟*32+秒/2)

(7)16——17字节                            文件创建日期((年份-1980)*512+月份*32+日)

(8)18——19字节                            文件最后访问的日期

(9)20——21字节                            起始簇的高16位

(10)22——23字节                           文件最后的写时间

(11)24——25字节                           文件最后的写日期

(12)26——27字节                           文件起始簇低16位

(13)28——31字节                           文件的大小

    呵呵,笔记内容有点少,可能看着有点拘谨,却是我当时在写驱动时用到最多的一些基本知识,相信做过或者正在做相关驱动开发的应该可以看明白,至于没做过的权当是看个热闹而且扩展下知识面,何乐而不为,哈哈,另外在开发这个的时候积攒了一下pdf资料相信会让大家开发起来事半功倍吧,喜欢的可以瞅一瞅...未完待续~

    附件为SD卡和FAT文件系统的一些资料压缩包,只挑了些重点的。