打印

用K60库操作SD卡出问题

[复制链接]
296|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
博斯|  楼主 | 2019-11-20 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有两个问题, 第一个稍微简单点,全速运行会在disk_read() 里的 if (Stat & STA_NOINIT) return RES_NOTRDY;     //未就绪  
这里返回error  要是在前面设了断点就不会。。  可以理解为速度太快了?  只需要延时一下就好了吗?


第二个问题, 我先把 disk_read() 贴出来
DRESULT disk_read (         //读磁盘扇区
    uint8  drv,             /* 物理驱动编号 (0) */
    uint8  *buff,           /* 指向数据缓冲区来存储读到的数据 */
    uint32 sector,          /* 开始的扇区号 (LBA) */
    uint8  count            /* 扇区总数(1..255) */
)
{
    ESDHC_CMD_t command;

    if (drv || (!count)) return RES_PARERR;       //drv 只能为 0, count 必须不等于0
    if (Stat & STA_NOINIT) return RES_NOTRDY;     //未就绪

    /* 检测参数 */
    if ((NULL == buff))
    {
        return RES_PARERR;//参数无效
    }

    if (!SDHC_card.SDHC)
    {
        sector *= SDCARD_BLOCK_SIZE;    /* 如果需要,转换为字节地址 */
    }

    if (count == 1) /* 单块读 */
    {
        command.COMMAND = ESDHC_CMD17;
        command.TYPE = ESDHC_TYPE_NORMAL;
        command.ARGUMENT = sector;
        command.READ = TRUE;
        command.BLOCKS = count;

        if (ESDHC_IOCTL_OK == SDHC_ioctl (ESDHC_IOCTL_SEND_CMD, &command))
        {
            if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE))     // 单步运行到此处,IF中的返回值不为1,导致后面返回error,于是再进去看看这个函数,仍然贴在下面
            {
                count = 0;
            }
        }
    }
    else
    {
        /* 多块读 */
        //
        command.COMMAND = ESDHC_CMD18;
        //command.COMMAND = ESDHC_CMD17;
        command.TYPE = ESDHC_TYPE_NORMAL;
        command.ARGUMENT = sector;
        command.READ = TRUE;
        command.BLOCKS = count;

        if (ESDHC_IOCTL_OK == SDHC_ioctl (ESDHC_IOCTL_SEND_CMD, &command))
        {
            if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE * count))
            {
                count = 0;
            }
        }
    }

    return count ? RES_ERROR : RES_OK;
}






static int rcvr_datablock (uint8   *buff, uint32  btr)
{
    uint32  bytes, i, j;
    uint32  *ptr = (uint32 *)buff;


    /* Workaround for random bit polling failures - not suitable for IO cards    */

    while(!(SDHC_IRQSTAT & SDHC_IRQSTAT_BRR_MASK));
    SDHC_IRQSTAT =  SDHC_IRQSTAT_BRR_MASK ;

    /* Read data in 4 byte counts */
    bytes = btr;
    while (bytes)
    {
        i = bytes > SDCARD_BLOCK_SIZE ? SDCARD_BLOCK_SIZE : bytes;
        for (j = (i + 3) >> 2; j != 0; j--)
        {
            if (SDHC_IRQSTAT & (SDHC_IRQSTAT_DEBE_MASK | SDHC_IRQSTAT_DCE_MASK | SDHC_IRQSTAT_DTOE_MASK))  //  问题找到了,就是这句话判断出错,返回了0值,导致SD卡操作失败。
            {
                SDHC_IRQSTAT |= SDHC_IRQSTAT_DEBE_MASK | SDHC_IRQSTAT_DCE_MASK | SDHC_IRQSTAT_DTOE_MASK | SDHC_IRQSTAT_BRR_MASK;
                return 0;
            }

            while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN_MASK)) {};

            //小端
            *ptr++ = SDHC_DATPORT;
        }
        bytes -= i;
    }

    return 1;                       /* Return with success */
}


发现了问题,但不知道为什么,也不知道怎么解决, 求大神帮忙看看

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

412

主题

412

帖子

0

粉丝