2401|1

83

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【提问】Sensor Tile 模拟U盘 问题 [复制链接]

  本帖最后由 wbhb2011 于 2018-5-9 17:15 编辑

    Sensor Tile 的小扩展板带SD卡,是个不错的“数据黑盒”。于是想把它模拟成U盘,方便在取数据的时候,只要接USB线到电脑,就可以Copy出来了。理论上是可以的,USB Mass storage + SPI接口 SD卡,存数据的时候,用Fatfs 创建文件夹和文件等。
在想实现 USB Mass storage 的时候,在usbd_storage_if.c 的几个实例化函数里面遇到了问题。貌似 官方给的SD卡驱动:...\Drivers\BSP\SensorTile\SensorTile_sd.c  不适合在这个里面实例化。但是在Fatfs 的实例化函数sd_diskio.c 里面可以用。

1、STMCubeMX 创建工程:

  • Pinout
  1.   
  2. RCC
  3.             
  4. Crystal/Ceramic  Resonator
  5.   
  6.   
  7. USB_OTG_FS
  8.             
  9. Mode:Device_Only
  10.   
  11.   
  12. USB_DEVICE
  13.             
  14. Class  For Fs IP: Mass Storage Class
  15.   
  16.   
  17. SPI3
  18.             
  19. Mode:Full-Duplex  Master
复制代码


    SPI接口 照着Sensor Tile的原理图修改一下 pin脚。其实SPI 这里不设置也可以,...\Drivers\BSP\SensorTile\SensorTile.c 这个驱动下面已经包含。

    配置方面基本不需要配置,SPI 的基本配置和 DMA NVIC都是在SensorTile.c  下面配置好了。


2、生成工程时,修改堆栈大小,我都改成0x1000 ;
3、生成后 直接编译,下载到板子里面,插到电脑,应该是可以看到电脑有弹出U盘的情况。显示要格式化,但是因为没有接口函数,所以无法格式化。

4、添加接口函数,我准备就用 ...\Drivers\BSP\SensorTile\SensorTile_sd.c 的驱动。工程中添加这个函数:


5 修改usbd_storage_if.c 的接口函数:STORAGE_Init_FS ; STORAGE_GetCapacity_FS ; STORAGE_Read_FS; STORAGE_Write_FS ;
初始化函数
  1. int8_t STORAGE_Init_FS (uint8_t lun)
  2. {
  3.   /* USER CODE BEGIN 2 */
  4.         if(BSP_SD_Init() == MSD_OK)
  5.   return (USBD_OK);
  6.         else
  7.         return (USBD_FAIL);
  8.   /* USER CODE END 2 */
  9. }
复制代码



获取描述函数
  1. int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
  2. {
  3.   /* USER CODE BEGIN 3 */   
  4.         SD_CardInfo info;

  5.         BSP_SD_GetCardInfo(&info);
  6.   *block_num  = (info.CardCapacity)/STORAGE_BLK_SIZ - 1;
  7.         //*block_num  = STORAGE_BLK_NBR;
  8.   *block_size = STORAGE_BLK_SIZ;

  9.   return (USBD_OK);
  10.   /* USER CODE END 3 */
  11. }
复制代码



读取函数:
  1. int8_t STORAGE_Read_FS (uint8_t lun,
  2.                         uint8_t *buf,
  3.                         uint32_t blk_addr,                       
  4.                         uint16_t blk_len)
  5. {
  6.   /* USER CODE BEGIN 6 */
  7.         if(BSP_SD_ReadBlocks((uint32_t *)buf,(uint64_t)(blk_addr), STORAGE_BLK_SIZ, blk_len) !=MSD_OK)
  8.         {
  9.                 return USBD_FAIL;
  10.         }
  11.   return USBD_OK;
  12.   /* USER CODE END 6 */
  13. }
复制代码



写入函数
  1. int8_t STORAGE_Write_FS (uint8_t lun,
  2.                          uint8_t *buf,
  3.                          uint32_t blk_addr,
  4.                          uint16_t blk_len)
  5. {
  6.   /* USER CODE BEGIN 7 */
  7.         if(BSP_SD_WriteBlocks((uint32_t *)buf,(uint64_t)(blk_addr), STORAGE_BLK_SIZ, blk_len) !=MSD_OK)
  8.         {
  9.                 return (USBD_FAIL);
  10.         }
  11.   return (USBD_OK);
复制代码



6、 按道理 编译下载后, USB接入电脑应该有 U盘 待格式化,格式化成功后,就可以用了。但是我插到电脑后 无法格式化。

贴出代码,有了解的 帮忙看一下。
在用L496 的开发板,是成功验证过的,但是那个有官方的bsp_driver_sd驱动,且是SDMMC接口的 HAL库应该是官方验证过的。这个我就不知道官方是不是只验证了 能用fatfs ,没验证能不能模拟U盘。


Sensor_log.rar (13.85 MB, 下载次数: 0) Sensor_log.rar (13.85 MB, 下载次数: 0)







最新回复

找找stm32 usb存储的官方例程先看下  详情 回复 发表于 2018-5-12 08:11
点赞 关注(1)
 

回复
举报

9790

帖子

24

TA的资源

版主

沙发
 
找找stm32 usb存储的官方例程先看下
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表