你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教下,最近在折腾sd卡模拟u盘读写 ???

[复制链接]
hpdell 提问时间:2016-12-6 10:28 /
悬赏4ST金币未解决
本帖最后由 hpdell 于 2016-12-7 09:59 编辑

请教下,最近在折腾sd卡模拟u盘读写 ,设备管理器里面可以识别到 ,电脑磁盘盘符也可以识别到(不能够识别sd卡容量),但就是不能够读写,

设备管理器识别:
STM SDIO Flash USB Device.png

最下面的 STM SDIO Flash USB Device 就是使用sd卡模拟出来的,

程序会不停的进入 下面的两个函数 :
STORAGE_Init_HS();

还有 STORAGE_Read_HS();

这两个函数里面,请教下是什么情况啊 ???

识别到的sd卡容量是正确的

进入 STORAGE_GetCapacity() 这个函数里面,获取到的sd卡容量是正确的

这个函数识别 sd卡容量是正确的
/*******************************************************************************
* Function Name  : STORAGE_GetCapacity_HS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_GetCapacity_HS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  HAL_SD_Get_CardInfo(&hsd2, &SDCardInfo2);

  *block_num  = SDCardInfo2.CardCapacity/512;
  *block_size = STORAGE_BLK_SIZ;
  return (USBD_OK);
}



const int8_t  STORAGE_Inquirydata_HS[] = {/* 36 */

  /* LUN 0 */
  0x00,               
  0x80,               
  0x02,               
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,        
  0x00,
  'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */

  'S', 'D', 'I', 'O', ' ', 'F', 'l', 'a', /* Product      : 16 Bytes */

  's', 'h', ' ', ' ', ' ', ' ', ' ', ' ',

  '0', '.', '0' ,'1',                     /* Version      : 4 Bytes */
};




USBD_StorageTypeDef USBD_Storage_Interface_fops_HS =
{
  STORAGE_Init_HS,
  STORAGE_GetCapacity_HS,
  STORAGE_IsReady_HS,
  STORAGE_IsWriteProtected_HS,
  STORAGE_Read_HS,
  STORAGE_Write_HS,
  STORAGE_GetMaxLun_HS,
  (int8_t *)STORAGE_Inquirydata_HS,
};



int8_t STORAGE_Init_HS (uint8_t lun)
{
  /* USER CODE BEGIN 9 */
  static uint8_t i = 0;
  uint8_t res=0;
  res = BSP_SD_Init();
  if(res != 0)
  {
    printf("BSP SDIO Init Error \r\n");
    return USBD_FAIL;
  }
  printf("BSP SDIO Init HS OK  %d\r\n", i++);
  return res;    // (USBD_OK);
  /* USER CODE END 9 */
}




int8_t STORAGE_Read_HS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                       
                        uint16_t blk_len)
{

  uint16_t n;
        int8_t res=0;
  long long lsector = blk_addr;

      if(SDCardInfo2.CardType != STD_CAPACITY_SD_CARD_V1_1)
        lsector <<= 9;
      if( ((uint32_t )buf % 4) != 0)
      {
        for(n=0; n < blk_len; n++)
        {
          res = HAL_SD_ReadBlocks_DMA(&hsd2, (uint32_t *)sdio_buff, lsector + (512 * n), 512, 1);//通过DMA读取SD卡一个扇区

          if(res == 0)//读取成功
          {
              //等待读取完成
              res = HAL_SD_CheckReadOperation(&hsd2,(uint32_t)100000000);
          }         

          memcpy(buf,sdio_buff, 512);
          buf += 512;  
        }
      }
      else
      {

          res = HAL_SD_ReadBlocks_DMA(&hsd2, (uint32_t *)buf, lsector , 512, blk_len);//通过DMA读取SD卡一个扇区
          if(res == 0)//读取成功
          {
              //等待读取完成
             res = HAL_SD_CheckReadOperation(&hsd2,(uint32_t)100000000);
          }            
      }

        if(res)
        {
                USB_STATUS_REG|=0X08;//读错误!
        }
        return (USBD_StatusTypeDef)res;  

}



