OpenEdv-开源电子网

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

SD卡写入多个扇区后,除第一个扇区写入成功,后面的扇区写入失败

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-3-28
在线时间
9 小时
发表于 2016-8-3 15:33:47 | 显示全部楼层 |阅读模式
10金钱
我用的原子哥的SD卡驱动SD_WriteDisk(DMA1_Channel2_TX_BUF_HIS,0x100+SD_Index*4,4) == 0)
函数:
uint8_t SD_WriteDisk(uint8_t*buf,uint32_t sector,uint8_t cnt)
{
        uint8_t r1;
        if(SD_Type!=SD_TYPE_V2HC)sector *= 512;
        if(cnt==1)
        {
                r1=SD_SendCmd(CMD24,sector,0X01);
                if(r1==0)//Ö¸áî·¢Ëí3é1|
                {
                        r1=SD_SendBlock(buf,0xFE);
                }
        }else
        {
                if(SD_Type!=SD_TYPE_MMC)
                {
                        SD_SendCmd(CMD55,0,0X01);        
                        SD_SendCmd(CMD23,cnt,0X01);//·¢ËíÖ¸áî        
                }
                 r1=SD_SendCmd(CMD25,sector,0X01);//á¬Dø¶áÃüáî
                if(r1==0)
                {
                        do
                        {
                                r1=SD_SendBlock(buf,0xFC);//½óêÕ512¸ö×Ö½ú         
                                buf+=512;  
                        }while(--cnt && r1==0);
                        r1=SD_SendBlock(0,0xFD);//½óêÕ512¸ö×Ö½ú
                }
        }   
        SD_DisSelect();//è¡ÏûƬѡ
        return r1;//
}           



uint8_t SD_SendBlock(uint8_t*buf,uint8_t cmd)
{        
        uint16_t t;                           
        if(SD_WaitReady())return 1;
        SD_SPI_ReadWriteByte(cmd);
        if(cmd!=0XFD)
        {
                for(t=0;t<512;t++)SD_SPI_ReadWriteByte(buf[t]);
            SD_SPI_ReadWriteByte(0xFF);
            SD_SPI_ReadWriteByte(0xFF);
                t=SD_SPI_ReadWriteByte(0xFF);
                if((t&0x1F)!=0x05)return 2;                                                                                      
        }                                                                                                                                                                       
    return 0;//
}


问题:
我写入4个扇区,只有第一个扇区写入成功,之后扇区不能写入,但SD_WriteDisk返回值为正常,后DUBUG发现SD_WriteDisk调用的SD_SendBlock返回值为2(看注释的意思是 未响应),所以导致每次都写入一个扇区。但我把if((t&0x1F)!=0x05)return 2;注释后

所有的扇区都能写入,所以问下坛友 ,这个返回值重要吗?

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11564
金钱
11564
注册时间
2014-4-1
在线时间
1319 小时
发表于 2016-8-3 15:42:26 | 显示全部楼层

我也初学SD卡,
据我了解,返回值反应了卡的状态,很重要。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-3 19:51:07 | 显示全部楼层
当然重要,不要去掉。 你参考下我们mini板的代码,最好用我们例程,直接测试。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 11:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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