sync
sync
This guy hasn't written anything yet

注册于 3 years ago

回答
151
文章
3
关注者
3

不需要自己实现的,加载fal软件包,配置好fal_cfg.h头文件就行了

频繁拔插测试U盘,几次以后,有可能U盘就不能正常识别了。。
usb驱动不是很稳定

sync 发表于 2020-3-19 09:46
咨询下楼主,rtt+F407 调试U盘,遇到过没有U盘插好后,再上电就可以正常读取U盘,一旦板子先上电,后插U盘 ...


之前把usb调试打开了,现在把USB调试关掉,拔插U盘就没有问题了。。。。
#define RT_DEBUG_USB                    0x00

咨询下楼主,rtt+F407 调试U盘,遇到过没有U盘插好后,再上电就可以正常读取U盘,一旦板子先上电,后插U盘,结果就不识别U盘了。。,或者识别好的U盘,拔下再插上就不能识别了

现在能正常使用不?楼主问题解决没?也打算用24CXX呢

passion 发表于 2020-3-10 16:10
我用最新版开启host 读U盘也失败了 一直不检测U盘 没找到具体原因 方便交流下么各个部件的初始化都正常 ...


建议一步步来,我一开始自己的程序,即使用的最新的drv_usbh.c也是不行出现,出现drv_pipe_xfer 死循环,重新下载最新的完整程序包后,直接使用stm32f407-atk-explorer 例子,加载drv_usbh.c后就可以了,建议先使用stm32f407-atk-explorer 单独测试下U盘看看

检查下硬件管脚配置是否完全正确,之前遇到过,有几根管脚配置错误,导致一直都是linkdown状态

STM32官方的驱动库明显识别的U盘更多些,希望Rt-thread能够继续完善下U盘的驱动,毕竟这个功能很有用处了

开发板自带的U盘例程使用的是STM32_USBD_Library驱动库

今天从github重新下载代码,使用stm32f407-atk-explorer 例子,直接加载drv_usbh.c就可以了
测试了三个U盘一个可以识别,两个不能识别
测试发现U盘内含有MBR分区表的无法加载,使用diskgenius修改为FDD模式后,一个可以正常识别,另一个老的金士顿U盘仍不能识别

但使用开发板自带的U盘例程这三个都是可以识别的,估计这个驱动还有完善的地方,暂时满足使用。

好的,感谢回复,明天确认后再反馈了,今天一开始就用错文件,耽误不少时间,希望明天可以顺利了

单步调试发现进入这个函数后,就变成死循环了 ,一直在while(1)里面出不来了

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;
}
}

回到
顶部

发布
问题

投诉
建议