OpenEdv-开源电子网

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

走过的,路过的,进来看看:SD卡容量计算的问题,大侠们帮忙解答一下,困扰我好久了!

[复制链接]

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-3-28
在线时间
0 小时
发表于 2012-10-23 11:20:30 | 显示全部楼层 |阅读模式
if((csd[0]&0xC0)==0x40)  //V2.00的卡

       csize = csd[9] + ((u16)csd[8] << 8) + 1;
       Capacity = (u32)csize << 10;//     1).      
 }
else//V1.XX的卡

       n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
       csize = (csd[8] >> 6) + ((u16)csd[7] << 2) + ((u16)(csd[6] & 3) << 10) + 1;
       Capacity= (u32)csize << (n - 9);//    2).
 }


1).  对于V2.0的卡,协议上计算方法为:Capacity=(csise+1)*512,而程序这里为什么左移10位呢,这样不是相当于乘以1024了吗?!
2). 对于V1.X的卡,这里的计算方法更是没有看懂,和协议上的计算方法Capacity = BLOCKNR * BLOCK_LEN  怎么联系起来呢?
       Where:
                     BLOCKNR = (C_SIZE+1) * MULT
                     MULT = 2^C_SIZE_MULT+2      (C_SIZE_MULT < 8)
                     BLOCK_LEN = 2^READ_BL_LEN,       (READ_BL_LEN < 12)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-12-17
在线时间
0 小时
发表于 2013-12-17 10:13:16 | 显示全部楼层
我也有一事不明:我卡的CSIZE为1111110111011010110010(供22bit),CSD2.0的,我这一算吓我一跳,2个TiB啊,求大神帮我计算一下,就用这个公式:memory capacity = (C_SIZE+1) * 512KByte ,另外有没有可能存在不负责人的卡生产商,在CSD中的CSIZE域乱写?还是我计算有什么问题?
。。。
what?hurts?more?
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-23 14:20:36 | 显示全部楼层
你要看返回值的意义。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-23 14:20:55 | 显示全部楼层
返回值单位是字节?
还是512字节?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-10-23 15:30:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
//获取SD卡的总扇区数(扇区数)   
//返回值:0: 取容量出错 
//       其他:SD卡的容量(扇区数/512字节)
//每扇区的字节数必为512,因为如果不是512,则初始化不能通过.

这是函数前面的说明,返回0表示出错,返回其它的话为SD卡的容量,这里的容量怎么写成(扇区数/512字节),真是不解啊,这是例程里的程序啊,我没改动的,原子哥帮忙看看,谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-23 22:00:34 | 显示全部楼层
就是返回的是扇区总数。
比如返回1,就说明SD卡只有1个扇区,512字节。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-10-24 11:09:58 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
这里我怎么感觉你返回的是字节数呢,哎,悲催了!!!!
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-8-1
在线时间
18 小时
发表于 2013-10-26 16:59:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
V2.0协议上卡容量计算方法为:Capacity=(csise+1)*512,一个扇区是512字节,那么卡的扇区数不应该是csise+1吗?程序里为什么左移10位呢?
学习,只为变得更优秀!!!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-12-17
在线时间
0 小时
发表于 2013-12-17 10:07:55 | 显示全部楼层
回复【7楼】yaktu:
---------------------------------
memory capacity = (C_SIZE+1) * 512KByte
左移10位是因为512后边的那个"K",一个K就是1<<10,所以要这样啊
what?hurts?more?
回复 支持 反对

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-8-3
在线时间
0 小时
发表于 2014-8-29 17:16:20 | 显示全部楼层
回复【9楼】vacd:
---------------------------------
0.0
电子技能就是我行走江湖时手中的利剑。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 03:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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