Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB主机_host
stm32 drv_usbh驱动中延时的疑惑
发布于 2021-03-23 09:25:13 浏览:1713
订阅该版
```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 里确实读写正常。
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; } } } ```
Jone
2021-03-23
写了还是懒
延时之前有个完成信号量了,感觉可以试下注释掉延时。 印象中驱动里对`drv_pipe_xfer()`的返回值也没处理好,好像是要改成累加值
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
被浏览
1.7k
关于作者
anqi
这家伙很懒,什么也没写!
提问
14
回答
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
FRDM-MCXN947 Flash实践--W25Q64
2
NXP MCXN947测评(一)开箱+环境配置
3
stm32f103的adc+dma多通道采集数据
4
恩智浦FRDM-MCX947上的 IIC(硬件) 实践
5
栈溢出及中断向量偏移BUG记录与分析
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
CAN总线
Hardfault
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
WIZnet_W5500
ota在线升级
cubemx
flash
I2C
UART
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
BSP
ADC
keil_MDK
socket
中断
编译报错
MicroPython
Debug
SDIO总线
GD32
msh
rt_mq_消息队列_msg_queue
ulog
C++_cpp
SFUD
本月问答贡献
xiaorui
20
个答案
3
次被采纳
Juggernaut
12
个答案
3
次被采纳
踩姑娘的小蘑菇
12
个答案
2
次被采纳
小小李sunny
10
个答案
2
次被采纳
a1012112796
8
个答案
1
次被采纳
本月文章贡献
ZVML_9668
4
篇文章
6
次点赞
Lu_盼盼
4
篇文章
3
次点赞
Z_Y
3
篇文章
5
次点赞
ThinkCode
2
篇文章
2
次点赞
oxlm
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部