OpenEdv-开源电子网

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

STM32的USB读卡器试验读写SD卡的问题

[复制链接]

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
发表于 2013-12-25 18:02:52 | 显示全部楼层 |阅读模式
现在已经可以成功识别开发板为U盘了如果插上SD卡在“我的电脑”中出现了一个可移动磁盘的盘符,但是磁盘无法打开,用鼠标左击显示:请将磁盘插入驱动 器。而且反应比较慢,右击也反应慢且菜单弹出来瞬间消失,如果不插SD卡PC机能识别有移动设备,但是“我的电脑”中不出现盘符,请教一下各位这是怎么回 事,为什么无法打开?我的SD卡是金士顿1G的,FAT32格式可以直接插在计算机上使用!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-25 20:56:51 | 显示全部楼层
换个卡试试吧。
你用的不是TF卡吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2013-12-25 21:23:13 | 显示全部楼层
我用的不是TF卡是那种大的SD卡,我写的FATFS文件系统在STM32上读写SD卡的程序很正常,写的内容在PC机上也可以查看,请教原子会不会是程序的问题?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-25 21:41:57 | 显示全部楼层
回复【3楼】csf4824521:
---------------------------------
你现在是用我们原版代码,还是修改后的代码?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2013-12-25 23:56:50 | 显示全部楼层
我用的修改的代码,因为项目需要,所以用的是另外一套开发板
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2013-12-25 23:58:57 | 显示全部楼层
我换了一个卡试过还是不行,不知道原子又没有什么思路可能会是那些代码出现的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-26 00:27:27 | 显示全部楼层
怀疑是你底层接口没做好。
USB读卡器完全不需要FATFS也可以实现的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2013-12-26 11:02:20 | 显示全部楼层
PC机可以识别开发板为USB设备的话USB部分应该没有问题吧,不知道是不是SD的初始化的问题,请原子帮我看看,万分感谢

u8 MSD_Init(void)
{
  u32 i = 0;

  /* Initialize SPI2 */
  SPI_Config();
  /* MSD chip select high */
  MSD_CS_HIGH();
  /* Send dummy byte 0xFF, 10 times with CS high*/
  /* rise CS and MOSI for 80 clocks cycles */
  for (i = 0; i <= 9; i++)
  {
    /* Send dummy byte 0xFF */
    MSD_WriteByte(DUMMY);
  }
  /*------------Put MSD in SPI mode--------------*/
  /* MSD initialized and set to SPI mode properly */
  return (MSD_GoIdleState());
}

void MSD_WriteByte(u8 Data)
{
  /* Wait until the transmit buffer is empty */
  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);
  /* Send the byte */
  SPI_SendData(SPI1, Data);
}

FlagStatus SPI_GetFlagStatus(SPI_TypeDef* SPIx, u16 SPI_FLAG)
{
  FlagStatus bitstatus = RESET;

  /* Check the parameters */
  assert_param(IS_SPI_GET_FLAG(SPI_FLAG));

  /* Check the status of the specified SPI flag */
  if ((SPIx->SR & SPI_FLAG) != (u16)RESET)
  {
    /* SPI_FLAG is set */
    bitstatus = SET;
  }
  else
  {
    /* SPI_FLAG is reset */
    bitstatus = RESET;
  }
  /* Return the SPI_FLAG status */
  return  bitstatus;
}

void SPI_SendData(SPI_TypeDef* SPIx, u16 Data)
{
  /* Write in the DR register the data to be sent */
  SPIx->DR = Data;
}

