|
STM32系列 MCU模拟双盘符 U盘的应用 应用背景 客户使用STM32F429系列MCU,存储介质有两种,分别为SDIO连接TF-card,SPI Flash,目的是通过1个usb口连接到PC后,能够看到两个盘符,PC能够分别对TF-card和SPI Flash进行读写操作。 问题分析 抓包分析,出现STALL的情况
走读代码,发现函数 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
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, 下载次数: 170)
|
| 已收藏,点赞! |
| 感谢分享 |
| 谢谢分享 |
| 谢谢分享! |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版