OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7256|回复: 10

sd卡容量计算的详解及程序实现

[复制链接]

26

主题

261

帖子

1

精华

高级会员

Rank: 4

积分
734
金钱
734
注册时间
2013-11-1
在线时间
28 小时
发表于 2014-4-19 10:46:24 | 显示全部楼层 |阅读模式
这是本人最近写的一个博客,因为本人对这个计算也疑惑好久也看见很多人在论坛提问类似的问题,所以就写出来供大家参考,由于本人是菜鸟难免会有错误,希望大家指正批评http://blog.csdn.net/zhao305149619/article/details/24048379,在这里要特别感谢原子哥的帮助,首先程序是参考他的,其次感谢他平易近人,热心回答我的一些问题,甚至是一些弱智问题,希望论坛越办越好。

站长加入:
转到本论坛:
   说说为什么想起来写这篇文档,主要因为本然当时写程序的时候对这部分挺疑惑的,同时看见好多人在论坛提问类似的问题,所以本人也是菜鸟,就写这篇文档帮助其他人的同时也提升自己的表达能力和总结能力,供同仁们参考参考,好了废话不多说了,首先在本次详细说明之前建议读者自己有一份《sd卡协议(物理层)》说明文档,因为本人一下内容都是通过这个文档说明,如果想详细了解sd卡必须消息阅读本文档,在此贴出本人分享的下载的地址http://pan.baidu.com/s/1hqn6GXQ       点击打开链接,首先简单介绍一些sd卡的分类,目前市面上大致分为三类根据sd卡的容量,
容量等级
容量范围
磁盘格式
SD
上限至2GB
FAT 12, 16
SDHC
2GB至 32GB
FAT 32
SDXC
32GB至2TB
exFAT

其中sdxc卡是超高速sd卡,目前在为控制开发用的不多,同时由于sdxc协议与SDSC,SDHC协议是不同的,所以这次就只讲SDSC和SDHC卡的容量计算的协议:1.讲SDSC卡的容量计算,根据文档给出的公式如图所示中:

详细可以参考文档P81,现在我们知道了公式,只要知道其中的未知量即可求出SDSC的容量,接下来我看看如何得到图中的一些未知量:C_SIZE,C_SIZE_MULT,READ_BL_LEN三个未知量,因为关于一些sd卡的一些的一些内容的寄存器CSD:The Card-Specific Data register provides information regarding access to the card contents.因为这个是普通的低容量卡所以我们要看V1.0版本的协议,记住特别重要我们看看,这个寄存器CSD中我们需要的一些内容我简单按照协议把我们需要的一些看整理出来,详细看协议V1.0,所以我们知道这些数据,如果单片机可以读取寄存器中的这些数据值根据公式即可计算出来,由于我使用的是SPI读取SD卡,所以数据传输方式是MSB到LSB,所以我们接受方式是从最高到最低接受的需要特别注意这也是很多人看不懂源程序最主要的原因,说怎么和协议公式不对应,先讲 C_SIZE,在上图可以看见bit数是12,同时在寄存器的【73:62】,从寄存器最高的127数到【73:62】,所以 C_SIZE的12位分别在接受字节的CSD[6]、CSD[7]、CSD[8]中,其中占CSD[6]低2位,CSD[7]的8位,CSD[8]的高两位,加在一起正好是12位,同时参照协议可以得到C_SIZE_MULT在CSD[9]的低两位,CSD[10]的高一位,READ_BL_LEN在寄存器的CSD[5]的低4位,所以根据上述的公式可以写程序如下:

  1. n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;  
  2.         csize = (csd[8] >> 6) + ((u16)csd[7] << 2) + ((u16)(csd[6] & 3) << 10) + 1;  
  3.         Capacity= (u32)csize << (n - 9);//得到扇区数     
其中的n=C_SIZE_MULT+READ_BL_LEN+2;其中公式中的&就是取寄存器中相应的位数,可以参考协议仔细比对一下就会明白的,可能大家会对之后 一句话疑惑

