Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB主机_host
stm32 drv_usbh驱动中延时的疑惑
发布于 2021-03-23 09:25:13 浏览:2054
订阅该版
```c static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { int timeout = timeouts; while (1) { if (!connect_status) { return -1; } rt_completion_init(&urb_completion); HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs, pipe->pipe_index, (pipe->ep.bEndpointAddress & 0x80) >> 7, pipe->ep.bmAttributes, token, buffer, nbytes, 0); rt_completion_wait(&urb_completion, timeout); rt_thread_mdelay(1); if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_NAK) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nak\n")); if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); } HAL_HCD_HC_Halt(&stm32_hhcd_fs, pipe->pipe_index); HAL_HCD_HC_Init(&stm32_hhcd_fs, pipe->pipe_index, pipe->ep.bEndpointAddress, pipe->inst->address, USB_OTG_SPEED_FULL, pipe->ep.bmAttributes, pipe->ep.wMaxPacketSize); continue; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_STALL) { RT_DEBUG_LOG(RT_DEBUG_USB, ("stall\n")); pipe->status = UPIPE_STATUS_STALL; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == URB_ERROR) { RT_DEBUG_LOG(RT_DEBUG_USB, ("error\n")); pipe->status = UPIPE_STATUS_ERROR; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if(URB_DONE == HAL_HCD_HC_GetURBState(&stm32_hhcd_fs, pipe->pipe_index)) { RT_DEBUG_LOG(RT_DEBUG_USB, ("ok\n")); pipe->status = UPIPE_STATUS_OK; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } size_t size = HAL_HCD_HC_GetXferCount(&stm32_hhcd_fs, pipe->pipe_index); if (pipe->ep.bEndpointAddress & 0x80) { return size; } else if (pipe->ep.bEndpointAddress & 0x00) { return size; } return nbytes; } continue; } }` ``` stm32 drv_usbh.c驱动中收到完成量后加的rt_thread_mdelay(1),这个感觉很占用时间呀,每64字节1ms,2M的数据占用30多s
查看更多
cxhxy12345
2021-03-23
这家伙很懒,什么也没写!
这个rt_thread_mdelay()函数因该是后续的一个补丁,可能在调试中发现问题后在这里加了一个延时。 如果你在运用中不想过多的关注,可以不理睬它@……@
6
个回答
默认排序
按发布时间排序
出出啊
2021-07-07
恃人不如自恃,人之为己者不如己之自为也
这里的延时是必须的,最近我也在调试 usb host 的驱动,除了这里还有个地方也得添加个延时,不加会不认部分 U盘,或者识别U盘后读写数据出错,甚至把U盘的分区表写没。。。 有一次 elm 读写文件正常,放到电脑上没那个文件。。。但是 rtt 里确实读写正常。
Jone
2021-03-23
写了还是懒
延时之前有个完成信号量了,感觉可以试下注释掉延时。 印象中驱动里对`drv_pipe_xfer()`的返回值也没处理好,好像是要改成累加值
anqi
2021-10-29
这家伙很懒,什么也没写!
去掉1ms延时,我修改成如下代码,目前枚举正常,速度一下子就上来了 ```c static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { int timeout = timeouts; int status = 0; while (1) { if (!connect_status) { return -1; } switch(status) { case 0: rt_completion_init(&urb_completion); RT_DEBUG_LOG(RT_DEBUG_USB, ("pipe xfer:%d\n", nbytes)); rt_base_t lvl = rt_hw_interrupt_disable(); HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs, pipe->pipe_index, (pipe->ep.bEndpointAddress & 0x80) >> 7, pipe->ep.bmAttributes, token, buffer, nbytes, 0); rt_hw_interrupt_enable(lvl); status = 1; case 1: RT_DEBUG_LOG(RT_DEBUG_USB, ("wait_comp\n")); if(rt_completion_wait(&urb_completion, timeout) != RT_EOK) { rt_kprintf("pipe xfer timeout:%d\n", timeout); return -1; } status = 2; break; case 2: HCD_URBStateTypeDef urbstate = HAL_HCD_HC_GetURBState(&stm32_hhcd_fs, pipe->pipe_index); if(URB_DONE == urbstate){ pipe->status = UPIPE_STATUS_OK; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } size_t size = HAL_HCD_HC_GetXferCount(&stm32_hhcd_fs, pipe->pipe_index); RT_DEBUG_LOG(RT_DEBUG_USB, ("HC_XFRC:%d\n", size)); if (pipe->ep.bEndpointAddress & 0x80) { return size; } return nbytes; } else if(URB_IDLE == urbstate){ HCD_HCStateTypeDef usbstate = HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index); RT_DEBUG_LOG(RT_DEBUG_USB, ("urb_state:%d,%d\n", urbstate, usbstate)); if(usbstate == HC_IDLE) { HAL_HCD_HC_Halt(&stm32_hhcd_fs, pipe->pipe_index); status = 0; continue; } rt_completion_init(&urb_completion); status = 1; } else if(URB_NOTREADY == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_NOTREADY:%d\n", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else if(URB_NYET == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_NYET:%d\n", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else if(URB_ERROR == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_ERROR:%d\n", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else{ rt_kprintf("urb_state:%d\n", urbstate); return -1; } break; } } } ```
xmwang025
2023-04-13
这家伙很懒,什么也没写!
大神们,现在有没有哪个版本的函数drv_pipe_xfer是好用的,总共 254528的文件,每次拷贝1024字节,读10次左右就出现CBW size error usb mass_storage read failed,不知道怎么处理了,紧急求救,延时加长没用啊
flashman2002
2021-03-23
这家伙很懒,什么也没写!
每64字节1ms,2M=2048字节的数据应该是占用32ms呀。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.1k
关于作者
anqi
这家伙很懒,什么也没写!
提问
15
回答
13
被采纳
3
关注TA
发私信
相关问题
1
请教USB Host
2
STM32F4调试USB 读卡器(Slave)提示格式化
3
急求 STM32F4 USB Device MSC+SD 的相关问题
4
USB 框架问题
5
USB键盘
6
LPC17xx 如何添加USB HOST设备
7
RT-Thread目前支持USB HOST了吗?
8
USB HOST的支持问题
9
RTT 2.0.1 USB存储设备问题,枚举到USBREQ_GET_MAX_LUN后复位
10
USB库已经很久没更新了
推荐文章
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
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部