OpenEdv-开源电子网

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

关于SD卡的擦除

[复制链接]

18

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-7-20
在线时间
19 小时
发表于 2017-3-10 21:10:49 | 显示全部楼层 |阅读模式
5金钱
目前只有一个问题,就是擦除函数用了后其他函数就会卡住不能使用,擦除后加上延时也不行比如擦除后,再继续写,就会 卡死在       “连续读直到读到XXX0 0101表示写入成功”这里

//输入参数1  擦除的起始扇区地址  
//输入参数2  擦除的结束扇区地址  
//返回值     擦除扇区是否成功  
uint8_t SD_erase_sector(uint32_t sector_start, uint32_t sector_stop)  
{  

    CS1;  //无效上一次片选  
    SPI1_ReadWriteByte(0xff);  

    if(SD_SendCmd(32,sector_start,0xff))  
    {  
       CS1;  //无效片选  
       return ERASE_SECTOR_ERROR;  
    }  

    if(SD_SendCmd(33,sector_stop,0xff))  
    {  
       CS1;  //无效片选  
       return ERASE_SECTOR_ERROR;  
    }  

    if(SD_SendCmd(38,0,0xff))  
    {  
        CS1;  //无效片选  
       return ERASE_SECTOR_ERROR;  
    }  
               
    CS1;  //无效片选  
          SPI1_ReadWriteByte(0xff);  
                 
                printf("\r\n 擦除成功 \r\n");
    return ERASE_SECTOR_SUCCESS;  
}



//向SD中的一个扇区写数据  
//输入参数1  写入扇区地址  
//输入参数2  存储512个写入数据的数组  
//输入参数3  写入扇区的个数  
//返回值是写入成功还是不成功  
uint8_t  SD_write_sector_data(uint32_t sector ,const uint8_t data[], uint32_t count)  
{  
   uint16_t i;  
   uint8_t response;  
   uint32_t j;  
   uint32_t add=0;  
       
   CS1;  //无效片选  
   SPI1_ReadWriteByte(0xff);  //片选无效之后,在发送8个时钟

   if(count == 1)  //单个扇区数据写入  
   {  
      //发送24命令,即写扇区命令  
      //正常响应应该为0x00  
                 
                 
       if(SD_SendCmd(24,sector,0xff))  
       {  
          CS1;  //无效片选  
          return WRITE_SECTOR_DATA_ERROR;  
       }  
       SPI1_ReadWriteByte(0xff);  //????????
       //写数据起始令牌  
       SPI1_ReadWriteByte(0xfe);//发送数据块标志0xfe     
                         
                         
       for(i=0; i<512; i++)  
       {  
         SPI1_ReadWriteByte(data[add + i]);
       }      
                         
                         
       //发送CRC码  
       SPI1_ReadWriteByte(0xff);  
       SPI1_ReadWriteByte(0xff);      
                         
       for(i=0; ; i++)  //连续读直到读到XXX0 0101表示写入成功
       {  
         response = SPI1_ReadWriteByte(0xff);  
         if((response & 0x0f) == 0x05)  
         break;  
         if(i==100)  
         {  
            CS1;  //无效片选  
            return WRITE_SECTOR_DATA_ERROR;  
         }  
       }  
                         
                         
                         
                         while(SPI1_ReadWriteByte(0xff) != 0xff);//读到0x00表示忙,等于0xff表示写入完成  
   }  
   else      //多个扇区数据写入  
   {  
       //发送25命令,即写多个扇区命令  
       //正常响应应该为0x00  
       if(SD_SendCmd(25,sector,0xff))  
       {  
          CS1;  //无效片选  
          return WRITE_SECTOR_DATA_ERROR;  
       }  

                                for(j=1; ; j++)  
                         {                  
                                 SPI1_ReadWriteByte(0xff);  //?????????
                                 //写数据起始令牌  
                                 SPI1_ReadWriteByte(0xfc);//发送数据块标志0xfc   
                               
                                 for(i=0; i<512; i++)  
                                 {  
                                         SPI1_ReadWriteByte(data[add + i]);
                                 }      
                                 //发送CRC码  
                                 SPI1_ReadWriteByte(0xff);  
                                 SPI1_ReadWriteByte(0xff);  
                                 
                                 for(i=0; ; i++)  //连续读直到读到XXX0 0101表示写入成功
                                 {          
                                                response = SPI1_ReadWriteByte(0xff);  
                                                if((response & 0x0f) == 0x05)  
                                                        break;  
                                                if(i==100)  
                                                {  
                                                                CS1;  //无效片选  
                                                                return WRITE_SECTOR_DATA_ERROR;  
                                                }  
                                 }  
                                 
                                 while(SPI1_ReadWriteByte(0xff) != 0xff); //读到0x00表示忙,等于0xff表示写入完成  
                                 add += 512;  
                                 if(j == count)  //多块写入如果完成
                                 {  
           SPI1_ReadWriteByte(0xFD);  
           break;  
                                }  
                        }  
   }  
         
   CS1;  //无效片选  
   SPI1_ReadWriteByte(0xff);  
         
         printf("\r\n 写入成功 \r\n");
   return WRITE_SECTOR_SUCCESS;   
}  

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-10 23:12:23 | 显示全部楼层
回复

使用道具 举报

18

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-7-20
在线时间
19 小时
 楼主| 发表于 2017-3-11 21:02:43 | 显示全部楼层
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-14
在线时间
9 小时
发表于 2021-1-26 09:17:16 | 显示全部楼层
我记得擦除的地址是按照字节地址写入的,你代码中好像是扇区地址?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 19:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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