硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6049|回复: 10
收起左侧

[有问必答] 请教下,最近在折腾sd卡模拟u盘读写  ??

[复制链接]

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2016-12-6 10:15:33 | 显示全部楼层 |阅读模式
请教下,最近在折腾sd卡模拟u盘读写 ,设备管理器里面可以识别到 ,电脑磁盘盘符也可以识别到(不能够识别sd卡容量),但就是不能够读写,



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



最下面的 STM SDIO Flash USB Device 就是使用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_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万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-6 15:28:41 | 显示全部楼层
你现在用的是HAL库,如果是标准库的话,可以使用我给FreeRTOS配套的例子,已经做的比较好用了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=17658
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2016-12-6 16:58:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:你现在用的是HAL库,如果是标准库的话,可以使用我给FreeRTOS配套的例子,已经做的比较好用了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=17658 (2016-12-06 15:28) 
好的,可以参考一下,多谢多谢了啊
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2016-12-7 09:55:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:你现在用的是HAL库,如果是标准库的话,可以使用我给FreeRTOS配套的例子,已经做的比较好用了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=17658 (2016-12-06 15:28) 
你好,现在 程序 会不停的进入

STORAGE_Init();

还有 STORAGE_Read();

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

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

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

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-7 14:57:50 | 显示全部楼层

回 hpdell 的帖子

hpdell:你好,现在 程序 会不停的进入

STORAGE_Init();

....... (2016-12-07 09:55) 
初始阶段会一直读取STORAGE_Read,后面应该就不会了。
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2016-12-8 10:46:45 | 显示全部楼层

回 eric2013 的帖子

eric2013:

初始阶段会一直读取STORAGE_Read,后面应该就不会了。
你好,我现在的程序 还是 会 不停的 进入下面这两个函数中,

STORAGE_Init();

还有 STORAGE_Read();

是什么情况才会不停的进入啊 》》?》?

提示图片顺序如下:
1、设备管理器.png


2、提示格式化.png


3、无法完成格式化.png


4、提示插入磁盘.png
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2016-12-9 09:25:50 | 显示全部楼层
终于搞定了,原来是usb的速度配置错了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2017-8-28 18:52:25 | 显示全部楼层
您好,我最近也在用cubemx做这个实验  也遇到无法格式化打不开磁盘的问题  请问你说的速度不对具体是啥
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2017-8-29 09:59:52 | 显示全部楼层

回 wansaiyon 的帖子

wansaiyon:您好,我最近也在用cubemx做这个实验  也遇到无法格式化打不开磁盘的问题  请问你说的速度不对具体是啥 (2017-08-28 18:52) 
需要把 usb 的高速模式 降为 全速模式就可以了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-8-30 01:02:49 | 显示全部楼层

回 hpdell 的帖子

hpdell:需要把 usb 的高速模式 降为 全速模式就可以了 (2017-08-29 09:59) 
我记得你发了个GT911的帖子,找不到了,好奇怪,还打算回复下呢。
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2017-8-30 10:04:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:我记得你发了个GT911的帖子,找不到了,好奇怪,还打算回复下呢。 (2017-08-30 01:02) 
你好,那个帖子我删除了,问题找到了,是我的 i2c 读写函数有问题,

不过现在有新的问题出现了,帮忙看看啊,帖子 刚刚发的, https://forum.anfulai.cn/forum.p ... =35921&ds=1
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 06:55 , Processed in 0.046954 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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