学前班
最后登录1970-1-1
在线时间 小时
注册时间2020-2-6
|
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盘里出现了乱码文件及
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, 下载次数: 32)
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设备!
|
|