Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB主机_host
USBHost挂载U盘正常,只能读不能写。drv_pipe_xfer函数死循环
发布于 2022-06-15 17:49:34 浏览:1073
订阅该版
开发环境:RT-Thread stdio、源码4.1、使用的硬石YS-F4Pro开发板、芯片是stm32f407、U盘是USB2.0的。 问题:U盘可以正常挂载和枚举,文件系统挂载也正常,可以使用cat命令查看U盘内文件内容,但是echo命令写入失败(用命令与程序测试均尝试过),失败以后shell就是卡死无法输入。 请大家看下我的现象和分析,帮忙给点思路或者解决方法。 调试过程参考过论坛基本所有的提问,重点是如下2个帖子,这2个帖子里面提到的方法都尝试过,但无法解决问题: [https://club.rt-thread.org/ask/article/dac2a83e018f6ad2.html](https://club.rt-thread.org/ask/article/dac2a83e018f6ad2.html) [https://club.rt-thread.org/ask/article/0069975cbd0504f6.html](https://club.rt-thread.org/ask/article/0069975cbd0504f6.html) 调试过程: 正常mount U盘如下: ````c \ | / - RT - Thread Operating System / | \ 4.1.0 build Jun 15 2022 16:43:48 2006 - 2022 Copyright by RT-Thread team [I/SFUD] Find a Boya BY25Q128AS flash chip. Size is 16777216 bytes. [I/SFUD] W25Q128 flash device is initialize succusb connected port 1 status 0x10201 ess. [I/SFUD] Probe SPI flash W25Q128 by SPI device spi10 success. [D/FAL] (fal_flash_init:49) Flash device | onchip_flash_16k | addr: 0x08000000 | len: 0x00010000 | blk_size: 0x00004000 |initialized finish. [D/FAL] (fal_flash_init:49) Flash device | onchip_flash_64k | addr: 0x08010000 | len: 0x00010000 | blk_size: 0x00010000 |initialized finish. [D/FAL] (fal_flash_init:49) Flash device | onchip_flash_128k | addr: 0x08020000 | len: 0x000e0000 | blk_size: 0x00020000 |initialized finish. [D/FAL] (fal_flash_init:49) Flash device | W25Q128 | addr: 0x00000000 | len: 0x01000000 | blk_size: 0x00001000 |initialized finish. [I/FAL] ==================== FAL partition table ==================== [I/FAL] | name | flash_dev | offset | length | [I/FAL] ------------------------------------------------------------- [I/FAL] | bootloader | onchip_flash_16k | 0x00000000 | 0x00010000 | [I/FAL] | param | onchip_flash_64k | 0x00000000 | 0x00010000 | [I/FAL] | app | onchip_flash_128k | 0x00000000 | 0x000e0000 | [I/FAL] | easyflash | W25Q128 | 0x00000000 | 0x00100000 | [I/FAL] | download | W25Q128 | 0x00100000 | 0x00100000 | [I/FAL] ============================================================= [I/FAL] RT-Thread Flash Abstraction Layer initialize success. [I/FAL] The FAL MTD NOR device (download) created successfully [I/app.filesystem] mount to '/flash' success! msh />reset port start enumnation ok pipe transform remain size,: 8 ok pipe transform remain size,: 0 ok reset port rt_usb_set_address ok pipe transform remain size,: 0 ok get device descriptor length 18 ok pipe transform remain size,: 18 ok pipe transform remain size,: 0 ok Vendor ID 0x951 Product ID 0x1665 ok pipe transform remain size,: 18 ok pipe transform remain size,: 0 ok ok pipe transform remain size,: 32 ok pipe transform remain size,: 0 ok ok pipe transform remain size,: 0 ok rt_usb_get_interface_descriptor: 0 interface class 0x8, subclass 0x6 rt_usb_get_endpoint_descriptor: 0 rt_usb_get_endpoint_descriptor: 1 subclass 6, protocal 80 rt_usbh_storage_run rt_usb_get_endpoint_descriptor: 0 rt_usb_get_endpoint_descriptor: 1 rt_usbh_storage_reset ok pipe transform remain size,: 0 ok rt_usbh_storage_get_max_lun ok pipe transform remain size,: 1 ok pipe transform remain size,: 0 ok rt_usbh_storage_inquiry pipe transform remain size,: 31 nak ok pipe transform remain size,: 36 ok pipe transform remain size,: 13 ok rt_usbh_storage_test_unit_ready pipe transform remain size,: 31 ok pipe transform remain size,: 13 ok rt_usbh_storage_get_capacity pipe transform remain size,: 31 ok pipe transform remain size,: 8 ok pipe transform remain size,: 13 ok capicity 15356160, block size 512 read partition table rt_usbh_storage_read10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ok pipe transform remain size,: 64 ok pipe transform remain size,: 13 ok finished reading partition rt_usbh_storage_read10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ok pipe transform remain size,: 64 ok pipe transform remain size,: 13 ok rt_usbh_storage_read10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ok pipe transform remain size,: 64 ok pipe transform remain size,: 13 ok Mount FAT on Udisk successful. ```` mount阶段有的时候偶尔会有nak,但是都可以挂载成功,没有影响,nak原因暂时未知。 正常读取1.txt文件如下: ```c Mount FAT on Udisk successful. ls Directory /: dev
flash
udisk
msh />cd udisk msh /udisk>ls Directory /udisk: rt_usbh_storage_read10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ok pipe transform remain size,: 64 ok pipe transform remain size,: 13 ok System Volume Inform
1.txt 12 msh /udisk>cat 1. msh /udisk>cat 1.txt rt_usbh_storage_read10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ok pipe transform remain size,: 64 ok pipe transform remain size,: 13 ok 123123123123 msh /udisk> ``` 写入失败情况如下: ```c msh /udisk>echo 2 2.txt rt_usbh_storage_write10 pipe transform remain size,: 31 ok pipe transform remain size,: 512 ok pipe transform remain size,: 448 ok pipe transform remain size,: 384 ok pipe transform remain size,: 320 ok pipe transform remain size,: 256 ok pipe transform remain size,: 192 ok pipe transform remain size,: 128 ``` 可以看到直接就卡死了,经过调试发现,此时在drv_pipe_xfer函数中死循环,循环时通过`HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index)`函数获取状态发现状态为URB_IDLE与HC_IDLE,进一步跟踪发现`HAL_HCD_HC_SubmitRequest`函数(具体代码如下)中将这2个状态设置为IDLE。 ```c hhcd->hc[ch_num].xfer_buff = pbuff; hhcd->hc[ch_num].xfer_len = length; hhcd->hc[ch_num].urb_state = URB_IDLE; hhcd->hc[ch_num].xfer_count = 0U; hhcd->hc[ch_num].ch_num = ch_num; hhcd->hc[ch_num].state = HC_IDLE; ``` 之后由于`rt_completion_wait(&urb_completion, timeout);`等不到完成量,完成量信号是在中断里面调用`HAL_HCD_HC_NotifyURBChange_Callback`发送出来的,但是一直没有中断发生,所以就以timeout(5S)时间一直循环,shell卡死应该就是没有对完成量的返回做处理。 手头没有USB协议分析仪,没办法分析协议,不知道到底是什么原因导致了这样的情况发送,请大神们给点思路,或者遇到相同情况的说说如何解决?
查看更多
sakumisu
认证专家
2022-06-15
https://github.com/sakumisu
思路就是重构代码,重写寄存器。看我帖子说明:https://club.rt-thread.org/ask/article/9c31ce71ead26c2b.html
2
个回答
默认排序
按发布时间排序
杰瑞鼠
2022-10-29
2024龙行天下
我也是能识别,能读不能写(报STALL错误),希望得到你的帮助,谢谢,详见《[USBHOST挂载U盘可识别,可读,但写时报错,请问怎么处理](https://club.rt-thread.org/ask/question/90a861612f80d346.html "USBHOST挂载U盘可识别,可读,但写时报错,请问怎么处理")》
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
sunlei
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
RT-Thread Studio USBHOST问题。
2
STM32F407遇到USB读取U盘无法读取问题
3
解决usbhost 无法使用hid设备的问题,
4
usbhost无法设别NTFS格式的U盘吗?
5
stm32f767配置usb host
6
有偿开发基于RT-thread+M3 实现 USB host RNDIS
7
No class register on usb device
8
USB Host 鼠标键盘枚举无法获取HID设备描述符
9
RT-Thread Studio USBHOST
10
USB host设备调试问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部