u8 MSD_GoIdleState(void)
{
  /* MSD chip select low */
  MSD_CS_LOW();
  /* Send CMD0 (GO_IDLE_STATE) to put MSD in SPI mode */
  MSD_SendCmd(MSD_GO_IDLE_STATE, 0, 0x95);

  /* Wait for In Idle State Response (R1 Format) equal to 0x01 */
  if (MSD_GetResponse(MSD_IN_IDLE_STATE))
  {
    /* No Idle State Response: return response failue */
    return MSD_RESPONSE_FAILURE;
  }
  /*----------Activates the card initialization process-----------*/
  do
  {
    /* MSD chip select high */
    MSD_CS_HIGH();
    /* Send Dummy byte 0xFF */
    MSD_WriteByte(DUMMY);

    /* MSD chip select low */
    MSD_CS_LOW();

    /* Send CMD1 (Activates the card process) until response equal to 0x0 */
    MSD_SendCmd(MSD_SEND_OP_COND, 0, 0xFF);
    /* Wait for no error Response (R1 Format) equal to 0x00 */
  }
  while (MSD_GetResponse(MSD_RESPONSE_NO_ERROR));

  /* MSD chip select high */
  MSD_CS_HIGH();
  /* Send dummy byte 0xFF */
  MSD_WriteByte(DUMMY);

  return MSD_RESPONSE_NO_ERROR;
}
回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2013-12-26 11:12:14 | 显示全部楼层
还有就是读出可移动磁盘后查看磁盘属性,文件系统显示是RAW的,已用空间和可用空间都是0,在网上搜索了一下有个小哥和我出现的问题一模一样而且他还解决了,可惜只是很牛的说了句解决了也没说怎么解决的
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-1-30
在线时间
0 小时
发表于 2015-3-9 17:43:30 | 显示全部楼层
为什么MiniSTM32只能用SPI模式读写SD卡
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-9 22:37:17 | 显示全部楼层
回复【10楼】feng92:
---------------------------------
因为我们的接口就是SPI的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-9-4
在线时间
0 小时
发表于 2015-4-5 18:03:59 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,探索者的SD卡不是SDIO的接口么?我看程序里SD卡接口都是SDIO的,为啥我用也是出现这个问题。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-5 22:53:18 | 显示全部楼层
回复【12楼】傲娇的放牛娃:
---------------------------------
对,探索者的是SDIO即可。
如果探索者还出这个问题,建议你换卡试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2014-2-18
在线时间
12 小时
发表于 2015-6-16 17:21:49 | 显示全部楼层
问题解决了吗?我的也出现这个问题····PC机上可以出现盘符,点击属性查看,为‘0’,双击‘打开’,反应很慢,出现提示:“无法访问,函数不正确”。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-9-23
在线时间
1 小时
发表于 2015-9-23 20:11:51 | 显示全部楼层
回复【14楼】hugo01chen:
---------------------------------
你好,请问你遇到的问题(双击‘打开’,反应很慢,出现提示:“无法访问,函数不正确”)解决了么?最近我移植的STM32 USB驱动也遇到了相同的问题,单步调试也没有找出问题原因。无法进入“case BOT_DATA_IN”始终退出。
void Mass_Storage_In (void)
{
USB_STATUS_REG|=0X10;//±ê?????ˉ
switch (Bot_State)
{
case BOT_CSW_Send:
case BOT_ERROR:
Bot_State = BOT_IDLE;
SetEPRxStatus(ENDP2, EP_RX_VALID);/* enable the Endpoint to recive the next cmd*/
break;
case BOT_DATA_IN:  //
switch (CBW.CB[0])
{
case SCSI_READ10:
USB_STATUS_REG|=0X02;//±ê???y?ú?áêy?Y
SCSI_Read10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
break;
}
break;
case BOT_DATA_IN_LAST:
Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);
SetEPRxStatus(ENDP2, EP_RX_VALID);
break;

default:
break;
}
}
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-9-23
在线时间
1 小时
发表于 2015-9-26 21:25:44 | 显示全部楼层
回复【15楼】椿笙:
---------------------------------
问题已解决,单步追踪了下,忘了一段代码
u16 MAL_GetStatus (u8 lun)
{
 if(SD_Init()==MAL_OK)
 {
 SD_GetTotalSec();
 switch(lun)
{
case 0:
{
Mass_Memory_Size[0]=(long long)SD_GetTotalSec()*512;
Mass_Block_Size[0] =512;
Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0];
}
return MAL_OK;
case 1:
return MAL_OK;
default:
return MAL_FAIL;
}
 }
 else
 return MAL_FAIL;

}
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-4-6
在线时间
12 小时
发表于 2016-9-7 08:38:48 | 显示全部楼层
前些天我也遇到这个问题了,是SPI驱动有问题,改了SPI驱动就搞定了
回复 支持 反对

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2016-9-29 15:30:26 | 显示全部楼层
iioo502 发表于 2016-9-7 08:38
前些天我也遇到这个问题了,是SPI驱动有问题,改了SPI驱动就搞定了

我也遇到了这个问题,不过我觉得我的spi的驱动是好的,因为我使用这个驱动来往spi中写数据,然后将数据读取出来,是没有问题的。应该还有其他的问题导致吧,因为论坛上挺多友人出现这个问题的,可否将代码上传呢?
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-4-6
在线时间
12 小时
发表于 2016-10-10 12:06:05 | 显示全部楼层
我是520老谢 发表于 2016-9-29 15:30
我也遇到了这个问题,不过我觉得我的spi的驱动是好的,因为我使用这个驱动来往spi中写数据,然后将数据读 ...

现在又出其他问题了,正在排错中,等搞定了一定将源码发出来,嘿嘿。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 02:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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