[求助]请hcn大哥帮我看一下

当我的程序运行到/* 查询磁盘物理容量 */这部分时候,就报错了: DiskSize Error: 2C TotalSize = 0 MB

请问是什么原因呢? 我的部分程序如下:

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ }

/* 查询磁盘物理容量 */ printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //显示为以MB为单位的容量

你的DISK-READY()过了没有?


这是我的源程序 请你帮我看看: /* CH375 主机文件系统接口 */ /* 支持: FAT16 */

/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于89C52或者更大程序空间的单片机 */ /* 该程序将U盘中的/C51/CH375HFT.C文件中的小写字母转成大写字母后, 写到新建的文件NEWFILE.TXT中, 如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 并新建NEWFILE.TXT文件并写入提示信息, 如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 并新建NEWFILE.TXT文件并写入提示信息 */ /* CH375的INT#引脚采用查询方式处理, 数据复制方式为"单DPTR复制", 所以速度较慢, 适用于所有MCS51单片机 */

#include #include #include #include

/* 以下定义的详细说明请看CH375HF4.H文件 */ #define LIB_CFG_DISK_IO 1 /* 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

#define CH375_CMD_PORT_ADDR 0x7FFF /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x7EFF /* CH375数据端口的I/O地址 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ unsigned char xdata FILE_DATA_BUF_ADDR[512] _at_ 0x0000; /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */

#define CH375_INT_WIRE INT1 /* P3.3, INT1, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ #include "CH375INC.H" #include "CH375HF4.H" #include "ram.h" #define uchar unsigned char; #define uint unsigned int;

sfr AUXR = 0x8E;

uchar Counter; //数组的长度值 uchar Mid ; //发送数据的暂存变量

UINT16 start; //全局变量确定图片数据的开始位置

/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }

/* 延时1微秒,不精确 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }

void delay( unsigned char i ) { unsigned char k; for( k = i ; k > 0 ; k-- ); }

/* 延时100毫秒,不精确 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }

UINT8 mCopyCodeStringToIRAM_i( UINT8 idata *iDestination, UINT8 idata *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ }

/* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x21; TH1 = -6; /* 11.0592MHz晶振, 19200bps */ TR1 = 1; TI = 1; } /////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

main( ) { // UINT8 c; UINT16 SecCount; /* 因为图片只有8KB,所以NewSize限制为16位,实际上如果文件大于32256字节,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT32 NewSize; unsigned char i; unsigned int Count = 0; unsigned int TotleSize = 0; AUXR = 0x00;

while(1) { mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */

printf( "Start\n" ); i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ // i = mCH375Init( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ printf( "%d\n",i ); mStopIfError( i ); /* 其它电路初始化 */ printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) //break; /* 查询磁盘是否准备好 */ { printf("OK") ; } else printf("jing gao\n") ; break; /* 查询磁盘是否准备好 */ }

/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////// /* 查询磁盘物理容量 */

printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //显示为以MB为单位的容量 /* 读取Road.txt文件*/ printf( "Open SAVEDATA.bin\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "\\SAVEDATA.BIN" ); i = CH375FileOpen( ); mStopIfError( i ); printf( "Road\n" ); if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { SecCount = FILE_DATA_BUF_LEN / 512; //由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 NewSize = FILE_DATA_BUF_LEN; // 由于RAM有限所以限制长度 } else { // 如果原文件较小,那么使用原长度 SecCount = ( CH375vFileSize + 511 ) / 512; // (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 NewSize = CH375vFileSize; // 原文件的长度 } printf( "Size=%ld, Len=%ld, Sec=%d\n", CH375vFileSize, NewSize, SecCount );

TotleSize = CH375vFileSize;

SecCount = 1;

mCmdParam.Read.mSectorCount = SecCount; //读取全部数据,如果超过60个扇区则只读取60个扇区 CH375vFileSize += 511; // 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 i = CH375FileRead( ); // 从文件读取数据 CH375vFileSize -= 511; // 恢复原文件长度 mStopIfError( i ); printf( "Close\n" ); i = CH375FileClose( ); // 关闭文件 mStopIfError( i );

printf("%d\n",FILE_DATA_BUF[0]);

printf( "ok ! You can Take out your usb! \n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */ //ram_end( ); mDelay100mS( ); mDelay100mS( ); } while(1); }

运行结果如下: Start 0 Wait Udisk Ready ? jing gao DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 29108 ok ! You can Take out your usb!


你的DISK-READY没过啊!你在DISK-READY那加循环看可以不可以过,还有就是你的U盘供电多少?有的U盘供电低于4。8V就不工作了,要是还不行的话,换个U盘试下。


我的U盘供电是4.86V,而且ACT#的信号灯是亮的 我也将部分程序该为 /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) //break; /* 查询磁盘是否准备好 */ { printf("OK") } else printf("jing gao\n") break; /* 查询磁盘是否准备好 */ }

改为: for ( i = 0; i < 10; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); while ( CH375DiskReady( ) == ERR_SUCCESS ); //break; /* 查询磁盘是否准备好 */ printf("OK\n") ; //else printf("jing gao\n") ; break; /* 查询磁盘是否准备好 */ }

运行结果如下:这说明是能检测到U盘的,而且磁盘是准备好的 Start 0 Wait Udisk Ready ? OK DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 20916 ok ! You can Take out your usb!


程序这样改在试下: for ( i = 0; i < 10; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }


我改了,运行结果如下:好象没有检测到U盘呀 这是为什么呀????!!!!! Start 0 Wait Udisk Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 20916 ok ! You can Take out your usb!


那是你上面的程序有问题,这样的话,你换个U盘试下看可以不可以


我用 CH375DiskReady( ) 这个子程序是在库CH375HF4.LIB里头的 应该是没问题的呀 为什么检测不到U盘呢


通过下面的程序知道磁盘已经连接,但是尚未初始化或者无法识别该磁盘。 也就是在 if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ 这一步没有成功操作,这是为什么???

while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ printf("OKOKOKOK\n"); mDelay100mS( ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ mDelay100mS( );


磁盘连接并不代表磁盘可以进行操作。初始化的时候分为以下几个步骤: 1,初始化USB寄存器 2,获取USB存储器的容量 3,检测USB存储器是否准备好 实际在库中的操作比这个还要全面,是按照计算机对U盘进行初始化过程进行操作的


能不能将 “初始化USB寄存器” 的程序给在下呀


我给的只是一个参考的过程,实际在库文件里面做的比这个全面,所以我建议你换个U盘试下


我在启动程序时测量了一下 CS#引脚的 电压发现是 4.9V 是不是这个原因呀


CS的电压在不工作的时候是高电平,你用万用表是看不出来的,要看就要拿示波器看


我也不知道是什么原因,我想是不是硬件上相连的和程序的地址不匹配呀? 我在硬件上是这样相连的 连接 单片机 CH375 P0口 —— D0~D7 P2_0 —— A0 P2_7 —— CS# INT1 —— INT# RD#(17脚) —— RD#(4脚) WR#(16脚) —— WR#(3脚)


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