[原创]CH375V有问题

自检通过,创建文件返回0x10,结束文件返回0xb4,插入和拔出的返回状态都是对的,但是就是写入文件后 U盘内没有文件,请问怎么回事?是3.3V的原因吗?

应该不是,可能是你的程序上面没控制好


哪里没有控制好?写的时候U盘的灯还一闪一闪的呢,可就是数据没有写入进去


你在写完数据之后有没有更新文件长度?


有,现在是连文件名都创建不了,发送 strcpy( (char *)mCmdParam.Create.mPathName, "\\2.TXT" ); /* 新文件名,在根目录下 */ i = CH375FileCreate(); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ 后返回 0x10; mCmdParam.Write.mSectorCount = 1; i = CH375FileWriteX( );/* 向文件写入数据 */ 后返回0xb4就关闭文件了. 这个我用51做过 ch375A的


那你前面的初始化都过了没有?


有呀,i=CH375LibInit(); Uart0_Send_A_Byte(0xff); Uart0_Send_A_Byte(i); // 如果成功,返回值为0 返回0x00.

是不是我写数据的函数不对?但是我检查不出来问题呀 void xWriteCH375Data( uint8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { IO1CLR |= 0x00FF0000; /* 清并口输出 */ IO1SET |= (uint32)mData << 16; /* 向CH375的并口输出数据 */ IO1DIR |= 0x00FF0000; /* 设置8位并口为输出 */ IO0DIR |= 0x002D0000; /* 写操作所以数据输出, 设置CS,WR,RD,A0为输出 */ /* 写CH375芯片的数据端口, A0(P0.16)=0; CS(P0.21)=0; WR=(P0.18)=0; RD(P0.19)=1; */ IO0CLR |= USB_A0; IO0CLR |= USB_CS; IO0CLR |= USB_WR; IO0SET |= USB_RD; IO0DIR = IO0DIR; IO0DIR = IO0DIR; IO0DIR = IO0DIR;IO0DIR = IO0DIR; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelay1_2uS( ); /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.16)=0; CS(P0.21)=1; WR=(P0.18)=1; RD(P0.19)=1; */ IO0SET |= USB_RD; IO0SET |= USB_CS; IO0SET |= USB_WR; IO0CLR |= USB_A0; /* 输出A0(P0.16)=0; 可选操作 */ IO1DIR &= 0xFF00FFFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1.2uS */ }


这个写数据的函数没什么问题,那你的DISK-READY过了没有?


有哦 if(USBDiskStatus != CH375IntStatus) {USBDiskStatus = CH375IntStatus; Uart0_Send_A_Byte(0xee); Uart0_Send_A_Byte(CH375IntStatus); if(CH375IntStatus ==USB_INT_CONNECT) // 如果检测到U盘插上了 {mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ //* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for(i=0;i<10;i++) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } i=CH375DiskQuery(); // 查询当前文件的信息 CH375DirtyBuffer(); Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); mDelaymS( 200 ); write_file_step=0x01; //开始写文件 } else if(CH375IntStatus ==USB_INT_DISCONNECT) // 如果检测到U盘断开了 {write_file_step=0x00; //不再写文件结束 } }


插入和拔出检测都是对的


上面的程序,DISK-READY函数,假如你运行了10次的话,你的程序没有做任何的判断,那么你的程序也认为是过了的。


是呀,示范程序就这么写的呀,用单片机实现是对的


你后面返回的0X10可能就是你前面的DISK-READY没有过


哦,谢谢,我再试试,可这个disc_ready要是不过怎么办?


就是这个没有过,可是我等很久它都不过,那怎么办? for(i=0;i<200;i++) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } 现在除了返回0x10外,还能返回0x14,但是一样的产生不了文件名


这是USB的写入程序,请帮我看看 void USBProcess(void) { static uint8 USBDiskStatus=USB_INT_DISCONNECT; static uint8 write_file_step=0x00; //写文件的 uint8 i=0; // 查询 U盘 是否有插入和拔出 xQueryInterrupt(); // 取得USB的信息状态 // 如果 检测到有U盘插入 if(USBDiskStatus != CH375IntStatus) {USBDiskStatus = CH375IntStatus; Uart0_Send_A_Byte(0xee); Uart0_Send_A_Byte(CH375IntStatus); if(CH375IntStatus ==USB_INT_CONNECT) // 如果检测到U盘插上了 {mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ //* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for(i=0;i<200;i++) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); i=CH375DiskQuery(); // 查询当前文件的信息 CH375DirtyBuffer(); Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); mDelaymS( 200 ); write_file_step=0x01; //开始写文件 } else if(CH375IntStatus ==USB_INT_DISCONNECT) // 如果检测到U盘断开了 {write_file_step=0x00; //不再写文件结束 } } // ------------------------------------------------------------------------ // ---------数据的写入---------------------------- if(write_file_step!=0x00) {if(write_file_step==0x01) //创建文件名 {strcpy( (char *)mCmdParam.Create.mPathName, "\\2.TXT" ); /* 新文件名,在根目录下 */ i = CH375FileCreate(); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ Uart0_Send_A_Byte(0xec); Uart0_Send_A_Byte(i); write_file_step=0x02; } else if(write_file_step==0x02) {write_file_step=0x03; } else if(write_file_step==0x03) //写入文件 {mCmdParam.Write.mSectorCount = 1; i = CH375FileWriteX( );/* 向文件写入数据 */ Uart0_Send_A_Byte(0xeb); Uart0_Send_A_Byte(i); write_file_step=0x04; } else if(write_file_step==0x04) {mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2006, 8, 18 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = 4096; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ write_file_step=0x05; } else if(write_file_step==0x05) //结束文件 {i = CH375FileClose( ); /* 关闭文件 */ Uart0_Send_A_Byte(0xea); Uart0_Send_A_Byte(i); write_file_step=0x00; }

}

}


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