OpenEdv-开源电子网

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

原子的USB读写SD卡,为什么不能对SD卡数据删除呢??

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
发表于 2013-4-7 10:23:40 | 显示全部楼层 |阅读模式
原子的USB读写SD卡,为什么不能对SD卡数据删除呢??在PC端对SD卡数据进行删除,板子重新上电后,SD卡数据居然还在,这是为什么?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 10:23:54 | 显示全部楼层
回复【楼主位】zhyntu:
---------------------------------
急待回复
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-7 10:35:05 | 显示全部楼层
不会吧,哪个开发板?哪个例程?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 10:36:09 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
例程是 ALIENTEK MINISTM32 实验27 USB读卡器
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 10:36:43 | 显示全部楼层
删除SD卡函数应该放在USB解析的哪里调用呢?
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 10:37:17 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
你那个例程可读写,但不能删除。
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 11:03:33 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子咋解决啊。
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-7 11:11:36 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
u8  SD_EraseBlock(u32 sector,u32 Offset)
{
     u8 r1 ;

 if (SD_Type !=SD_TYPE_V2HC)
 {
     sector <<= 9;
 }
 r1 = SD_SendCommand (CMD32,sector,0xFF);  //写地址后第一块被擦除

 if (r1 !=MSD_RESPONSE_NO_ERROR)
 {
    return ERASEDERR;
 }
 Offset  =  sector+ Offset;

     r1 = SD_SendCommand (CMD33,Offset,0xFF);  //写地址后第一块被擦除
 
 if (r1 !=MSD_RESPONSE_NO_ERROR)
 {
    return ERASEDERR;
 }
 
 r1 = SD_SendCommand (CMD38,0,0xFF);  //写地址后第一块被擦除
     
 if (r1 !=MSD_RESPONSE_NO_ERROR)
 {
    return ERASEDERR;
 }

 return MSD_RESPONSE_NO_ERROR;
}
应放在哪里呢
void Mass_Storage_Out (void)
{
u8 CMD;
Usb_Status_Reg=0X10;//标记轮询

CMD = CBW.CB[0];
Data_Len = _GetEPRxCount(ENDP2);//GetEPRxCount(ENDP2);
PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len);
switch (Bot_State)
{
case BOT_IDLE:
CBW_Decode();
break;
case BOT_DATA_OUT://USB发送数据到设备
if (CMD == SCSI_WRITE10)
{
// Usb_Status_Reg|=0X01;//标记正在写数据
SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
break;
}
Bot_Abort(DIR_OUT);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
break;
default:
Bot_Abort(BOTH_DIR);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
break;
}
}

