PIC67K22单片机的硬件SPI与CH376通讯读写U盘,系统电压3.3V。硬件连接测试,模式设定,U盘初始化都通过了。请问在根目录下新建文本文件,抛开库函数,流程上需要先打开根目录吗?请高手指点!
根目录下创建文件不需要先打开根目录直接发送设置文件名(2FH)和创建文件(34H)即可创建,具体可以参考:CH376编程指南.PDF。
void CH376SetFileName( PUINT8 name ) /* 设置将要操作的文件的文件名 */这是网站上下载的程序库,一点没动 { /* UINT8 i;*/ UINT8 c; #ifndef DEF_IC_V43_U//我的硬件版本小于0x43,所以直接加了下面的代码 UINT8 s; xWriteCH376Cmd( CMD01_GET_IC_VER ); if ( xReadCH376Data( ) < 0x43 ) { if ( CH376ReadVar8( VAR_DISK_STATUS ) < DEF_DISK_READY ) { xWriteCH376Cmd( CMD10_SET_FILE_NAME ); xWriteCH376Data( 0 ); s = CH376SendCmdWaitInt( CMD0H_FILE_OPEN ); if ( s == USB_INT_SUCCESS ) { s = CH376ReadVar8( 0xCF ); if ( s ) { CH376WriteVar32( 0x4C, CH376ReadVar32( 0x4C ) + ( (UINT16)s << 8 ) ); CH376WriteVar32( 0x50, CH376ReadVar32( 0x50 ) + ( (UINT16)s << 8 ) ); CH376WriteVar32( 0x70, 0 ); } } } } #endif xWriteCH376Cmd( CMD10_SET_FILE_NAME ); /* for ( i = MAX_FILE_NAME_LEN; i != 0; -- i ) {//这个为什么注掉了,我想设置文件 名“/1111.TXT\0”,用这个循环才可以完全写入的呀! c = *name; xWriteCH376Data( c ); if ( c == 0 ) break; name ++; }*/ c = *name;//如果换成用这样的方式,只能发送“/\0”,不是设置根目录了吗 xWriteCH376Data( c ); while ( c ) { name ++; c = *name; if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 ) c = 0; /* 强行将文件名截止 */ xWriteCH376Data( c ); } xEndCH376Cmd( ); }
根目录下创建文件直接调用s=CH376FileCreate("/ABC.TXT");这个函数里包含了CH376SetFileName。注意文件名需要符合8+3格式,必须大写。你现在的现象是什么?有无错误返回值?
我直接把/ABC.TXT0发送到CH376,用被屏蔽掉的for循环,遇到'/'没停,新建文件成功了!其实刚开始我就这样设置文件名,只是没加判断固件版本的那段代码。
屏蔽和未屏蔽的两种方法都是可以设置文件名的,都是以\0结束循环。只是后一种while多了一种判断if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 ) c = 0;
#ifndef DEF_IC_V43_U//我的硬件版本小于0x43,所以直接加了下面的代码 UINT8 s; xWriteCH376Cmd( CMD01_GET_IC_VER ); if ( xReadCH376Data( ) < 0x43 ) { if ( CH376ReadVar8( VAR_DISK_STATUS ) < DEF_DISK_READY ) { xWriteCH376Cmd( CMD10_SET_FILE_NAME ); xWriteCH376Data( 0 ); s = CH376SendCmdWaitInt( CMD0H_FILE_OPEN ); if ( s == USB_INT_SUCCESS ) { s = CH376ReadVar8( 0xCF ); if ( s ) { CH376WriteVar32( 0x4C, CH376ReadVar32( 0x4C ) + ( (UINT16)s << 8 ) ); CH376WriteVar32( 0x50, CH376ReadVar32( 0x50 ) + ( (UINT16)s << 8 ) ); CH376WriteVar32( 0x70, 0 ); } } } } #endif 请问这部分代码起什么作用,对后来向文件写数据有什么影响? 我新建文件后向文件写数据,在PC上打开是一些乱码(ASC码)后面加上一些空格,写文件的流程与( UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字节为单位向当前位置写入数据块 */) 函数类似
不好意思,U盘没格式化好。没有乱码,只有空格。例如写10个'1',就是10个空格!请问这应该是哪部分程序执行的有问题?我没有移植库函数,直接用基本指令进行操作,调试程序比较乱,恕不能贴出来!
#ifndef DEF_IC_V43_U是为了兼容我们以前版本的芯片的,现在可以不使用。 写的流程按照CH376ByteWrite或者参考我们的CH376编程指南。你可以试着写入0x31、0x32...0x39,看看是否显示1、2...9。
写入16个0x31,在电脑上打开,文件只有16个空格,写数据过程中中断状态都正常,关闭文件输入参数1返回中断状态也正常,这样一个写文件的过程就结束了对吧,拔出U盘插到电脑,打开文件就应该有写入的数据,偏偏就是一堆空格!请问有其他客户遇到这种问题吗?
单纯的向新建文本文件中以字节的方式写数据,是否可以忽略对文件长度、文件指针、簇号的操作?就像手册中:8.4.5. 新建文件并写入数据 ① CMD_SET_FILE_NAME 命令+CMD_FILE_CREATE 命令,新建文件 ② 多次 CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据 ③ CMD_FILE_CLOSE 命令,参数是 1,关闭文件并允许自动更新文件长度
仅此而已这样简单,我一周前就是这样做的,一直调试到现在。看了示例程序的操作也无非就是这些步骤。。。。
把U盘格式化FAT32后,不论写入什么数据,电脑上打开全是y上面有两个点的字符,数量和写入数据的个数相同。
新建好文件之后,可以直接以字节的方式来写。流程就是按照手册上的来,如果流程正确,是不是写入数据有误?你可以用下面两个语句试一下: for(i=0;i<10;i++) buf[i]='A'; s = CH376ByteWrite(buf,10,NULL); 另外,你可以用UltraEdit看一下写入数据有无问题。
发送的数据是单一的0x31,用SPI硬件最底层的寄存器命令发送,数据之间的延时也调试过! 发现这个U盘被我写坏了,在电脑上无法向U盘里复制文件,弹出对话框提示确认路径等信息,格式化后也不行,再换个U盘看看!能否加下您的QQ?
U盘写可能你把U盘的启动扇区破坏掉了,还是你写有问题。 另外,我们这边不方便使用QQ,你可以发送到我的邮箱或者电话联系(见签名)。
我用UltraEdit看了,空格的十六进制数是0x00,而y上面有两个点的十六进制是0xff,您看一下邮箱,我发了一个文件,是向2009.TXT文件中写0x2000个0x39的结果。文件字节数完全等于0x2000(8192),就是数据不对。而且每次执行CMD_BYTE_WR_GO时U盘的灯闪两下,感觉也挺正常的!