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

【实战经验】STM32系列MCU模拟双盘符U盘的应用

[复制链接]
zero99 发布时间:2017-4-5 17:27
STM32系列 MCU模拟双盘符 U盘的应用

应用背景
客户使用STM32F429系列MCU,存储介质有两种,分别为SDIO连接TF-card,SPI Flash,目的是通过1个usb口连接到PC后,能够看到两个盘符,PC能够分别对TF-card和SPI Flash进行读写操作。


问题分析
抓包分析,出现STALL的情况
11.jpg
走读代码,发现函数
static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
函数里面
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0)
if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len)
这几处如果不成功,就会返回,使得端点STALL!

解决方案
考虑到客户使用的SPI FLASH,将block size设置为4096(而非通常意义上的512),因为这个SPI FLASH读写都是以4096Bytes为单位的。所以模拟利用stm32eval板,板上自带了tf-card的驱动,这时使用RAM模拟另一个盘,同时将其block size设为1024(容量有限,只要不是512即可),成功复现了客户的问题,走读代码,发现函数static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params)
函数里面
if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 )
if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0)
if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len)
这几处如果不成功,就会返回,使得端点STALL!

继续跟代码,发现是这两个全局变量导致问题的(由于2个盘设定不一,导致使用混乱错误) hmsc->scsi_blk_size
hmsc->scsi_blk_nbr
所以在读写的时候,需要对这两个全局变量进行重新赋值,如:
Switch (lun)
{
     Lun 0: // TF-Card
         hmsc->scsi_blk_size = 512 ;
         hmsc->scsi_blk_nbr = tf-card_SIZE / 512 -1 ;

        Break;

        Lun 1: // SPI-Flash
            hmsc->scsi_blk_size = 1024 ;
            hmsc->scsi_blk_nbr = 64 - 1; // use 64k RAM to simulate RAM-disk

            Break;
        Default:
            Break;
}

附代码的使用 :

STM32Cube_FW_F4_V1.12.0\Projects\STM324x9I_EVAL\Applications\USB_Device
12.png
MSC_2storage_test.7z

STM32Cube_FW_F4_V1.12.0\Middlewares\ST\STM32_USB_Device_Library\Class

MSC.7z

总结
由于驱动本身只支持LUN 为1,当使用双盘符时,在usb device 端除了需要对LUN0 和LUN1 分开进行处理(读,写),还需要考虑一些全局变量,虽然在BOT 协议里,大部分值都是从PC 端,也就是HOST 端传下来的,但是会有一些全局变量并非如此,特别在两个LUN 的block size 不一致的时候,需要特别小心处理!



STM32系列MCU模拟双盘符U盘的应用.pdf (210.48 KB, 下载次数: 186)
1 收藏 2 评论4 发布时间:2017-4-5 17:27

举报

4个回答
jinglixixi 回答时间:2017-4-5 18:09:45
已收藏,点赞!
arenas 回答时间:2017-4-6 09:40:57
感谢分享
jinshan2014 回答时间:2017-11-2 20:38:56
谢谢分享
pythonworld 回答时间:2017-11-3 07:24:40
谢谢分享!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版