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

有谁使用Cube实现过USB读卡器功能?

[复制链接]
adlu 提问时间:2016-6-2 17:50 /
10ST金币
本帖最后由 adlu 于 2016-6-2 17:53 编辑

我使用的是STM32F407ZETx芯片,用Cube配置生成一个虚拟的U盘很容易就实现了。
配置完生成MDK工程后,直接编译下载运行,用USB线连接PC后,可以模拟出一个32M的U盘。
不过U盘没有实际的存储空间,也不能进行实际的读写操作,因为块读写函数直接 返回OK,没有进行任何实际操作。

要实现对板上的SD卡进行读写,即实现读卡器功能,就要实现usbd_storage_if.c文件中下面结构体指定的几个函数,
USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
  STORAGE_Init_FS,//初始化存储器
  STORAGE_GetCapacity_FS, // 获取存储器容量
  STORAGE_IsReady_FS, // 检测存储器是否就绪
  STORAGE_IsWriteProtected_FS, // 检测存储去是否写保护
  STORAGE_Read_FS, // 读块
  STORAGE_Write_FS, // 写块
  STORAGE_GetMaxLun_FS, // 获取可用卷数量
  (int8_t *)STORAGE_Inquirydata_FS, // 这是一个数据结构
};
从名称就可指定其用途。

但我把SD卡操作的代码写入相应函数后,没有实现正常的读卡器功能。
不知道怎么回事。
实现代码见续帖。

收藏 1 评论18 发布时间:2016-6-2 17:50

举报

18个回答
adlu 回答时间:2016-6-2 17:53:43
本帖最后由 adlu 于 2016-6-2 17:55 编辑

int8_t STORAGE_Init_FS (uint8_t lun)
{
  /* USER CODE BEGIN 2 */
   MX_SDIO_SD_Init();
  return (USBD_OK);
  /* USER CODE END 2 */
}

int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */   
  *block_num  = SDCardInfo.CardCapacity / STORAGE_BLK_SIZ;
  *block_size = STORAGE_BLK_SIZ;
  return (USBD_OK);
  /* USER CODE END 3 */
}



adlu 回答时间:2016-6-2 17:55:23
int8_t  STORAGE_IsReady_FS (uint8_t lun)
{
  /* USER CODE BEGIN 4 */
  static int8_t prev_status = 0;
  int8_t ret = -1;
  
    if(prev_status < 0)
    {
      MX_SDIO_SD_Init();
      prev_status = 0;
      
    }
    if(HAL_SD_GetStatus(&hsd) == SD_TRANSFER_OK)
    {
      ret = 0;
    }
  return ret;
//  return (USBD_OK);
  /* USER CODE END 4 */
}

int8_t  STORAGE_IsWriteProtected_FS (uint8_t lun)
{
  /* USER CODE BEGIN 5 */
  return (USBD_OK);
  /* USER CODE END 5 */
}


adlu 回答时间:2016-6-2 17:56:10
int8_t STORAGE_Read_FS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                       
                        uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
    int8_t res=0;
   res = HAL_SD_ReadBlocks_DMA(&hsd, (uint32_t *)buf,
                            (uint64_t)blk_addr*STORAGE_BLK_SIZ,
                            STORAGE_BLK_SIZ,
                            blk_len);
  return (res);
  /* USER CODE END 6 */
}

int8_t STORAGE_Write_FS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
    int8_t res=0;
   res = HAL_SD_WriteBlocks_DMA(&hsd, (uint32_t *)buf,
                                (uint64_t)blk_addr*STORAGE_BLK_SIZ,
                                STORAGE_BLK_SIZ,
                                blk_len);
  return (res);
  /* USER CODE END 7 */
}



int8_t STORAGE_GetMaxLun_FS (void)
{
  /* USER CODE BEGIN 8 */
  return (STORAGE_LUN_NBR - 1);
  /* USER CODE END 8 */
}


yfy123 回答时间:2016-6-3 10:32:00
路过看看
xl麻烦 回答时间:2016-6-4 09:32:09
大神,膝盖拿走
adlu 回答时间:2016-6-4 10:42:44
xl麻烦 发表于 2016-6-4 09:32
大神,膝盖拿走

问题我没有解决,收回你的膝盖

等待大神解决
adlu 回答时间:2016-6-4 10:46:08
发布了初步成果。只完成了一个100KB的模拟U盘程序,没有实现SD读卡器功能。

无薪税绵 回答时间:2017-3-6 08:30:03
这涉及到FAT表的操作了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ddllxxrr 回答时间:2017-3-6 09:14:41
SD卡写入时得用相应的中断,请问SD卡中断楼主设了么????

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

胤幻1988 回答时间:2017-3-6 10:16:07
建议看原子407板子的例子,有这个读卡器例子!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

五哥1 回答时间:2017-3-6 11:02:11
看看原子的429的HAL库的例子,有SD卡的例子。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

cldym 回答时间:2017-3-6 14:20:08
路过看看
流畅的笔记 回答时间:2017-9-18 19:20:21
32G TF  MSC 实验  也遇到了这种问题    不知道 什么原因
斜阳 回答时间:2017-9-21 12:54:25
路过                     
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版