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

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

3天内不再提示

SDRAM和RAM对MSC的实现

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-08-18 14:42 次阅读

客户需求

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

初步分析

赶紧用MCUXpresso的peripheral tool去试了一下,结果发现这个工具不支持MSC mount on SD card,只支持MSC mount on RAM, 这样就只能手动去做了。 先看看MSC的描述符结构,非常简单直观,妥妥的钢铁直男。一个interface,两个endpoint,结束。

b9a8bc74-1eaa-11ed-ba43-dac502259ad0.png

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

b9b53ef4-1eaa-11ed-ba43-dac502259ad0.png

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

操作步骤

接下来我们做两件事:

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

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

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

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

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

集成MSC mount on RAM的代码。

集成描述符。

集成数据结构。

好了,下面一步一步做来试试。 做之前,先把原始代码做个备份,然后通过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需要更改一下配置:

b9d02dc2-1eaa-11ed-ba43-dac502259ad0.png

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

b9f7dde0-1eaa-11ed-ba43-dac502259ad0.png

这样我们就得到了两个MSC,一个mounton 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

ba0bdcb4-1eaa-11ed-ba43-dac502259ad0.png 2. 点击“Next”: ba1d6f9c-1eaa-11ed-ba43-dac502259ad0.png

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

ba49063e-1eaa-11ed-ba43-dac502259ad0.png

4. 然后点finish就好了。

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

ba620666-1eaa-11ed-ba43-dac502259ad0.png

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

ba70e21c-1eaa-11ed-ba43-dac502259ad0.png

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

ba860e1c-1eaa-11ed-ba43-dac502259ad0.png

8. 最后选USB,点击OK。

ba96aeca-1eaa-11ed-ba43-dac502259ad0.png

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

baaa842c-1eaa-11ed-ba43-dac502259ad0.png

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

bad56f2a-1eaa-11ed-ba43-dac502259ad0.png

baf308aa-1eaa-11ed-ba43-dac502259ad0.png

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

bb0730d2-1eaa-11ed-ba43-dac502259ad0.png

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

bb16879e-1eaa-11ed-ba43-dac502259ad0.png

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

bb31eef8-1eaa-11ed-ba43-dac502259ad0.png

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

bb478b82-1eaa-11ed-ba43-dac502259ad0.png

15. 然后更新代码

bb64dc1e-1eaa-11ed-ba43-dac502259ad0.png

16. 点击OK

bb7f9d9c-1eaa-11ed-ba43-dac502259ad0.png

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

bba9b5b4-1eaa-11ed-ba43-dac502259ad0.png

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

