3144|3

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SD 卡 format 问题。 [复制链接]

在三菱的单片机M16cN4。进行Format SD卡 FAT16 格式。


在发送CMD9命令取得卡的块数之后。发现返回的块数,与Windows下通过用WinHex查看的块数不一样。少了很多。

目前在Windows下得到的块数为 19w之多。
在单片机里面取得的块数为16w之多。

所以Format的时候少了很多容量

以上是1G kinston SD卡。。在Windows下格式化有974M。
在单片机里面格式化只有   780M左右。

请问,有谁知道中间有什么差别吗?

谢谢了。
switch (ctrl) {
case GET_SECTORS :        /* Get number of sectors on the disk (unsigned long) */
        if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16/2)) {
                /* Calculate disk size */
         csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
        csize = ((uint16)(csd[8] & 3) >> 6) + (uint16)(csd[7] << 2) + ((uint16)(csd[6] & 3) << 10) + 1;
        *(uint32*)buff = (uint32)csize * csm;
        res = RES_OK;
        }
        break;

case MMC_GET_CSD :        /* Receive CSD as a data block (16 bytes) */
                if ((send_cmd(CMD9, 0) == 0)        /* READ_CSD */
                && rcvr_datablock(buff, 16/2))
                   res = RES_OK;
                break;

case MMC_GET_CID :        /* Receive CID as a data block (16 bytes) */
        if ((send_cmd(CMD10, 0) == 0)        /* READ_CID */
        && rcvr_datablock(buff, 16/2))
        res = RES_OK;
        break;

case MMC_GET_OCR :        /* Receive OCR as an R3 resp (4 bytes) */
        if (send_cmd(CMD58, 0) == 0) {        /* READ_OCR */
        for (n = 0, p = buff; n < 4; n++)
        *p++ = rcvr_spi();
         res = RES_OK;
        }
        break;

        default:
        res = RES_PARERR;

最新回复

完结.帖子. 是csd 版本不一样导致的.我不懂,是日方查出来的. /*csm = 1 > 7) + ((csd[9] & 3) > 6) + (uint16)(csd[7] 6;         switch (n) {         case 0 :        /* CSD ver 1.XX */         n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) > 6) + ((uint16)csd[7]   详情 回复 发表于 2007-5-10 14:14
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我在Format的时候经常报错,不知道是不是这个原因
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
目前我是得不到正确的块数。

format到是蛮快的才15秒左右。
就是得不到正确的块数。导致丢失容量。
你的块数  是怎么 计算的,能给我看看吗?
csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
csize = ((uint16)(csd[8] & 3) >> 6) + (uint16)(csd[7] << 2) + ((uint16)(csd[6] & 3) << 10) + 1;
*(uint32*)buff = (uint32)csize * csm;

这个是我的计算方法。。最终结果放在buff里面返回去。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
完结.帖子.
是csd 版本不一样导致的.我不懂,是日方查出来的.

/*csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
csize = ((uint16)(csd[8] & 3) >> 6) + (uint16)(csd[7] << 2) + ((uint16)(csd[6] & 3) << 10) + 1;
*(uint32*)buff = (uint32)csize * csm;
res = RES_OK;
*/
        n = csd[0] >> 6;
        switch (n) {
        case 0 :        /* CSD ver 1.XX */
        n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
        csize = (csd[8] >> 6) + ((uint16)csd[7] << 2) + ((uint16)(csd[6] & 3) << 10) + 1;
        *(uint32*)buff = (uint32)csize << (n - 9);
        res = RES_OK;
        break;
        case 1 :        /* CSD ver 2.00 */
        csize = csd[9] + ((uint16)csd[8] << 8) + 1;
        *(uint32*)buff = (uint32)csize << 10;
        res = RES_OK;
        break;
        }
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表