请问程序运行 CH375DiskReady( ) 或者 CH375FileOpen( ) 时,卡在头文件中 xQueryInterrupt( ) 的 while ( CH375_INT_WIRE ) 命令行,是什么原因?应该如何解决啊?
那你测下USB口电压是多少,UD+,UD-可串电阻了,程序执行到这里时CH375的中断脚有没有变低,中断脚有没有定义.
USB口电压为 4.963V,插上 U 盘后,电压为 4.961V, UD+,UD-串接了3欧左右的电阻,中断引脚定义为 #define CH375_INT_WIRE PTH_PTH1 ,我想程序执行到这里时CH375的中断脚可能没有变低,不然程序不会卡在 while ( CH375_INT_WIRE ) 命令行,检测不到中断信号.
我将单片机复位之后,运行程序,插上 U 盘,程序就卡在 CH375FileOpen( ) 中的 while ( CH375_INT_WIRE ) 命令行. 如果我不拔除 U 盘,复位单片机后再运行程序,程序就卡在 CH375DiskReady( ) 中的 while ( CH375_INT_WIRE ) 命令行. 请问是何原因?
用的是什么单片机,单片机的RAM是多少,将UD+,UD-的电阻去掉看有没有这种情况.
我使用的是 MC9S12D64 单片机,该单片机有 64K Flash EEPROM,1K byte EEPROM,4K byte RAM. 我去掉 UD+,UD- 上的电阻后,问题仍然存在. 并且,有些 U 盘在运行 CH375LibInit( ),CH375DiskConnect( ),CH375DiskReady( ),CH375DiskSize( ) 时,工作正常,返回值也正确.但是运行 CH375FileOpen( ) 时,程序跑飞! 请问是何原因?
磁盘缓冲区配置是正确?
磁盘缓冲区配置如下: #define DISK_BASE_BUF_ADDR 0x0A00 #define FILE_DATA_BUF_ADDR 0x0C00 #define FILE_DATA_BUF_LEN 0x0400 定义在 4K byte RAM 内. 但是,我发现一个问题,51单片机的参考程序中有一段这样的程序: UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); } 该函数中定义的 idata 和 code 的变量类型,以及在主函数中定义的 UINT8 code *pCodeStr 在51系列单片机的 Keil 51 编译环境下可以识别和编译通过,但是,我使用的是 MOTO 公司的 MC9S12D64 单片机和 Metrowerks CodeWarrior 编译软件,在此环境中,编译软件不识别 idata 和 code 的变量类型! 之前,我只是简单的去掉了 idata 和 code 特征符,但是 CH375FileOpen( ) 和 CH375FileCreate( ) 函数运行时,不是程序跑飞就是返回错误代码 0x1F,再不就是卡在 xQueryInterrupt( void ) 中的 while ( CH375_INT_WIRE ) 命令行. 请问应该如何改写或者替代上述函数,或着函数中的 idata 和 code 类型变量? 谢谢!
对不起!之前由于编译软件有文件破损,导致程序跑飞! 现在使用 CH375FileOpen( ) 查询时,返回 0x43 ,但是,调用 CH375FileCreate( ) 时,返回 0xFF !(状态参数 CH375DiskStatus = 0x13,CH375IntStatus = 0x14) 我的主程序编写如下: void main( ) { UINT8 i,c,j,SecCount; UINT8 *pCodeStr; UINT16 EnumCount; CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( ); // 开机后LED亮一下以示工作 mDelaymS( 200 ); LED_OUT_INACT( ); mDelaymS( 200 ); m=TEST_CH375_PORT( ); n = CH375LibInit( ); // 初始化CH375程序库和CH375芯片,操作成功返回0 mStopIfError( n );
while ( 1 ) { while ( CH375DiskStatus < DISK_CONNECT ) { // 查询CH375中断并更新中断状态,等待U盘插入 CH375DiskConnect( ); mDelaymS( 100 ); } for ( i = 0; i < 100; i ++ ) { // 最长等待时间,100*50mS mDelaymS( 50 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; // 查询磁盘是否准备好 / if ( CH375DiskStatus < DISK_CONNECT ) break; // 检测到断开,重新检测并计时 if ( CH375DiskStatus >= DISK_MOUNTED && i > 5 ) break; // 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS } p = CH375DiskSize( ); mStopIfError( p );
pCodeStr = "\\*"; for ( EnumCount = 0; EnumCount < 10; EnumCount ++ ) { // 最多搜索前10个文件 i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); // 搜索文件名,*为通配符 mCmdParam.Open.mPathName[ i ] = 0xFF; // 根据字符串长度将结束符替换为搜索的序号,从0到254,如果是0xFF即255则说明搜索序号在CH375vFileSize变量中 CH375vFileSize = EnumCount; // 指定搜索/枚举的序号 q = CH375FileOpen( ); //打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 if ( q == ERR_MISS_FILE ) break; //再也搜索不到匹配的文件,已经没有匹配的文件名 else if ( q == ERR_FOUND_NAME ) { //搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 continue; //继续搜索下一个匹配的文件名,下次搜索时序号会加1 } else { //出错 mStopIfError( q ); break; }
mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); // 新文件名,在根目录下 r = CH375FileCreate( ); // 新建文件并打开,如果文件已经存在则先删除后再新建 mStopIfError( r ); }
if ( SafeRemoveDisk( ) == USB_INT_SUCCESS ) { // 安全移除U盘 LED_OUT_ACT( ); } while ( CH375DiskStatus >= DISK_CONNECT ) { // 查询CH375中断并更新中断状态,等待U盘拔出 CH375DiskConnect( ); mDelaymS( 100 ); } }
} 请问是何原因导致可以搜索目录文件,却不能创建文件?