Capacity= (u32)csize << (n - 9);//得到扇区数 ,因为扇区数=容量/块大小(本次是512Byte),Capacity= (u32)csize << n /512;整理公式之后即可等到最后一句话的结果,好了,关于SDSC容量的计算就说到这里:下面说关于SDHC容量的计算,由于SDHC的块大小是固定的512Byte,所以计算公式简单很多,注意的是SDHC容量计算必须看协议V2.0中的CSD寄存器,我们首先还是那样看一下计算公式吧其中化双下滑杠的部分需要特别注意一下,在后面我会提高,由上图的公式可以看到我们只需要一个未知量C_SIZE,这个如果可以知道即可计算SD卡的容量,还是如上面的方法我们看一下C_SIZE在csd寄存器中的位置及寄存器的宽度还是由高127开始接受,按协议可以计算出C_SIZE在接受字节位置是CSD【7】、CSD【8】、CSD【9】,其中占CSD【7】的低6位,CSD【8】的8位,CSD【9】的8为,所以我们在程序中计算如下:

  1. csize = csd[9] + ((u16)csd[8] << 8) + 1;  
  2.     Capacity = (u32)csize << 10;//得到扇区数     
首先看到程序第一问题你可能会有这样的疑惑,CSD【7】怎么没有用上,是不是有问题,其实是没有问题的,你仔细看上图双下划线的话是什么,大致意思是:文件的高六位必须设置为0,这是为什么呢?其实是以为如果按照c_size的位宽最大它的容量可以达到2TB,但是我们也知道SDHC的容量范围是2~32GB,所以高6位必须设置为0,关于止呕后一句话的意思就是扇区数=容量/512.所以我们看公式应该是(C_SIZE+1)*1024*512/512=(C_SIZE+1)*1024=csize << 10,即可得到上述的结果。本人也是菜鸟,仅是凭着本人的理解写出来,如果有什么错误的地方还希望大神们评论指出,在这里感谢原子哥,程序的实现是参考他的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-19 15:57:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-4
在线时间
0 小时
发表于 2014-8-4 12:04:15 | 显示全部楼层
好,谢谢分享
快速、不断的学习,才是胜利的法宝!
回复 支持 反对

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-8-3
在线时间
0 小时
发表于 2014-8-29 16:13:31 | 显示全部楼层
楼主大神呀,解决了我一个大问题!!
电子技能就是我行走江湖时手中的利剑。
回复 支持 反对

使用道具 举报

26

主题

261

帖子

1

精华

高级会员

Rank: 4

积分
734
金钱
734
注册时间
2013-11-1
在线时间
28 小时
 楼主| 发表于 2014-9-8 14:51:10 | 显示全部楼层
回复【4楼】腾飞:
---------------------------------
有帮助就好,希望大家都多多发言,为论坛做一份贡献
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

高级会员

Rank: 4

积分
506
金钱
506
注册时间
2014-6-27
在线时间
127 小时
发表于 2014-9-8 15:54:01 | 显示全部楼层
mark 学习学习
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-7-6
在线时间
0 小时
发表于 2014-9-16 13:05:01 | 显示全部楼层
为什么的二个C_SIZE是CSD[7],CSD[8],CSD[9],跟上面的的C_SIZE的不一样啊?
回复 支持 反对

使用道具 举报

26

主题

261

帖子

1

精华

高级会员

Rank: 4

积分
734
金钱
734
注册时间
2013-11-1
在线时间
28 小时
 楼主| 发表于 2014-9-18 19:20:59 | 显示全部楼层
回复【7楼】孤夜123:
---------------------------------
一个是SdSc, Sdhc
回复 支持 反对

使用道具 举报

26

主题

261

帖子

1

精华

高级会员

Rank: 4

积分
734
金钱
734
注册时间
2013-11-1
在线时间
28 小时
 楼主| 发表于 2014-9-18 19:34:22 | 显示全部楼层
回复【4楼】腾飞:
---------------------------------
客气了
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-9-20
在线时间
0 小时
发表于 2014-11-12 16:10:07 | 显示全部楼层
mark,学习了
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-11-13 09:20:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 04:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表