0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在i.MX RT1050上如何实现双大容量存储(MSC)设备

jf_pJlTbmA9 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2023-10-30 17:08 次阅读

客户需求

昨天FAE同事报了一个客户需求过来,需要双大容量存储设备(MSC device),一个安装在SD卡上,另一个安装到SDRAM上面。

初步分析

赶紧用MCUXpresso的peripheral tool去试了一下,结果发现这个工具不支持MSC mount on SD card,只支持MSC mount on RAM, 这样就只能手动去做了。

先看看MSC的描述符结构,非常简单直观,妥妥的钢铁直男。一个interface,两个endpoint,结束。

wKgaomUD39uAR6O6AAB40WgIfAg916.png

所以,双MSC的配置描述符就是:

wKgaomUD392AShKAAACx1tvrr60947.png

然后,结合客户需求,最简单的方法就是在MSC mount on SD card上面加一个MSC mount on RAM。SDRAM和RAM对MSC的实现基本没有区别,只是一个buffer块地址不同而已。

操作步骤

接下来我们做两件事:

1、用peripheral tool导入一个dual MSC的工程,这个工具导出的代码结构非常清晰,可以帮助我们了解如何做复合设备类。

2、导入SDK自带的MSC mount on SD card+ CDC的工程:

evkbimxrt1050_dev_composite_cdc_msc_disk_freertos

然后要做的事情就是把MSC mount on RAM的代码集成到MSC mount on SD card+ CDC的工程的工程里面去,同时去掉里面的CDC。

需要的步骤我能想到的就是:

1、去掉MSC mount on SD card+ CDC工程里面的CDC。

2、集成MSC mount on RAM的代码。

3、集成描述符。

4、集成数据结构。

好了,下面一步一步做来试试。

做之前,先把原始代码做个备份,然后通过Beyond Compare可以看到相关的改动,这个非常重要。

代码改动

代码变动如下,更多细节请参考附件代码:

删除virtual_com.c, virtual_com.h

增加 usb_device_interface_0_msc_ram_disk.c

更改usb_device_descriptor.h

增加MSC(RAM)的相关宏定义。

更改USB_INTERFACE_COUNT为2,之前是3个接口,现在是两个。

更改USB_MSC_DISK_INTERFACE_INDEX为1,之前为2。MSC(RAM)的index为0。

更改USB_MSC_DISK_BULK_IN_ENDPOINT为2,之前为1。MSC(RAM)使用端点1 IN,端点1 OUT。MSC(SD CARD) 使用端点2 IN,端点2 OUT。

删掉CDC的相关定义

更改usb_device_descriptor.c

添加MSC(RAM)的数据结构,这些数据结构有点复杂。不过我们只需要知道他们用于维护相关的接口和端点就可以了:
A. g_UsbDeviceInterface0MscRamDiskConfig
B. g_UsbDeviceInterface0MscRamDiskInterfaceList
C. g_UsbDeviceInterface0MscRamDiskInterfaces
D.g_UsbDeviceInterface0MscRamDiskInterface
E.g_UsbDeviceInterface0MscRamDiskSetting0DefaultEndpoints

去掉CDC接口/端点描述符。

增加MSC(RAM)接口/端点描述符。

更新USB_DeviceSetSpeed()的相关内容。

usb_device_config.h

更改USB_DEVICE_CONFIG_CDC_ACM为0。

更改USB_DEVICE_CONFIG_MSC为2。

检查USB_DEVICE_CONFIG_ENDPOINTS是否满足需求,默认为5。

composite.h

去掉 #include "virtual_com.h"。

更改usb_device_composite_struct_t数据类型:
A. 去掉usb_cdc_vcom_struct_t cdcVcom
B. 增加class_handle_t interface0MscRamDiskHandle; 。

composite.c

更改g_CompositeClassConfig,去掉CDC,加入MSC(RAM) 。

增加USB_UpdateInterfaceSetting()函数。

修改USB_DeviceCallback(),对以下事件加入对MSC(RAM)的处理,去掉对CDC的处理:
A. kUSB_DeviceEventBusReset
B. kUSB_DeviceEventSetConfiguration
C.kUSB_DeviceEventSetInterface

