野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13629|回复: 2

【求助】F429+USB(V2.2.1)+FATFS(R0.14),USB HOST写U盘文件失败,原因?

[复制链接]
发表于 2020-2-7 17:01:25 | 显示全部楼层 |阅读模式
1、问题描述
平台环境:F429 + USB OTG FS(V2.2.1)+ FATFS(R0.14),实现板卡作为USB HOST,与U盘进行交互,
                  U盘容量标称为16G,已经格式化为FAT32、分配单元大小4096字节,初始调试U盘里无任何内容,

具体问题:  板卡实现在U盘创建文件(txt)、写文件、读文件功能等功能,通过调试日志看到执行f_write函数失败,错误码为FR_DISK_ERR,
                  通过跟踪底层disk_write函数,是函数USBH_MSC_Write10返回了 status = USBH_MSC_PHASE_ERROR; 状态导致,
                 将U盘从板卡拔出插入电脑查看U盘里的内容,发现出现了带有乱码名称的文件夹和文件,就是没有txt文件。

                  这个文件搞了几天,网上也查了不少资料,没整明白,遂求助广大网友,帮分析下具体什么原因?

2、调试信息、代码、图片
          2.1 串口调试信息如下
          [16:29:23.271]收←◆USBH_USR_ResetDevice  复位设备...

[16:29:23.302]收←◆USBH_USR_DeviceAttached  检测到USB设备插入!

[16:29:23.349]收←◆USBH_USR_ResetDevice  复位设备...
USBH_USR_DeviceSpeedDetected  全速(FS)USB设备!

[16:29:23.457]收←◆USBH_USR_Device_DescAvailable  VID: 0951h
PID: 1642h

[16:29:23.493]收←◆USBH_USR_DeviceAddressAssigned  从机地址分配成功!

[16:29:23.643]收←◆USBH_USR_Configuration_DescAvail
[16:29:23.665]收←◆able  可移动存储器设备!

[16:29:23.749]收←◆USBH_USR_Manufacturer_String  Ma
[16:29:23.777]收←◆nufacturer: Kingston

[16:29:23.969]收←◆USBH_USR_Product_String  Product
[16:29:23.993]收←◆: DT 101 G2

[16:29:24.223]收←◆USBH_USR_SerialNum_String  Seria
[16:29:24.261]收←◆l Number: 001CC0EC347CFC91471C275E

[16:29:24.289]收←◆USBH_USR_EnumerationDone  设备枚举完成!

USBH_USR_UserInput  跳过用户确认步骤!

[16:29:24.717]收←◆USBH_USR_MSC_Application  USBH U
[16:29:24.744]收←◆SR APPLICATION USB ATTACHED_ENU
start process usb disk file
disk_initialize  disk_read  disk_read  disk_read  USB DISK mount sucess,fresult[0]
disk_status  disk_read  USB DISK open sucess,fresult[0]
disk_status  disk_write  USB DISK write fail, fresult[1]
disk_status  disk_write  error ->USB DISK close fail, fresult[1]
error ->USB DISK unmount fail, fresult[12]
USB DISK fs process end

[16:29:27.868]收←◆USBH_USR_DeviceDisconnected  USB设备拔出!
USBH_USR_DeInit      

2.2 f_open函数执行结束后,U盘里出现了乱码文件,这些乱码文件删除还删不掉,只能格式化U盘才格式掉
      

U盘里出现了乱码文件及

U盘里出现了乱码文件及


2.3 f_open、f_write函数程序段
                     printf("start process usb disk file\n");
                //挂在U盘
                fresult = f_mount(&fs_usb_disk, "0:", 1);
                if(fresult == FR_OK)
                {
                        printf("USB DISK mount sucess,fresult[%u]\n",fresult);
                }
                else
                {
                        printf("USB DISK mount fail, fresult[%u]\n",fresult);
                        goto error;
                }
               

                //打开文件
                fresult = f_open(&fil1, "0:2020.txt", FA_OPEN_ALWAYS | FA_WRITE);
                if(fresult == FR_OK)
                {
                        printf("USB DISK open sucess,fresult[%u]\n",fresult);
                }
                else
                {
                        printf("USB DISK open fail, fresult[%u]\n",fresult);
                        goto error;
                }

                //向文件中写入数据
                fresult = f_write(&fil1, (const char *)wbuff, sizeof(wbuff), &bw);                       
                if(fresult == FR_OK)
                {
                        printf("USB DISK write sucess,,fresult[%u],bw[%u]\n",fresult,bw);
                }
                else
                {
                        printf("USB DISK write fail, fresult[%u]\n",fresult);
                        goto error;
                }
                ……  以下略
      2.4 disk_write函数调用了USBH_UDISK_Read函数,循环执行几次USBH_MSC_Read10后反馈错误码为USBH_MSC_PHASE_ERROR,导致IO错误
                u8 USBH_UDISK_Read(u8* buf,u32 sector,u32 cnt)
{
       
        u8 res=1;
        if(HCD_IsDeviceConnected(&USB_OTG_Core))
        {                      
                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;
}

2.4 FATFS的ffconf.h的配置
         见附件 ffconf.rar (4.08 KB, 下载次数: 27)

2.5 其他情况
          2.5.1  我手上有个1G的U盘,这个U盘执行程序都没问题,txt文件创建、读写都没问题,U盘里也没有乱码文件及文件夹
          2.5.2 在U盘里事先创建t好txt文件,执行f_write成功,但是f_close失败(错误码为1),想要写的内容也没写进txt,但是此时U盘里没有乱码文件及文件夹了;
          2.5.3 在U盘里事先创建好txt文件,执行f_read成,但是f_close失败(错误码为1);
          2.5.4 手上还有一个4G的U盘,这个U盘直接就枚举了,定位发现到获取描述符哪一步就死循环了,直接就是下面这种状态,就没继续了,死掉了
                      [16:54:07.486]收←◆USBH_USR_ResetDevice  复位设备...

[16:54:07.526]收←◆USBH_USR_DeviceAttached  检测到USB设备插入!

[16:54:07.564]收←◆USBH_USR_ResetDevice  复位设备...
USBH_USR_DeviceSpeedDetected  全速(FS)USB设备!



回复

使用道具 举报

 楼主| 发表于 2020-2-13 08:54:24 | 显示全部楼层
自顶下,我换了几个FATFS版本,都没能解决问题
回复 支持 反对

使用道具 举报

发表于 2020-3-22 14:51:47 | 显示全部楼层
兄弟,你用的时挑战者f429这块板子么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-3-29 22:29 , Processed in 0.030352 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表