关于STM32F105 读写U盘出错一直复位

2019-07-20 23:49发布

最近在做一个项目,STM32F105来读写U盘,由于是第一次搞,所以参照的是原子哥STM32F407的U盘程序,FATFS移植的是FATFS0.13a,USB库就是用的原子哥的,程序可以正常检测U盘
下面是串口打印的信息
***************************************************************************
USB OTG HS MSC Host
> USB Host library started.
  USB Host Library v2.1.0


检测到USB设备插入!
复位设备...
全速(FS)USB设备!
VID: 1234h
PID: FFFFh
从机地址分配成功!
可移动存储器设备!
Manufacturer: TE
Product: USB
Serial Number: 90A20200A98A0009
设备枚举完成!


跳过用户确认步骤!
Processing...
开始执行用户程序!!!
挂载U盘系统
FATFS OK!
U盘总容量: 4039 MB

U盘剩余容量: 1682 MB
*********************************************************************************************************
但是一旦调用
res = f_open( &fsrc , "0://t.c" , FA_CREATE_NEW | FA_WRITE);        //创建“t.c”文件       
                                               
        if ( res != FR_OK )
        {
           printf("返回值 res = %d ",res);                                                       
       }
重复复位的现象************************************************************************************************************
USB OTG HS MSC Host
> USB Host library started.
  USB Host Library v2.1.0


检测到USB设备插入!
复位设备...
全速(FS)USB设备!
VID: 1234h
PID: FFFFh
从机地址分配成功!
可移动存储器设备!
Manufacturer: TE
Product: USB
Serial Number: 90A20200A98A0009
设备枚举完成!


跳过用户确认步骤!
开始执行用户程序!!!
挂载U盘系统
读写U盘文件
USB连接成功
读写U盘文件
读写U盘文件
读写U盘文件
FATFS OK!
U盘总容量: 4039 MB
U盘剩余容量: 1682 MB
读写U盘文件
返回值 res = 1
USB OTG HS MSC Host
> USB Host library started.
  USB Host Library v2.1.0


检测到USB设备插入!
复位设备...
全速(FS)USB设备!
Processing...
VID: 1234h
PID: FFFFh
从机地址分配成功!
可移动存储器设备!
Manufacturer: TE
Product: USB
Serial Number: 90A20200A98A0009
设备枚举完成!


跳过用户确认步骤!
开始执行用户程序!!!
挂载U盘系统
读写U盘文件
USB连接成功
读写U盘文件
读写U盘文件
读写U盘文件
FATFS OK!
U盘总容量: 4039 MB
U盘剩余容量: 1682 MB
读写U盘文件
返回值 res = 1
*******************************************************************************************
res 返回值 为1           FR_DISK_ERR,                        /* (1) A hard error occurred in the low level disk I/O layer */
也就是硬件驱动层错误,不理解的是如果是驱动错误为什么能读取U盘的设备信息,
下面是U盘读写程序,也是参照原子哥的,不知道是不是下面函数的问题,整个项目工程上传到附件,有搞过的大神能否帮忙看下
[mw_shl_code=c,true]
//读U盘
//buf:读数据缓存区
//sector:扇区地址
//cnt:扇区个数       
//返回值:错误状态;0,正常;其他,错误代码;                 
u8 USBH_UDISK_Read(u8* buf,u32 sector,u32 cnt)
{
        u8 res=1;
       
         printf("读写U盘文件 ");
       
        if(HCD_IsDeviceConnected(&USB_OTG_Core)&&AppState==USH_USR_FS_TEST)//连接还存在,且是APP测试状态
        {                      
                do
                {
                        res=USBH_MSC_Read10(&USB_OTG_Core,buf,sector,512*cnt);
                        USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);                     
                        if(!HCD_IsDeviceConnected(&USB_OTG_Core))
                        {
                                res=1;//读写错误
                                break;
                        };   
                }while(res==USBH_MSC_BUSY);
        }else res=1;                  
        if(res==USBH_MSC_OK)res=0;       
        return res;
}


//写U盘
//buf:写数据缓存区
//sector:扇区地址
//cnt:扇区个数       
//返回值:错误状态;0,正常;其他,错误代码;                 
u8 USBH_UDISK_Write(u8* buf,u32 sector,u32 cnt)
{
        u8 res=1;
        if(HCD_IsDeviceConnected(&USB_OTG_Core)&&AppState==USH_USR_FS_TEST)//连接还存在,且是APP测试状态
        {                      
                do
                {
                        res=USBH_MSC_Write10(&USB_OTG_Core,buf,sector,512*cnt);
                        USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);                     
                        if(!HCD_IsDeviceConnected(&USB_OTG_Core))
                        {
                                res=1;//读写错误
                                break;
                        };   
                }while(res==USBH_MSC_BUSY);
        }else res=1;                  
        if(res==USBH_MSC_OK)res=0;       
        return res;
}
[/mw_shl_code]










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。