搜索
bottom↓
回复: 0

LPC1788+SDHC+Fatfs R0.09a 格式化失败

[复制链接]

出0入0汤圆

发表于 2014-5-15 09:38:13 | 显示全部楼层 |阅读模式
最近在学习Fatfs 文件系统,平台为LPC1788, SDHC,已经调试通过的有利用Fatfs文件系统创建文件夹、文件、写文件、追加文件、删除文件、读SD卡容量、读SD卡剩余容量,现在想要在整个程序开始时对SD卡进行初始化,但是一只有一些问题,我用的是4G的SD卡,初始化过程大概有9s,但是初始化结果返回0x01,FR_DISK_ERR,参考网上众多程序,调用f_mkfs()函数需要如下设置:
1.To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0
2.disk_ioctl 中编写GET_SECTOR_COUNT,GET_BLOCK_SIZE
反复检查这两点没有问题啊,但是程序硬件调试仍然显示初始化结果返回0x01,求指教

1、DRESULT disk_ioctl (
        BYTE drv,                /* Physical drive nmuber (0..) */
        BYTE ctrl,                /* Control code */
        void *buff                /* Buffer to send/receive control data */
)
{
    DRESULT res;
        BYTE n, *ptr = buff;
        res = RES_ERROR;
        switch (ctrl) {
        case CTRL_SYNC :                /* Make sure that no pending write process */
                res=RES_OK;
               
                break;

        case GET_SECTOR_COUNT :        /* Get number of sectors on the disk (DWORD) */
            *(DWORD*)buff = CardConfig.sectorcnt;

                res = RES_OK;
                break;

        case GET_SECTOR_SIZE :        /* Get R/W sector size (WORD) */
            *(WORD*)buff = CardConfig.sectorsize;        //512;

                res = RES_OK;
                break;

        case GET_BLOCK_SIZE :        /* Get erase block size in unit of sector (DWORD) */
            *(DWORD*)buff = CardConfig.blocksize;
       

                res = RES_OK;
                break;

        case MMC_GET_TYPE :                /* Get card type flags (1 byte) */
                *ptr = CardConfig.cardtype;
                res = RES_OK;
                break;

        case MMC_GET_CSD :                /* Receive CSD as a data block (16 bytes) */
                for (n=0;n<16;n++)
                        *(ptr+n) = CardConfig.csd[n];
                res = RES_OK;
                break;

        case MMC_GET_CID :                /* Receive CID as a data block (16 bytes) */
            for (n=0;n<16;n++)
                    *(ptr+n) = CardConfig.cid[n];
        
                res = RES_OK;
                break;

        default:
                res = RES_PARERR;
        }

        return res;
}
2、SD_BOOL SD_ReadConfiguration ()
{
    uint8_t buf[16];
    uint32_t i, c_size, c_size_mult, read_bl_len;
    SD_BOOL retv;
  
    retv = SD_FALSE;

    /* Read OCR */
    if (SD_SendCommand(READ_OCR, 0, CardConfig.ocr, 4) != R1_NO_ERROR) goto end;

    /* Read CID */
    if ((SD_SendCommand(SEND_CID, 0, NULL, 0) != R1_NO_ERROR) ||
        SD_RecvDataBlock (CardConfig.cid, 16)==SD_FALSE) goto end;

    /* Read CSD */
    if ((SD_SendCommand(SEND_CSD, 0, NULL, 0) != R1_NO_ERROR) ||
        SD_RecvDataBlock (CardConfig.csd, 16)==SD_FALSE) goto end;

    /* sector size */
    CardConfig.sectorsize = 512;
   
    /* sector count */
    if (((CardConfig.csd[0]>>6) & 0x3) == 0x1) /* CSD V2.0 (for High/eXtended Capacity) */
    {
        /* Read C_SIZE */
        c_size =  (((uint32_t)CardConfig.csd[7]<<16) + ((uint32_t)CardConfig.csd[8]<<8) + CardConfig.csd[9]) & 0x3FFFFF;
        /* Calculate sector count */
       CardConfig.sectorcnt = (c_size + 1) * 1024;

    } else   /* CSD V1.0 (for Standard Capacity) */
    {
        /* C_SIZE */
        c_size = (((uint32_t)(CardConfig.csd[6]&0x3)<<10) + ((uint32_t)CardConfig.csd[7]<<2) + (CardConfig.csd[8]>>6)) & 0xFFF;
        /* C_SIZE_MUTE */
        c_size_mult = ((CardConfig.csd[9]&0x3)<<1) + ((CardConfig.csd[10]&0x80)>>7);
        /* READ_BL_LEN */
        read_bl_len = CardConfig.csd[5] & 0xF;
        /* sector count = BLOCKNR*BLOCK_LEN/512, we manually set SECTOR_SIZE to 512*/
        //CardConfig.sectorcnt = (c_size+1)*(1<<read_bl_len) * (1<<(c_size_mult+2)) / 512;
        CardConfig.sectorcnt = (c_size+1) << (read_bl_len + c_size_mult - 7);        
    }

    /* Get erase block size in unit of sector */
    switch (CardType)
    {
        case CARDTYPE_SDV2_SC:
        case CARDTYPE_SDV2_HC:
            if ((SD_SendACommand (SD_STATUS, 0, buf, 1) !=  R1_NO_ERROR) ||
                SD_RecvDataBlock(buf, 16) == SD_FALSE) goto end;      /* Read partial block */   
            for (i=64-16;i;i--) SPI_RecvByte();  /* Purge trailing data */            
            CardConfig.blocksize = 16UL << (buf[10] >> 4); /* Calculate block size based on AU size */
            break;
        case CARDTYPE_MMC:
            CardConfig.blocksize = ((uint16_t)((CardConfig.csd[10] & 124) >> 2) + 1) * (((CardConfig.csd[10] & 3) << 3) + ((CardConfig.csd[11] & 224) >> 5) + 1);
            break;
        case CARDTYPE_SDV1:
            CardConfig.blocksize = (((CardConfig.csd[10] & 63) << 1) + ((uint16_t)(CardConfig.csd[11] & 128) >> 7) + 1) << ((CardConfig.csd[13] >> 6) - 1);
            break;
        default:
            goto end;               
    }
        CardConfig.cardtype=CardType;
    retv = SD_TRUE;
end:
    SD_DeSelect ();

    return retv;
}
3、FRESULT F_format(viod)
{
        FATFS fs;            // Work area (file system object) for logical drive
        FRESULT res;
        f_mount(0, &fs);
        res=f_mkfs(0,0,4096)   ;        //每个簇包含8个sector
        f_mount(0, NULL);
        return res;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 00:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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