修改USB_DeviceApplicationInit()加入对MSC(RAM)的处理,去掉对CDC的处理。

更改APPTask(),去掉对CDC的处理。

最后,要把MSC(RAM)的分区放到SDRAM上面,只需要更改usb_device_interface_0_msc_ram_disk.c里面的storageDisk指针指向SDRAM空间即可。默认的MCUXpresso的USB示例工程没有使能SDRAM RAM。使能SDRAM需要更改一下配置:

wKgZomUD396AIqtMAAL9Upadexs365.png

完成上述改动后,编译代码,再下载到目标板运行,可以看到:

wKgZomUD3-CATfMQAACfHdAVT90907.png

这样我们就得到了两个MSC,一个mount on SDRAM,一个mount on SD卡。

代码链接

https://gitee.com/nxa16038/dual_msc.git

附录:使用Peripheral tool导入

基于MCUXpresso IDE 环境,我们可以很轻易的生成双MSC mount on RAM的代码,步骤如下(以下步骤是在MCUXPresso 11.6版本上操作的)。

1. 导入SDK后,选择new project

wKgaomUD3-eAUR8HAAFi9giTIns967.png

2. 点击“Next”:

wKgaomUD3-mAePRgAAI9GL9ssXQ535.png

3. 转到middleware页面,选择USB Device MSD。

wKgZomUD3-yAXnLPAAI9-W2K-dM457.png

4. 然后点finish就好了。

5. 然后点击下图所示的按钮打开MCUXpresso内置的peripheral tool界面

wKgaomUD3-6AT-eYAAAj9tWm1-8741.png

6. 如果有多个工程,打开后什么都看不到需要选择对应的工程,这里我们选择刚建立的工程MIMXRT1052_Project。

wKgZomUD3--AQ2ngAAGHje4iKIk951.png

7. 然后点击Middleware右方的+号。

wKgaomUD3_CANH6vAAETGkXeQXE416.png

8. 最后选USB,点击OK。

wKgaomUD3_KAXq_TAAI7nmb_yGA471.png

9. 然后Preset里面,选择MSC RAM disk。

wKgZomUD3_SAXoHPAAIo3nGfIJI601.png

10. 然后会看到一个错误提示:

wKgaomUD3_WAb4lLAAD0CC6uB0M483.png
wKgZomUD3_aAMaWdAABdVLnLhA8672.png

11. 在错误信息上点右键,选择时钟使能。

wKgaomUD3_mATBAKAADPwO_pVWo036.png

12. 由于默认只有一个MSC,我们需要再增加一个,点下图的+号

wKgZomUD3_uATs76AACfBaFuR_0029.png

13. 默认添加的是DFU,我们需要切换到MSC

wKgaomUD3_2AS2spAAEOOwyJfs0118.png

14. 这样两个MSC就做好了。

wKgZomUD3_6AWa2CAADoyDhpF_M042.png

15. 然后更新代码

wKgZomUD3_-AQUv3AAAqXyOEIlA891.jpg

16. 点击OK

wKgaomUD4ACAQGnvAAHM_iTKxmQ731.png

17. 然后IDE回到开发模式我们可以看到code已经生成好了。

wKgZomUD4AKABJVqAAGAc2KpML8519.png

18. 然后build and run,就可以直接运行,得到两个MSC on RAM。

wKgaomUD4ASALHUeAACiCOlwazU106.png

来源:恩智浦MCU加油站

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SDRAM
    +关注

    关注

    7

    文章

    423

    浏览量

    55205
  • 存储
    +关注

    关注

    13

    文章

    4298

    浏览量

    85807
  • SD卡
    +关注

    关注

    2

    文章

    564

    浏览量

    63890
