这样做ch375测试为什么不行???十万火急

我是用51单片机控制ch375来读u盘的, 但是现在连初期的测试工作状态都通不过,以下是我的程序,还请高人指点 看看哪里需要改进?谢谢!

/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主机文件系统接口 */ /* 支持: FAT12/FAT16/FAT32 */

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

/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HF6.LIB 如果将CH375HF6换成CH375HF4就可以不支持FAT32 */ /* OHX51 CH375HFT */

#include #include

/* 以下定义的详细说明请看CH375HF6.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 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */ /* 62256提供的32KB的RAM分为两部分: 0000H-01FFH为磁盘读写缓冲区, 0200H-7FFFH为文件数据缓冲区 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 4096 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x1000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 */ /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以外部RAM剩余长度为32256字节 */ #define FILE_DATA_BUF_LEN 0x6800 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */

#include "CH375HF6.H" /* 如果不需要支持FAT32,那么请选用CH375HF4.H */

/* 在P1.4连接一个LED用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 */ //sbit P1_4 = P1^4; //#define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高电平 */ //#define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低电平驱动LED显示 */ //#define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低电平驱动LED显示 */ //sbit P1_5 = P1^5; /* 在P1.5连接一个LED用于监控演示程序的进度,低电平LED亮,当对U盘操作时亮 */ //#define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低电平驱动LED显示 */ //#define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低电平驱动LED显示 */ //sbit P1_6 = P1^6; /* 在P1.6连接一个LED用于监控演示程序的进度,低电平LED亮,当对U盘写操作时亮 */ //#define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低电平驱动LED显示 */ //#define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低电平驱动LED显示 */

/* 延时100毫秒,不精确 */ UINT8 c;

void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; } ///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////以下是自己新加入的代码///////////////////

/* 本例用I/O引脚模拟产生CH375的并口读写时序 */ /* 单片机的引脚 CH375芯片的引脚 P3.2 INT# P1.0 A0 P1.1 CS# 如果模拟出的并口上只有CH375,那么CS#可以直接接低电平,强制片选 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */ sbit CH375_A0 = P1^0; sbit CH375_CS = P1^1; sbit CH375_WR = P1^2; sbit CH375_RD = P1^3;

void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { return; }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P0 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_RD = 1; CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P0 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_RD = 1; CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延时1.2uS */ P0 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_WR = 1; CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P0; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }

/* 为printf和getkey输入输出初始化串口 void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfD; /* 24MHz晶振, 9600bps TR1 = 1; TI = 1;

}*/

main( ) { mDelay100mS( ); /* 延时100毫秒 */ CH375_PORT_INIT( ) ; mDelay100mS( ); xWriteCH375Cmd(CMD_CHECK_EXIST); xWriteCH375Data(0xaa); c=xReadCH375Data(); while(1);

}

测试一下25,26脚的电压,正常情况下为25为0,26为1. 返回的值是多少? 测试晶振是否起振?


感谢您的指点! 还请问一下, 对于我上面的程序,在测试ch375的工作状态之前,还用加上初始化ch375的函数,以及复位ch375的指令吗、? 我刚刚调试ch375,没有经验, 还请指教, 谢谢!!


上电50MS延时后就可以测试了.


非常感谢!谢谢您!


如果25为1,,26是0 是怎么回事?


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