OpenEdv-开源电子网

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

sd卡多扇区写入失败问题

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-27
在线时间
24 小时
发表于 2016-10-31 11:54:27 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 zeroawp 于 2016-10-31 11:56 编辑

用MINISTM32 SD卡例程中的多扇区写入函数,写入结果为失败。
大家有用成功过这个函数的吗?
我的调用方式如下,另外我试了单扇区写入是成功的。

const u8 a[512]="aaa";
SD_WriteDisk((u8*)a,0,1);

函数定义:
[mw_shl_code=applescript,true]//D′èëSD¿¨μÄN¸öblock(Î′êμ¼ê2aêÔ1y)                                                                           
//êäèë:u32 sector éèÇøμØÖ·£¨sectorÖ죬·ÇÎïàíμØÖ·£©
//     u8 *buffer êy¾Y′æ′¢μØÖ·£¨′óD¡Öáéù512byte£©
//     u8 count D′èëμÄblockêyÄ¿                  
//·μ»ØÖμ:0£o 3é1|
//       other£oê§°ü                                                                                                                           
u8 SD_WriteDisk(u8*buf,u32 sector,u8 count)
{
    u8 r1;
    u16 i;                          
    //SPIx_SetSpeed(SPI_SPEED_HIGH);//éèÖÃÎa¸ßËùģ꽠        
    if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//è&#231;1&#251;2&#187;ê&#199;SDHC£&#172;&#184;&#248;&#182;¨μ&#196;ê&#199;sectorμ&#216;&#214;·£&#172;&#189;&#171;&#198;&#228;×a&#187;&#187;3ébyteμ&#216;&#214;·  
    if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//è&#231;1&#251;&#196;&#191;±ê&#191;¨2&#187;ê&#199;MMC&#191;¨£&#172;&#198;&#244;ó&#195;ACMD23&#214;&#184;á&#238;ê1&#196;ü&#212;¤2á3y   
    r1 = SD_SendCommand(CMD25, sector, 0x00);//·¢&#182;à&#191;éD′è&#235;&#214;&#184;á&#238;
    if(r1 != 0x00)return r1;  //ó|′e2&#187;&#213;yè·£&#172;&#214;±&#189;ó·μ&#187;&#216;         
    SD_CS=0;//&#191;aê&#188;×&#188;±&#184;êy&#190;Y′&#171;ê&#228;   
    SPIx_ReadWriteByte(0xff);//&#207;è·&#197;3&#184;&#246;&#191;&#213;êy&#190;Y£&#172;μè′ySD&#191;¨×&#188;±&#184;o&#195;
    SPIx_ReadWriteByte(0xff);   
    //--------&#207;&#194;&#195;&#230;ê&#199;N&#184;&#246;sectorD′è&#235;μ&#196;&#209;-&#187;·2&#191;·&#214;
    do
    {
        //·&#197;&#198;eê&#188;á&#238;&#197;&#198;0xFC ±í&#195;÷ê&#199;&#182;à&#191;éD′è&#235;
        SPIx_ReadWriteByte(0xFC);         
        //·&#197;ò&#187;&#184;&#246;sectorμ&#196;êy&#190;Y
        for(i=0;i<512;i++)
        {
            SPIx_ReadWriteByte(*buf++);
        }
        //·¢2&#184;&#246;Byteμ&#196;dummy CRC
        SPIx_ReadWriteByte(0xff);
        SPIx_ReadWriteByte(0xff);
        
        //μè′ySD&#191;¨ó|′e
        r1 = SPIx_ReadWriteByte(0xff);
        if((r1&0x1F)!=0x05)
        {
            SD_CS=1;    //è&#231;1&#251;ó|′e&#206;a±¨′í£&#172;&#212;ò′&#248;′í&#206;ó′ú&#194;&#235;&#214;±&#189;óí&#203;3&#246;
            return r1;
        }                  
        //μè′ySD&#191;¨D′è&#235;íê3é
        if(SD_WaitDataReady()==1)
        {
            SD_CS=1;    //μè′ySD&#191;¨D′è&#235;íê3é3&#172;ê±£&#172;&#214;±&#189;óí&#203;3&#246;±¨′í
            return 1;
        }           
    }while(--count);//±&#190;sectorêy&#190;Y′&#171;ê&#228;íê3é  
    //·¢&#189;áê&#248;′&#171;ê&#228;á&#238;&#197;&#198;0xFD
    r1 = SPIx_ReadWriteByte(0xFD);
    if(r1==0x00)
    {
        count =  0xfe;
    }                  
    if(SD_WaitDataReady()) //μè′y×&#188;±&#184;o&#195;
        {
                SD_CS=1;
                return 1;  
        }
    //D′è&#235;íê3é£&#172;&#198;&#172;&#209;&#161;&#214;&#195;1
    SD_CS=1;
    SPIx_ReadWriteByte(0xff);  
    return count;   //·μ&#187;&#216;count&#214;μ£&#172;è&#231;1&#251;D′íê&#212;òcount=0£&#172;·&#241;&#212;òcount=1
}                                        [/mw_shl_code]                          

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 16:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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