SD卡存储结构

SD卡FAT32文件系统
/*****************************************************************************************************************************************************************************
一 通用概念(适用于硬盘、U盘、SD卡)
1. 物理驱动器:有几个物理硬盘,就有几个物理驱动器(如1个320G硬盘,意味着只有1个物理驱动器)
  逻辑驱动器:一个硬盘被人为格式化为n个分区,则意味着有n个逻辑驱动器
  小结:
  一个硬盘只会有1个物理0号扇区,却可能有n个逻辑0号扇区,每个扇区固定512字节
2. MBR(主引导记录区): 就是指0号物理扇区,结构如下
--446字节--/ 真正的MBR,其内容不需要关注
--64字节 --/ DPT(硬盘分区表)
--2字节  --/ 分区有效结束标志 (55,AA),不是则可能是读错了或者硬盘没有被格式化
3. DPT: 每16字节描述一个主分区,所以一个硬盘最多可以有4个主分区(扩展情况这里不考虑);SD、U盘卡没有分区,所以默认就一个分区
每个主分区结构如下(以第1个主分区为例)
起始地址 字节数 描述
-- 0x1BE 1 分区引导标志,指明该分区是否是引导分区(功能参考系统分区C区,所以4个分区里有且只会有1个引导分区),0x00不可引导,0x80可引导
-- 0x1BF~0x1C1 3 起始磁头、扇区、柱面地址,基本只对硬盘有用,SD卡不关注
-- 0x1C2 1 分区类型,主要用到2个,0x07 - NTFS,0x0C - FAT32(U盘),0x0B - FAT32(SD卡)
-- 0x1C3~0x1C5 3 结束磁头、扇区、柱面地址,SD卡不关注
-- 0x1C6 4 本分区相对物理0号扇区的偏移量,以扇区为单位,硬盘第1个主分区固定偏移0x3F个扇区,U盘主分区固定偏移0x3F个扇区,SD卡主分区固定偏移0x2000个扇区,这部分扇区作为系统隐藏扇区,属于文件系统之外
-- 0x1CA 4 本分区所占的扇区总数

二 SD卡存储结构(也适用于U盘)
使用FAT32文件系统的整个SD卡结果如下
保留区 --/ MBR(512字节) 因为SD卡不用启动,所以MBR区域不包含引导数据,全空
--/ SD卡整个保留区总共0x2000个扇区
SD分区 --/ 保留区 --/ DBR(512字节) 逻辑扇区0号
--/ FSINFO信息扇区(512字节) 逻辑扇区1号
--/ 通常情况下6号逻辑扇区是DBR的备份,7号逻辑扇区是FSINFO的备份,8号逻辑扇区是2号逻辑扇区的备份
--/ FAT1(文件分配表)
--/ FAT2
--/ 数据区 --/ 根目录
--/
小结:
SD卡总容量计算方法,总容量 = (0x1CA上存储的SD分区总扇区数+0x1C6上存储的SD分区起始偏移扇区)×512

三 FAT32文件系统(4GB SD卡为例)
1. 簇:FAT文件系统用“簇”作为数据单元,一个簇由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂,簇的最大值为64个扇区,即32KB;


2. DBR(分区的引导记录):位于整个SD分区的0号扇区(对应的物理扇区就是0x2000)固定512字节,其中记录着FAT文件系统的相关信息;
  FAT文件系统同时使用“扇区地址”和“簇地址”两种地址管理方式,因为只有存储用户数据的数据区使用簇管理,其他文件系统管理数据区使用扇区进行管理
  DBR结构如下
起始地址(是相对地址,非物理意义上的) 字节数 描述
0x00~0x02 3 跳转指令,不用管
0x03~0x0A 8 厂商标志和版本号,不用管
/--0x0B~0x0C 2 每扇区字节数,固定值512字节
/--0x0D 1 每簇扇区数,0x08即1个簇有8个扇区4KB,0x40即1个簇有64个扇区32KB
/--0x0E~0x0F 2 保留区域占用的扇区数,0x21即33个扇区,该保留区域是SD分区内的保留区域,非MBR所处的保留区域
/--0x10 1 FAT表个数,固定值2
0x11~0x14 4 FAT32这里必须为0
0x15 1 存储介质,固定0xF8,不用管
0x16~0x17 2 FAT32这里必须为0
0x18~0x19 2 每磁道扇区数,固定0x3F,不用管
0x1A~0x1B 2 磁头数,固定0xFF,不用管
/--0x1C~0x1F 4 DBR分区之前所隐藏的扇区数,跟MBR中0x1C6地址处的值相等,这里就是0x2000
/--0x20~0x23 4 SD文件系统总扇区数,跟MBR中0x1CA地址处的值相等
/--0x24~0x27 4 每个FAT表占用扇区数
0x28~0x29 2 不用管
0x2A~0x2B 2 不用管
/--0x2C~0x2F 4 根目录所在第一个簇的簇号,一般固定2号簇
/--0x30~0x31 2 FSINFO(文件系统信息扇区)扇区号,固定值1,即DBR之后的那个扇区
/--0x32~0x33 2 备份引导扇区的位置,固定值6,即SD分区的备份引导扇区总是位于6号扇区
0x34~0x3F 12 预留,不用管
0x40~0x41 2 不用管
0x42 1 扩展引导标志,不用管
0x43~0x46 4 卷序列号,不用管
0x47~0x51 11 卷标(ASCII码),不用管
0x52~0x59 8 文件系统格式的ASCII码,这里是“FAT32”
0x5A~0x1FD 410 引导代码,不用管
0x1FE~0x1FF 2 分区有效结束标志“55,AA”
小结:基于DBR中的信息,可以得到以下结果
1). SD卡总容量,方法类似于MBR中的小结
2). 由于FAT32文件系统基于保留区、FAT1、FAT2、根目录、数据区的次序,可以一次计算出它们的起始地址(以下都是相对地址,不是物理地址)
保留区起始地址 -- 0x00
FAT1起始地址 -- 0x0E地址存储的保留区域占用的扇区数 * 512
FAT2起始地址 -- FAT1起始地址 + 0x24地址存储的每个FAT表占用扇区数 * 512
根目录起始地址 -- FAT2起始地址 + 0x24地址存储的每个FAT表占用扇区数 * 512
数据区起始地址 --

3. FSINFO(文件系统信息):用来记录文件系统中空闲簇的数量和下一可用簇的簇号,FSINFO一般位于文件系统1号扇区
  FSINFO结构如下
  起始地址 字节数 描述
  0x200~0x203 4 扩展引导标志,不用管
  0x204~0x3E3 480 未使用,不用管
  0x3E4~0x3E7 4 不用管
  0x3E8~0x3EB 4 文件系统的空闲簇数量
  0x3EC~0x3EF 4 下一可用簇号
  0x3F0~0x3FD 14 未使用
  0x3FE~0x3FF 2 “55,AA”
  小结:基于FSINFO中的信息,可以得到以下结果
  SD卡剩余容量 -- 0x3E8地址存储的文件系统空闲簇数量 * 0x0D地址存储的每簇扇区数 * 512
 
4. FAT1/FAT2(文件分配表):简而言之,就是用来描述簇的分配状态以及标明文件或目录的下一簇的簇号
文件系统分配磁盘空间是按簇来分配的,所以文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件只有1字节,它占用的磁盘空间也有32KB(以4GB的SD卡为例,簇大小32KB);
一个大文件需要分配多个簇来存储,所以导致这个文件的数据并不一定完整的放在磁盘中一片连续区域内(只有本簇内的扇区是连续的,簇与簇之间的扇区不一定连续);
为了实现这种链表式存储结构,FAT表就用来记录哪些簇已经被占用、已占用簇的下一个簇号、文件的最后一个簇时也要做标记
1). FAT表中,1簇固定分配4字节管理区,并由0开始编号
2). 0 号簇的管理区固定为0x0FFFFFF8, 1 号簇的管理区通常为  0xFFFFFFFF / 0x0FFFFFFF ,也有可能被用于记录脏标志,以说明文件系统没有被正常卸载;
这两号簇管理区并没有实际数据区簇号对应,也就是说实际数据区簇号最小就是2号
3). 2 号簇管理区通常对应根目录,所以被写入结束标志
4). 如果实际数据区的簇未被分配使用,则对应FAT表中的簇管理区为0;
如果该簇被使用,则对应FAT表中的簇管理区记录的就是该文件下一个存储位置的簇号;
如果是文件结束簇,则对应FAT表中的簇管理区写入结束标志0x0FFFFFFF;
如果该簇存在坏扇区,则对应FAT表中的簇管理区写入坏簇标志0xF7FFFFFF
5). 新建目录时,只为其分配11个簇的空间,对应FAT表中的簇管理区写入结束标志,当超过1个簇时则从空闲区追加一个簇并重新建立FAT表链


5. 数据区:数据区前面的区域(MBR、DBR、FSINFO、FAT1、FAT2)都不使用FAT表进行管理,所以数据区以前的区域只能使用扇区进行管理,而数据区被分为一个个簇,所有簇从2开始进行编号
1). 目录所在的扇区,都是以32Bytes划分为1个单位,每个单位称为1个目录项(可以是文件也可以是文件夹);根目录一般固定在数据区起始位置,也就是2号簇,由若干个目录项组成
2). 短文件名目录项(SFN):每个目录项(32字节)的具体定义如下
字节偏移 字节数 定义
0x00~0x07 8 文件名
0x08~0x0A 3 扩展名
0x0B 1 文件属性 0x00-读写 | 0x01-只读 | 0x02-隐藏 | 0x04-系统 | 0x08-卷标 | 0x10-子目录 | 0x20-归档
0x0C~0x0D 2 保留
0x0E~0x0F 2 文件创建时间 Bit[15:11]-小时; Bit[10:5]-分; Bit[4:0]-秒
0x10~0x11 2 文件创建日期 Bit[15:9]-年; Bit[8:5]-月; Bit[4:0]-日
0x12~0x13 2 文件最后访问日期
0x14~0x15 2 文件起始簇号的高16位
0x16~0x17 2 文件最近修改时间
0x18~0x19 2 文件最近修改日期
0x1A~0x1B 2 文件其实簇号的低16位
0x1C~0x1F 4 文件大小
3). 长文件名目录项(LFN):具有LFN的文件夹同时也会有一个SFN,如果一个文件的文件名长度超过了8个字符,则会截断建立一个SFN,用于保存时间、大小、起始簇等信息,完整的文件名则保存在LFN中
LFN的32字节定义如下:
字节偏移 字节数 定义
0x00 1 目录项未被分配时为0x00;曾经使用但已经被删除为0xE5;使用中为序号,一个文件的第一个LFN序号为0x01,然后依次递增,最后一项时为: 序号 | 0x40
0x01~0x0A 10 文件名1~5字符(unicode),未使用部分填0xFF
0x0B 1 LFN属性标志,固定值0x0F
0x0C 1 保留未使用
0x0D 1 校验和,如果一个长文件名需要多个LFN来存储,则此处有相同校验和
0x0E~0x19 12 文件名6~11字符,未使用部分填0xFF
0x1A~0x1B 2 保留未使用
0x1C~0x1F 4 文件名的12~13字符,未使用部分填0xFF
4). 子目录:新建一个子目录时,在其父目录中建立目录项,在空闲空间中为其分配一个簇,同时将簇号记录在它的目录项中;同时在为子目录分配目录项的簇中,用前两个目录项描述它与父目录的关系

小结:
如果某个目录项的文件名的第1个字节为0xE5,则表示该项已被删除
文件名字为0x2E(“.”),则表示当前目录
文件名字为0x2E 0x2E(“..”),则表示上一级目录

*****************************************************************************************************************************************************************************/