int8_t STORAGE_Write_HS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{

  uint16_t n;
        int8_t res=0;
  long long lsector = blk_addr;

  {

      if(SDCardInfo2.CardType != STD_CAPACITY_SD_CARD_V1_1)
        lsector <<= 9;
      if( ((uint32_t )buf % 4) != 0)
      {
        for(n=0; n < blk_len; n++)
        {

          memcpy(sdio_buff, buf, 512);
          res = HAL_SD_WriteBlocks_DMA(&hsd2, (uint32_t *)sdio_buff, lsector + (512 * n), 512, 1);//单个sector的写操作

          if(res == 0)//读取成功
          {
              //等待读取完成
              res = HAL_SD_CheckWriteOperation(&hsd2,(uint32_t)100000000);
          }         

          buf += 512;  
        }
      }
      else
      {

          res = HAL_SD_WriteBlocks_DMA(&hsd2, (uint32_t *)buf, lsector , 512, blk_len);//通过DMA读取SD卡一个扇区
          if(res == 0)//读取成功
          {
              //等待读取完成
              res = HAL_SD_CheckWriteOperation(&hsd2,(uint32_t)100000000);
          }              
      }
  }
        if(res)
        {
                USB_STATUS_REG |= 0X04;//写错误!         
        }
        return (USBD_StatusTypeDef)res;   
}




















<
收藏 1 评论29 发布时间:2016-12-6 10:28

举报

29个回答
adlu 回答时间:2016-12-6 11:29:01
这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢!
hpdell 回答时间:2016-12-6 12:19:04
adlu 发表于 2016-12-6 11:29
这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢 ...

好的好的,
jackten 回答时间:2016-12-6 13:26:00
谢谢分享                  
没事逛荡 回答时间:2016-12-6 14:01:48
STM32模拟成一个读卡器,读卡的操作看下有问题没。
不是很懂,帮顶。。。。
oktigerxia 回答时间:2016-12-7 14:39:42
我有USB读取SD卡(模拟U盘)例程,有需要留邮箱
hpdell 回答时间:2016-12-8 10:52:25
oktigerxia 发表于 2016-12-7 14:39
我有USB读取SD卡(模拟U盘)例程,有需要留邮箱

你好,这个我需要哟,我的 邮箱 : shewang131@163.com
hpdell 回答时间:2016-12-8 11:07:00
本帖最后由 hpdell 于 2016-12-8 11:08 编辑
没事逛荡 发表于 2016-12-6 14:01
STM32模拟成一个读卡器,读卡的操作看下有问题没。
不是很懂,帮顶。。。。 ...

你好,我现在的情况是

1、设备管理器.png


2、提示格式化.png


3、无法完成格式化.png


4、提示插入磁盘.png


貌似 吧sd卡模拟成u盘,操作时 函数没有关联一样
但是看程序貌似又是有关联的,所以现在就比较迷糊了

设备管理器里面能够识别到,说明usb通讯这块应该没有什么问题吧,




hpdell 回答时间:2016-12-9 09:27:56
adlu 发表于 2016-12-6 11:29
这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢 ...

你好,我的终于搞定了哟,是usb的速度配置高了,吧他配置为 12Mbps就可以了,我之前配置的是 480Mbps,

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

adlu 回答时间:2016-12-9 11:47:58
hpdell 发表于 2016-12-9 09:27
你好,我的终于搞定了哟,是usb的速度配置高了,吧他配置为 12Mbps就可以了,我之前配置的是 480Mbps, ...

你也是用CubeMX配置生成的MDK工程吗?
上传工程我看看,或者发我邮箱547068172@qq.com

我的是STM32F407平台,正点原子的开发板,USB速度配置没有错,是FS的。
识别出U盘了,但是电脑要求格式化,格式化完再用其他读卡器通过PC读的时候,又要求重新初始化。
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版