今天拿到芯片尝试了一下向U盘中写文件,写了一个TXT文档叫做CH376.TXT。返回值什么的都是对的0x14.但是把U盘拿到电脑上一看,就发现没有这个文件。而用CH376打开文件就能打开,我很纳闷的打开了WINHEX看了一下扇区,发现CH376在扇区上写的位置不对,我U盘的逻辑扇区32768号扇区是根目录,第三簇=32768+8,而CH376把根目录当成了30208,第三簇=30208+8。请问各位大神,是不是U盘需要经过特殊处理,还是说我在芯片上的使用出现了问题?望解答!谢谢。
程序附上,编译环境NIOS II 12 SP1。
#include "../inc/ch376inc.h"
#include "../inc/hal.h"
#include "../inc/file_sys.h"
#include
#include
#include
UINT8 buf[64];
void host(void) {
UINT8i, s;
s = mInitCH376Host( ); /* 初始化CH376 */
/* 其它电路初始化 */
while ( 1 ) {
printf( "Wait Udisk/SD\n" );
while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */
usleep( 1000*100 ); /* 没必要频繁查询 */
//printf("USB FAILURE\n");
}
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
usleep( 1000*50 );
printf( "Ready ?\n" );
s = CH376DiskMount( ); /* 初始化磁盘并测试磁盘是否就绪 */
if ( s == USB_INT_SUCCESS ){
printf("U_DISK INIT SUCCESS");
break; /* 准备好 */
}
else if ( s == ERR_DISK_DISCON ) break; /* 检测到断开,重新检测并计时 */
if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
}
if ( s == ERR_DISK_DISCON ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
continue;
}
if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { /* 未知USB设备,例如USB键盘、打印机等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
i = CH376ReadBlock( buf ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */
if ( i == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */
buf[ i ] = 0;
printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr );
}
/*到这里都没有问题,返回来的U盘信息都是对的*/
/* 创建原文件 */
printf( "Open\n" );
strcpy( buf, "/CH376.TXT" ); /* 源文件名,多级目录下的文件名和路径名必须复制到RAM中再处理,而根目录或者当前目录下的文件名可以在RAM或者ROM中 */
printf("buf:%s\n",buf);
s = CH376FileCreatePath( buf ); /* 新建多级目录下的文件,支持多级目录路径,输入缓冲区必须在RAM中 */
printf("s=%02x \n",(unsigned short)s );
////////////////////////////////////// 写入
printf( "Write :" );
strcpy((char *)buf, "兄弟们那个加油哇 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵" );
s = CH376ByteWrite( buf, strlen((const char *)buf), NULL ); /* 以字节为单位向当前位置写入数据块 */
printf("s=%02x \n",(unsigned short)s );
printf("close file " );
s = CH376FileClose( TRUE ); /* 关闭文件,对于字节读写建议自动更新文件长度 */
printf("s=%02x \n",(unsigned short)s );
UnknownUsbDevice:
printf( "Take out\n" );
while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘拔出 */
usleep( 1000*100 );
}
usleep( 1000*100 );
}
}
再次感谢