SD2.0通信协议
/*****************************************************************************************************************************************************************************
一. SD卡接口总线
有2种接口模式:SD模式和SPI模式(略)
SD模式6线如下: DAT0 数据线0
DAT1 数据线1
DAT2 数据线2
DAT3/CD 数据线3/插拔检测线
CMD 命令线
CLK 时钟线
注:1.即使只有DAT0线使用,所有数据线都要接上拉电阻,原因略;当DAT1~3没有使用时,主机DAT应该被设置为输入模式
2.SD模式下又分为1线模(只用DAT0)式和4线模式(使用DAT0~3),上电后默认工作在1线模式
3.SD模式支持一主多从架构,时钟、电源、地所有卡共有,CMD和DAT线每张卡单独私有,不能共用
4.识别模式下,时钟频率100~100KHZ;数据传输模式下,时钟频率0~25MHZ

二. 寄存器
CID - 卡标识号 - 128位
该号在出厂后无法修改,具体内容略
RCA - 相对卡地址:主机中卡的地址,在主机初始化时确定 - 16位
CSD - 卡描述数据:     - 128位

SCR - SD配置寄存器 - 64位
OCR - 操作条件寄存器 - 32位
这个寄存器存储了 VDD电压范围(4~23位) :内存数据访问电压是  2.7~3.6
卡容量状态位CCS(30位) :1-高容量SDHC卡,0-普通SD卡
忙标志(31位) :置1表示卡上电已完成
三. SD卡协议命令格式
1. MMC卡只有CMD0~CMD38基本命令,SD卡有基本命令和特定命令,发送特定命令前必须先发CMD55 

四. SD卡初始化步骤(就是一个从卡识别模式进入数据传输模式的过程)
1. 发送CMD0复位命令,返回1-复位成功,0-复位失败
2. 发送CMD8命令,验证SD卡接口操作条件:有响应-2.0SD卡;无响应-1.0SD卡或不可用卡
3. 循环发送CMD55+ACMD41命令,判断是否有响应,有响应则轮询OCR忙标志位,等待初始化完成,并判断是否是SDHC卡
4. 发送CMD2命令,得到每张卡的CID号
5. 发送CMD3命令,通知卡返回一个新的RCA,主机使用这个相对地址作为之后数据传输模式的地址
6. 发送CMD9命令,返回CSD128位寄存器数据,包含卡的具体数据:块长度、存储容量、速度传输速率等
7. 发送CMD7命令,选择一张卡,并将它切换到数据传输模式,每次只会有一张卡处于传输模式
8. 发送CMD55+ACMD51命令,返回SCR寄存器数据,获取SD卡支持的位宽信息
9. 发送CMD55+ACMD6命令,配置4bit传输模式(前提是SCR中位宽支持)

*****************************************************************************************************************************************************************************/
 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值