bbcd40f6-1eaa-11ed-ba43-dac502259ad0.png

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

    关注

    7

    文章

    423

    浏览量

    55202
  • msc
    msc
    +关注

    关注

    0

    文章

    29

    浏览量

    20120
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1368

    浏览量

    114638
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68516

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

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    VHDL工具实现SDRAM控制器的要点分享

    在高速实时或者非实时信号处理系统当中,使用大容量存储器实现数据缓存是一个必不可少的环节,也是系统实现中的重点和难点之一。SDRAM(同步动态随机访问存储器)具有价格低廉、密度高、数据读写速度快的优点
    的头像 发表于 01-18 07:21 8241次阅读
    VHDL工具<b class='flag-5'>实现</b><b class='flag-5'>SDRAM</b>控制器的要点分享

    SDRAM与双口RAM数据转移接口控制电路

    控制;(5)DRAM为16位数据总线,RAM为32位数据总线,SDRAM进行一次突发操作,RAM进行一次读写操作,以实现速度匹配;(6)DRAM和R
    发表于 06-10 05:00

    ARM里的ramSDRAM有什么区别?

    本篇文章英尚微电子存储芯片供应商主要详细介绍下ARM里的ramSDRAM有什么区别,首先介绍了ramSDRAM做了详细阐述,最后介绍了两者的区别。
    发表于 04-02 06:46

    如何去实现外部RAM扩展接口呢

    使用并行SRAM或者SDRAM实现ram扩展。有些IO口较多的MCU有专用的接口如FSMC来连接SDRAM或并行psram,但会占用过多的管脚资源和PCB面积。面向IoT领域的IPU
    发表于 11-24 06:50

    RAM与SRAM及其SDRAM都有哪些不同呢

    1、RAM(random access memory):(都属于易失性存储器)SRAM:静态随机存储器,6个晶体管存储一位数据,功耗大,面积大DRAM:动态随机存储器,一个晶体管和一个电容存储一位数
    发表于 12-17 06:35

    ARM里的ramSDRAM有什么区别

    的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将ram集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少ram集成块占用的空间。SDRAM介绍
    发表于 10-25 15:08

    如何提高evkmimxrt1170_dev_msc_disk_bm_cm7示例的传输速度?

    到内部 RAM 或外部 SDRAM 的程序,因此我们可以检查闪存 XIP 与 SDRAM/内部 RAM 的性能。我们已经找到了很多帖子,但无法设法使示例引导形式闪存,然后从
    发表于 06-08 09:07

    使用Verilog实现基于FPGA的SDRAM控制器

    摘 要:介绍了SDRAM的特点和工作原理,提出了一种基于FPGA的SDRAM控制器的设计方法,使用该方法实现的控制器可非常方便地对SDRAM进行控制。 关键
    发表于 06-20 13:04 2187次阅读

    SDRAM接口的VHDL设计方案

    SDRAM 以其高速和大容量的优点获得了极大的应用,但是其接口与目前广泛应用的微处理器系统不兼容,介绍了用 VHDL 语言实现SDRAMRAM之间的接口控制电路,从而将
    发表于 06-01 15:29 57次下载
    <b class='flag-5'>SDRAM</b>接口的VHDL设计方案

    Turbo码译码在MSC8101上的实现探讨

    介绍了摩托罗拉公司新一代定点数字信号处理芯片MSC8101的特点,以及Turbo码译码在MSC8101上的实现技术。
    发表于 09-13 18:04 20次下载
    Turbo码译码在<b class='flag-5'>MSC</b>8101上的<b class='flag-5'>实现</b>探讨

    SDRAM与SRAM的区别

    SRAM是靠双稳态触发器来记忆信息的;SDRAM是靠MOS电路中的栅极电容来记忆信息的。由于电容上的电荷会泄漏,需要定时给与补充,所以动态RAM需要设置刷新电路。但动态RAM比静态RAM
    发表于 11-03 18:26 5560次阅读

    一文看懂ARM里的RAMSDRAM有什么区别

    本文主要介绍的是ARM里的RAMSDRAM有什么区别,首先介绍了RAM的类别及特点,其次对SDRAM做了详细阐述,最后介绍了RAM
    发表于 04-27 16:20 3.4w次阅读

    采用VHDL语言实现SDRAM与双口RAM的数据传输系统设计

    来设置RAM起始地址、SDRAM起始地址、传送数据长度、传送数据方向之后,SDRAMRAM之间数据传送就完全可以通过硬件实现,不必占用微处
    的头像 发表于 06-01 07:08 3045次阅读
    采用VHDL语言<b class='flag-5'>实现</b><b class='flag-5'>SDRAM</b>与双口<b class='flag-5'>RAM</b>的数据传输系统设计

    ARM里的ramSDRAM之间的区别是什么

    本篇文章英尚微电子存储芯片供应商主要详细介绍下ARM里的ramSDRAM有什么区别,首先介绍了ramSDRAM做了详细阐述,最后介绍了两者的区别。
    发表于 02-25 15:01 1403次阅读

    SDRAM工作原理 SDRAM布局布线说明

    SDRAM全称Synchronous Dynamic RAM,同步动态随机存储器。首先,它是RAM,即随机存储器的一种。
    发表于 08-08 15:10 2239次阅读
    <b class='flag-5'>SDRAM</b>工作原理 <b class='flag-5'>SDRAM</b>布局布线说明