CH376芯片写入文件扇区问题

今天拿到芯片尝试了一下向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 );

}

}



再次感谢

附上winhex截图,上面是根目录扇区,下面的是CH376误当做根目录的扇区

a.jpg

b.png



只有登录才能回复,可以选择微信账号登录