STM32
直播中

王淑华

7年用户 246经验值
私信 关注
[问答]

SD卡写多个块的函数不成功

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

回帖(3)

刘敏

2019-4-17 06:46:20
回复【楼主位】584471964:
-------------------------------
这个我没测试.
举报

吕聪

2019-4-17 07:02:01
稍微修改了下,终于可以多块写了,附上修改后的代码:
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
}
举报

李婷

2019-4-17 07:12:31
引用自 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
}                                       
举报

更多回帖

发帖
×
20
完善资料,
赚取积分