OpenEdv-开源电子网

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

请教原子关于SD卡写多个块的函数

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-3-4
在线时间
2 小时
发表于 2011-4-22 19:34:06 | 显示全部楼层 |阅读模式

     不知原子哥SD卡写多个块的函数(SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count))通过了没,最近用原子例程里的SD卡驱动移植了FATFS,一次写超过512字节就写不成功

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-4-23 01:02:23 | 显示全部楼层
回复【楼主位】584471964:
-------------------------------
这个我没测试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-3-4
在线时间
2 小时
 楼主| 发表于 2011-4-23 09:28:13 | 显示全部楼层
稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
    u8 r1;
    u16 i;
u16 retry;    
    //SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式  
    if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址  
    if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除   
    r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令
    if(r1 != 0x00)return r1;  //应答不正确,直接返回  
    SD_CS=0;//开始准备数据传输   
    SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好
    SPIx_ReadWriteByte(0xff);   
    //--------下面是N个sector写入的循环部分
    do
    {
        //放起始令牌0xFC 表明是多块写入
        SPIx_ReadWriteByte(0xFC);   
        //放一个sector的数据
        for(i=0;i<512;i++)
        {
            SPIx_ReadWriteByte(*data++);
        }
        //发2个Byte的dummy CRC
        SPIx_ReadWriteByte(0xff);
        SPIx_ReadWriteByte(0xff);
        
        //等待SD卡应答
       while( SPIx_ReadWriteByte(0xff)!=0xff)
   {
     retry++;
    if(retry==0xfffe) break;
   }
//        if((r1&0x1F)!=0x05)
//        {
//            SD_CS=1;    //如果应答为报错,则带错误代码直接退出
//            return r1;
//        }    
        //等待SD卡写入完成
//        if(SD_WaitDataReady()==1)
//        {
//            SD_CS=1;    //等待SD卡写入完成超时,直接退出报错
//            return 1;
//        }    
    }while(--count);//本sector数据传输完成  
    //发结束传输令牌0xFD
    r1 = SPIx_ReadWriteByte(0xFD);
    if(r1==0x00)
   {
        count =  0xfe;
    }    
    if(SD_WaitDataReady()) //等待准备好
{
SD_CS=1;
return 1;  
}
    //写入完成,片选置1
    SD_CS=1;
    SPIx_ReadWriteByte(0xff);  
    return count;   //返回count值,如果写完则count=0,否则count=1
}
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-3-4
在线时间
2 小时
 楼主| 发表于 2011-4-23 09:31:50 | 显示全部楼层
引用自 2楼 584471964 的回复: 稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
    u8 r1;
    u16 i;
u16 retry;    
    //SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式  
    if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址  
    if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除   
    r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令
    if(r1 != 0x00)return r1;  //应答不正确,直接返回  
    SD_CS=0;//开始准备数据传输   
    SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好
    SPIx_ReadWriteByte(0xff);   
    //--------下面是N个sector写入的循环部分
    do
    {
        //放起始令牌0xFC 表明是多块写入
        SPIx_ReadWriteByte(0xFC);   
        //放一个sector的数据
        for(i=0;i<512;i++)
        {
            SPIx_ReadWriteByte(*data++);
        }
        //发2个Byte的dummy CRC
        SPIx_ReadWriteByte(0xff);
        SPIx_ReadWriteByte(0xff);
        
        //等待SD卡应答
       while( SPIx_ReadWriteByte(0xff)!=0xff)
   {
     retry++;
    if(retry==0xfffe) break;
   }
//        if((r1&0x1F)!=0x05)
//        {
//            SD_CS=1;    //如果应答为报错,则带错误代码直接退出
//            return r1;
//        }    
        //等待SD卡写入完成
//        if(SD_WaitDataReady()==1)
//        {
//            SD_CS=1;    //等待SD卡写入完成超时,直接退出报错
//            return 1;
//        }    
    }while(--count);//本sector数据传输完成  
    //发结束传输令牌0xFD
    r1 = SPIx_ReadWriteByte(0xFD);
    if(r1==0x00)
   {
        count =  0xfe;
    }    
    if(SD_WaitDataReady()) //等待准备好
{
SD_CS=1;
return 1;  
}
    //写入完成,片选置1
    SD_CS=1;
    SPIx_ReadWriteByte(0xff);  
    return count;   //返回count值,如果写完则count=0,否则count=1
}
wm.png
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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