收藏 人收藏

    评论

    相关推荐

    深入浅出Cortex-M7——i.MX RT1050

    深入浅出Cortex-M7——i.MX RT1050
    发表于 03-06 08:39

    【大联大品佳 NXP i.MX RT1050试用申请】语音识别评测

    最后得到通知因为疫情这个比赛取消了。恰好现在借着这个活动申请NXP i.MX RT1050这个板子来试用评估。自己曾经B站上分享过的语音识小Demo链接基于stm32f769i-di
    发表于 08-10 17:59

    【大联大品佳 NXP i.MX RT1050试用申请】基于 NXP i.MX RT1050工业机器人开发

    项目名称:基于 NXP i.MX RT1050工业机器人开发试用计划:1,熟悉板子硬件,RT1050驱动板子硬件,做GPIO测试,串口测试,SPI测试,IIC测试,PWM测试,每种出一片报告。2
    发表于 08-10 18:23

    【大联大品佳 NXP i.MX RT1050试用申请】i.MX RT1050 3D打印机控制器

    项目名称:i.MX RT1050 3D打印机控制器试用计划:申请理由本人在开源硬件行业有五年多的学习和开发经验,曾设计多款FDM,SLA,LCD 3D打印机控制板,参与公司3D打印机的开发,对打
    发表于 08-10 18:23

    【大联大品佳 NXP i.MX RT1050试用申请】使用NXP i.MX RT1050开发板设计一款低成本CAN数据采集仪

    项目名称:使用NXP i.MX RT1050开发板设计一款低成本CAN数据采集仪试用计划:目前的CAN数据采集仪通常使用的是CAN采集仪+上位机的方法,这种方案非常不便捷,需要带电脑到现场去作业
    发表于 08-10 18:24

    【大联大品佳 NXP i.MX RT1050试用体验】芯林至尊,宝刀RT1050,初识i.MX RT系列跨界处理器 (之一)

    的图看看RT1050的内核架构图i.MX RT1050EVK开发板下面介绍下软件图形化配置工具:MCUXpresso Config Tools百度云链接https://pan.baidu.com/s
    发表于 08-19 11:44

    i.MX RT1050平台的相关资料推荐

    的首款跨界处理器。该处理器具备应用处理器的高性能与高度集成的优势,更具有微控制器的易用性和实时功能。NXP Semiconductors(恩智浦半导体)公司根据用户成本需求, i.MX RT1050 处理器的价格
    发表于 11-29 07:19

    i.MX RT1050的功耗和测量资料分享

    i.MX RT1050的功耗和测量
    发表于 12-12 07:23

    i.MX RT1050跨界处理器产品数据手册

    i.MX RT1050跨界处理器(消费级)数据手册
    发表于 12-12 07:03

    i.MX RT系列(例如 RT1050/1060)有多少个PWM通道?

    i.MX RT 系列(例如 RT1050/1060)有多少个 PWM 通道? 我可以像在 KV58 MCU(两个 flexPWM 模块)做同样的事情吗?
    发表于 05-18 07:07

    【044】SylixOS 正式支持 i.MX RT1050平台

    的首款跨界处理器。该处理器具备应用处理器的高性能与高度集成的优势,更具有微控制器的易用性和实时功能。NXP Semiconductors(恩智浦半导体)公司根据用户成本需求, i.MX RT1050 处理器的价格
    发表于 11-19 12:51 14次下载
    【044】SylixOS 正式支持 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b>平台

    RT-Thread & NXP 发布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界处理器系列。该系列下又包括 i.MX RT1020、i.MX
    发表于 12-07 13:06 2次下载
    <b class='flag-5'>RT</b>-Thread & NXP 发布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    移植Arm-2D到i.MX RT1050-EVKB并绘制图形界面

    众所周知,i.MX RT系列是MCU中的性能强者,超高的主频、丰富的外设以及足够大的存储使其能轻松应用于各类领域。其中,图像视频方面,i.MX
    的头像 发表于 06-23 09:33 2190次阅读

    移植Arm-2D到i.MX RT1050-EVKB并绘制图形界面

    众所周知,i.MX RT系列是MCU中的性能强者,超高的主频、丰富的外设以及足够大的存储使其能轻松应用于各类领域。其中,图像视频方面,i.MX
    的头像 发表于 07-12 10:05 1874次阅读

    基于 NXP i.MX RT1050 的 3D 打印机方案

    MCU-Healer 是基于 NXP i.MX RT1050 做的 3D 打印机方案,该方案主控 MCU i.MX RT1050是一颗 Cortex-M7 内核的高性能 MCU,主频达
    的头像 发表于 04-06 15:06 1200次阅读
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b> 的 3D 打印机方案