社区导航

 

搜索
查看: 1071|回复: 1

[其他] 【提问】Sensor Tile 模拟U盘 问题

[复制链接]

95

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-9 17:14 | 显示全部楼层 |阅读模式
本帖最后由 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  下面配置好了。

Pin out 设置

Pin out 设置


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

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

添加SD卡驱动

添加SD卡驱动


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)


回复

使用道具 举报

7361

TA的帖子

19

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-12 08:11 来自手机 | 显示全部楼层
找找stm32 usb存储的官方例程先看下


回复

使用道具 举报

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

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-12 01:54 , Processed in 0.103719 second(s), 23 queries , Gzip On, MemCache On.

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