/*******************************************************************************
* Function Name: CBW_Decode
* Description : Decode the received CBW and call the related SCSI command
*                 routine.
* Input       : None.
* Output      : None.
* Return      : None.
*******************************************************************************/
void CBW_Decode(void)
{
  u32 Counter;

  for (Counter = 0; Counter < Data_Len; Counter++)
  {
    *((u8 *)&CBW + Counter) = Bulk_Data_Buff[Counter];
  }
  CSW.dTag = CBW.dTag;
  CSW.dDataResidue = CBW.dDataLength;
  if (Data_Len != BOT_CBW_PACKET_LENGTH)
  {
    Bot_Abort(BOTH_DIR);
    /* reset the CBW.dSignature to desible the clear feature until receiving a Mass storage reset*/
    CBW.dSignature = 0;
    Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, ARAMETER_LIST_LENGTH_ERROR);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
    return;
  }

  if ((CBW.CB[0] == SCSI_READ10 ) || (CBW.CB[0] == SCSI_WRITE10 ))
  {
    /* Calculate Logical Block Address */
    SCSI_LBA = (CBW.CB[2] << 24) | (CBW.CB[3] << 16) | (CBW.CB[4] <<  8) | CBW.CB[5];
    /* Calculate the Number of Blocks to transfer */
    SCSI_BlkLen = (CBW.CB[7] <<  8) | CBW.CB[8];
  }

  if (CBW.dSignature == BOT_CBW_SIGNATURE)
  {
    /* Valid CBW */
    if ((CBW.bLUN > Max_Lun) || (CBW.bCBLength < 1) || (CBW.bCBLength > 16))
    {
      Bot_Abort(BOTH_DIR);
      Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
      Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
    }
    else
    {
      switch (CBW.CB[0])
      {
        case SCSI_REQUEST_SENSE:
          SCSI_RequestSense_Cmd (CBW.bLUN);
          break;
        case SCSI_INQUIRY:
          SCSI_Inquiry_Cmd(CBW.bLUN);
          break;
        case SCSI_START_STOP_UNIT:
          SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
          break;
        case SCSI_ALLOW_MEDIUM_REMOVAL:
          SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
          break;
        case SCSI_MODE_SENSE6:
          SCSI_ModeSense6_Cmd (CBW.bLUN);
          break;
        case SCSI_MODE_SENSE10:
          SCSI_ModeSense10_Cmd (CBW.bLUN);
          break;
        case SCSI_READ_FORMAT_CAPACITIES:
          SCSI_ReadFormatCapacity_Cmd(CBW.bLUN);
          break;
        case SCSI_READ_CAPACITY10:
          SCSI_ReadCapacity10_Cmd(CBW.bLUN);
          break;
        case SCSI_TEST_UNIT_READY:
          SCSI_TestUnitReady_Cmd(CBW.bLUN);
          break;
        case SCSI_READ10:
          SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
          break;
        case SCSI_WRITE10:
          SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
          break;
        case SCSI_VERIFY10:
          SCSI_Verify10_Cmd(CBW.bLUN);
          break;
        case SCSI_FORMAT_UNIT:
          SCSI_Format_Cmd(CBW.bLUN);
          break;
          /*Unsupported command*/

        case SCSI_MODE_SELECT10:
          SCSI_Mode_Select10_Cmd(CBW.bLUN);
          break;
        case SCSI_MODE_SELECT6:
          SCSI_Mode_Select6_Cmd(CBW.bLUN);
          break;

        case SCSI_SEND_DIAGNOSTIC:
          SCSI_Send_Diagnostic_Cmd(CBW.bLUN);
          break;
        case SCSI_READ6:
          SCSI_Read6_Cmd(CBW.bLUN);
          break;
        case SCSI_READ12:
          SCSI_Read12_Cmd(CBW.bLUN);
          break;
        case SCSI_READ16:
          SCSI_Read16_Cmd(CBW.bLUN);
          break;
        case SCSI_READ_CAPACITY16:
          SCSI_READ_CAPACITY16_Cmd(CBW.bLUN);
          break;
        case SCSI_WRITE6:
          SCSI_Write6_Cmd(CBW.bLUN);
          break;
        case SCSI_WRITE12:
          SCSI_Write12_Cmd(CBW.bLUN);
          break;
        case SCSI_WRITE16:
          SCSI_Write16_Cmd(CBW.bLUN);
          break;
        case SCSI_VERIFY12:
          SCSI_Verify12_Cmd(CBW.bLUN);
          break;
        case SCSI_VERIFY16:
          SCSI_Verify16_Cmd(CBW.bLUN);
          break;

        default:
        {
          Bot_Abort(BOTH_DIR);
          Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND);
          Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
        }
      }
    }
  }
  else
  {
    /* Invalid CBW */
    Bot_Abort(BOTH_DIR);
    Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND);
    Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
  }
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-7 15:22:37 | 显示全部楼层
这个代码,我刚测试无问题的。
不知道是不是代码的问题,还是你卡的问题。

ALIENTEK MINISTM32 实验27 USB读卡器.rar

223.71 KB, 下载次数: 917

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-4-3
在线时间
4 小时
 楼主| 发表于 2013-4-8 10:04:33 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
谢谢原子,不是例程的问题,是我为了提高写SD卡速度,用了DMA,是DMA没有调好的原因,现在已经好了,使用DMA控制SPI传输写SD卡速度大约可提高20%
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-5-5
在线时间
2 小时
发表于 2013-6-27 21:55:23 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,您上面这个程序,我写进单片机。插上USB线怎么提示“无法识别的USB设备”呢?在我的电脑也没有新增盘符出现
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-28 10:09:53 | 显示全部楼层
是我们的开发板么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-22
在线时间
0 小时
发表于 2014-5-22 13:29:03 | 显示全部楼层
请问 USB读写SD卡   是怎么将SD卡的9个引脚和usb的4根引脚相连的?USB是作为一个host吧!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-22
在线时间
0 小时
发表于 2014-5-22 14:42:52 | 显示全部楼层
回复【13楼】Bin:
---------------------------------
急待回复!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 22:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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