OpenEdv-开源电子网

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

关于stm32 spi+dma+fat读取sd卡容量FATFS_GetFree("0:",&sd_total,&sd_free)出错

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-5-20
在线时间
50 小时
发表于 2020-4-21 22:43:46 | 显示全部楼层 |阅读模式
1金钱
如题:关于stm32 spi+dma+fat读取sd卡容量FATFS_GetFree("0:",&sd_total,&sd_free)出错,返回结果是0x0d,也就是没获取到系统文件
很奇怪没使用dma传输时,fat读取一切正常,可以获取sd卡容量,可以正常读卡文件,
[22:39:00.412]收←◆SD Card OK!
SDV2HC OK!
Fat初始化内存成功
SD卡 FAT ok!
SD Total Size: 3720MB
SD  Free Size: 3660MB

加入dma以后就出现异常了。
[22:39:07.572]收←◆SD Card Deceting!
SD Card OK!
SDV2HC OK!
Fat初始化内存成功
SD卡容量检测中
SD卡 FAT 错误!
也无法获取容量大小。


加入的dma部分代码如下

//从sd卡读取一个数据包的内容
//buf:数据缓存区
//len:要读取的数据长度.
//返回值:0,成功;其他,失败;   
u8 SD_RecvData(u8*buf,u16 len)
{                    
    if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
    //*********非DMA代码*************************************/
/*    while(len--)//开始接收数据
    {
        *buf=SPI2_ReadWriteByte(0xFF);
        buf++;
    }*/
//*********非DMA代码*************************************/
   
//*********DMA代码*************************************/
   DMA1_Star_SPI_RX(buf,len);
//*****************************************************/
   
    //下面是2个伪CRC(dummy CRC)
    SD_SPI_ReadWriteByte(0xFF);
    SD_SPI_ReadWriteByte(0xFF);                                                              
    return 0;//读取成功
}


//向sd卡写入一个数据包的内容 512字节
//buf:数据缓存区
//cmd:指令
//返回值:0,成功;其他,失败;   
u8 SD_SendBlock(u8*buf,u8 cmd)
{   
    u16 t;               
    if(SD_WaitReady())return 1;//等待准备失效
    SD_SPI_ReadWriteByte(cmd);
    if(cmd!=0XFD)//不是结束指令
    {
//*********非DMA代码*************************************/
//for(t=0;t<512;t++)SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
//*********非DMA代码*************************************/
        
//*********DMA代码*************************************/
    DMA1_Star_SPI_TX(buf);
//*****************************************************/
        SD_SPI_ReadWriteByte(0xFF);//忽略crc
        SD_SPI_ReadWriteByte(0xFF);
        t=SD_SPI_ReadWriteByte(0xFF);//接收响应
        if((t&0x1F)!=0x05)return 2;//响应错误                                                              
    }                                                                                       
    return 0;//写入成功
}

//读SD卡
//buf:数据缓存区
//sector:扇区
//cnt:扇区数
//返回值:0,ok;其他,失败.
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
        u8 r1;
    long long lsector=sector;
    if(SD_Type!=SD_TYPE_V2HC) lsector <<= 9;//转换为字节地址
    if(cnt==1)
    {
        r1=SD_SendCmd(CMD17,(u32)lsector,0X01);//读命令
        if(r1==0)//指令发送成功
        {
            r1=SD_RecvData(buf,512);//接收512个字节      
        }
    }else
    {
        r1=SD_SendCmd(CMD18,lsector,0X01);//连续读命令
        do
        {
            r1=SD_RecvData(buf,512);//接收512个字节     
            buf+=512;  
        }while(--cnt && r1==0);     
        SD_SendCmd(CMD12,0,0X01);    //发送停止命令
    }   
    SD_DisSelect();//取消片选
    return r1;//   
/************************************非dma
    u8 r1;
   
    if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
    if(cnt==1)
    {
        r1=SD_SendCmd(CMD17,sector,0X01);//读命令
        if(r1==0)//指令发送成功
        {
            r1=SD_RecvData(buf,512);//接收512个字节      
        }
    }else
    {
        r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
        do
        {
            r1=SD_RecvData(buf,512);//接收512个字节     
            buf+=512;  
        }while(--cnt && r1==0);     
        SD_SendCmd(CMD12,0,0X01);    //发送停止命令
    }   
    SD_DisSelect();//取消片选

    return r1;//
    ************************************/
}




请各位老大指点一下迷津,小的不才新菜一名。。。。。。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 02:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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