CH375b并口查询 一直无法连接成功 !错误 80 或FF 是什么错误啊

电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# P2.4 = A0 P2.6= INT#

程序如下:#include #include #include #include

#define MAX_PATH_LEN 32 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H,CH375模块支持的最大值是64,最小值是13 */ #include "CH375HM.H"

/* 电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# 如果没有外部RAM,那么CS#=P26,如果有超过16KB的外部RAM,那么CS#=P27 & ! P26 & ...,所以CS#的片选地址为BXXXH P2.4 = A0 p2.6= INT# 虽然连接到INT0,但是本程序只是查询模块的INT#的状态,所以可以用P1口等普通I/O引脚代替INT0 说明 没有外界RAM 使用STC89C58RD

*/ sbit INT = P2^6; sbit P1_0 = P1^0; #define CH375HM_INDEX XBYTE[0x60F0] /* CH375模块的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0x70F1] /* CH375模块的数据端口的I/O地址 */ #define CH375HM_INT_WIRE INT /* 假定CH375模块的INT#引脚连接到单片机的INT0引脚 */

/* 假定文件数据缓冲区: ExtRAM: 0000H-7FFFH */ unsigned char xdata DATA_BUF[ 512 * 64 ] _at_ 0x0000; /* 外部RAM的文件数据缓冲区,从该单元开始的缓冲区长度不小于一次读写的数据长度,最少为512字节 */

CMD_PARAM mCmdParam; /* 默认情况下该结构将占用64字节的RAM,可以修改MAX_PATH_LEN常量,当修改为32时,只占用32字节的RAM */ unsigned char mIntStatus; /* CH375模块的中断状态或者操作完成状态 */

sbit LED_OUT = P1^4; /* P1.4 低电平驱动LED显示,用于监控演示程序的进度 */

/* 对于模拟的并口读写时序或者其它并口读写方式,请修改以下3个子程序 */ #define CH375HM_INDEX_WR( Index ) { CH375HM_INDEX = (Index); } /* 写索引地址 */ #define CH375HM_DATA_WR( Data ) { CH375HM_DATA = (Data); } /* 写数据 */ #define CH375HM_DATA_RD( ) ( CH375HM_DATA ) /* 读数据 */

/* 以毫秒为单位延时,适用于24MHz时钟 */ void mDelaymS( unsigned char delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ } } 以后的和例子一样!! 接U盘 一直提示 错误 80 或FF 是什么错误啊

INT#引脚不能接P2。6,建议接P1口上面在做测试


/* 电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# 如果没有外部RAM,那么CS#=P26,如果有超过16KB的外部RAM,那么CS#=P27 & ! P26 & ...,所以CS#的片选地址为BXXXH P2.4 = A0 p1.3 =INT# 虽然连接到INT0,但是本程序只是查询模块的INT#的状态,所以可以用P1口等普通I/O引脚代替INT0 */ sbit INT = P1^3; sbit P1_0 = P1^0; #define CH375HM_INDEX XBYTE[0x60f0] /* CH375模块的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0x70f1] /* CH375模块的数据端口的I/O地址 */ #define CH375HM_INT_WIRE INT

/* 假定文件数据缓冲区: ExtRAM: 0000H-7FFFH */ unsigned char xdata DATA_BUF[ 512 * 64 ] _at_ 0x0000; /* 外部RAM的文件数据缓冲区,从该单元开始的缓冲区长度不小于一次读写的数据长度,最少为512字节 */

CMD_PARAM mCmdParam; /* 默认情况下该结构将占用64字节的RAM,可以修改MAX_PATH_LEN常量,当修改为32时,只占用32字节的RAM */ unsigned char mIntStatus; /* CH375模块的中断状态或者操作完成状态 */

sbit LED_OUT = P1^4; /* P1.4 低电平驱动LED显示,用于监控演示程序的进度 */

问题还是一样的。串口受到Start Wait Udisk后 一直没有变化。CH375B 24脚接LED 灯没有亮 !


全部的的程序

/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2007 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Module @CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* U盘文件读写模块, 连接方式: 并口+查询 */ /* MCS-51单片机C语言示例程序, 仅适用于V3.0A及以上版本的模块 */ /* 因为使用U盘文件读写模块而不是使用U盘文件级子程序库,所以占用较少的单片机资源,可以使用89C51单片机测试 */

#include #include #include #include

#define MAX_PATH_LEN 32 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H,CH375模块支持的最大值是64,最小值是13 */ #include "CH375HM.H"

/* 电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# P2.4 = A0 p1.3 =INT# 虽然连接到INT0,但是本程序只是查询模块的INT#的状态,所以可以用P1口等普通I/O引脚代替INT0 */ sbit INT = P1^3; sbit P1_0 = P1^0; #define CH375HM_INDEX XBYTE[0x60f0] /* CH375模块的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0x70f1] /* CH375模块的数据端口的I/O地址 */ #define CH375HM_INT_WIRE INT /* 假定CH375模块的INT#引脚连接到单片机的INT0引脚 */

/* 假定文件数据缓冲区: ExtRAM: 0000H-7FFFH */ unsigned char xdata DATA_BUF[ 512 * 64 ] _at_ 0x0000; /* 外部RAM的文件数据缓冲区,从该单元开始的缓冲区长度不小于一次读写的数据长度,最少为512字节 */

CMD_PARAM mCmdParam; /* 默认情况下该结构将占用64字节的RAM,可以修改MAX_PATH_LEN常量,当修改为32时,只占用32字节的RAM */ unsigned char mIntStatus; /* CH375模块的中断状态或者操作完成状态 */

sbit LED_OUT = P1^4; /* P1.4 低电平驱动LED显示,用于监控演示程序的进度 */

/* 对于模拟的并口读写时序或者其它并口读写方式,请修改以下3个子程序 */ #define CH375HM_INDEX_WR( Index ) { CH375HM_INDEX = (Index); } /* 写索引地址 */ #define CH375HM_DATA_WR( Data ) { CH375HM_DATA = (Data); } /* 写数据 */ #define CH375HM_DATA_RD( ) ( CH375HM_DATA ) /* 读数据 */

/* 以毫秒为单位延时,适用于24MHz时钟 */ void mDelaymS( unsigned char delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */ } }

/* 执行命令 */ unsigned char ExecCommandBuf( unsigned char cmd, unsigned char len, unsigned char xdata *bufstart ) /* 输入命令码和输入参数长度,返回操作状态码,输入参数和返回参数都在CMD_PARAM结构中 */ /* 输入参数bufstart仅用于CMD_FileRead或者CMD_FileWrite命令,指定外部RAM缓冲区的起始地址,可以参考中断方式C程序采用全局变量buffer的方式 */ { unsigned char i, status; unsigned char data *buf; unsigned char xdata *CurrentBuf; CH375HM_INDEX_WR( PARA_COMMAND_ADDR ); CH375HM_DATA_WR( cmd ); /* 向索引地址PARA_COMMAND_ADDR写入命令码 */ if ( len ) { /* 有参数 */ i = len; CH375HM_INDEX_WR( PARA_BUFFER_ADDR ); /* 指向缓冲区 */ buf = (unsigned char *)&mCmdParam; /* 指向输入参数的起始地址 */ do { CH375HM_DATA_WR( *buf ); /* 从索引地址PARA_BUFFER_ADDR开始,写入参数 */ buf ++; } while ( -- i ); } CH375HM_INDEX_WR( PARA_CMD_LEN_ADDR ); CH375HM_DATA_WR( len | PARA_CMD_BIT_ACT ); /* 向索引地址PARA_CMD_LEN_ADDR写入后续参数的长度,最高位通知模块,说明命令包已经写入,请求开始执行命令 */ CurrentBuf = bufstart; /* 外部RAM缓冲区起始地址,仅用于FileRead或者FileWrite命令 */ while ( 1 ) { /* 处理数据传输,直到操作完成才退出 */

#if 1 while ( CH375HM_INT_WIRE ); /* 等待模块完成操作产生低电平中断,最佳检测方式是对模块的INT#信号进行下降沿边沿检测 */ #else do { /* 如果不需要扇区方式读写,那么可以查询模块的命令码单元代替查询模块INT#引脚 */ CH375HM_INDEX_WR( PARA_COMMAND_ADDR ); } while ( CH375HM_DATA_RD( ) ); /* 模块操作完成时该值会清0,仅适用于非扇区方式读写 */ #endif

CH375HM_INDEX_WR( PARA_STATUS_ADDR ); /* 写入索引地址 */ status = CH375HM_DATA_RD( ); /* 从索引地址PARA_STATUS_ADDR读取中断状态 */ CH375HM_INDEX_WR( PARA_CMD_LEN_ADDR ); CH375HM_DATA_WR( PARA_CMD_BIT_INACT ); /* 中断应答,取消来自模块的中断请求 */ /* 因为模块在收到中断应答后3uS之内才撤消中断请求,所以,如果是查询INT#信号的低电平,那么在发出中断应答后3uS之内不应该再查询INT#信号的状态 但是由于51单片机较慢,下面的处理时间已经超过3uS,所以不必另加延时等待模块撤消中断请求 */ if ( status == ERR_SUCCESS ) { /* 操作成功 */ CH375HM_INDEX_WR( PARA_STS_LEN_ADDR ); i = CH375HM_DATA_RD( ); /* 从索引地址PARA_STS_LEN_ADDR读取返回结果数据的长度,计数 */ if ( i ) { /* 有结果数据 */ CH375HM_INDEX_WR( PARA_BUFFER_ADDR ); /* 指向缓冲区 */ buf = (unsigned char *)&mCmdParam; /* 指向输出参数的起始地址 */ do { *buf = CH375HM_DATA_RD( ); /* 从索引地址PARA_BUFFER_ADDR开始,读取结果 */ buf ++; } while ( -- i ); } // status = ERR_SUCCESS; break; /* 操作成功返回 */ } else if ( status == USB_INT_DISK_READ ) { /* 正在从U盘读数据块,请求数据读出 */ CH375HM_INDEX_WR( PARA_BUFFER_ADDR ); /* 指向缓冲区 */ i = 64; /* 计数 */ do { /* 要提高文件数据读写速度,这段程序用汇编程序效率更高,在C51中,do+while比for或者while结构效率高 */ *CurrentBuf = CH375HM_DATA_RD( ); /* 从索引地址0到63依次读出64字节的数据 */ CurrentBuf ++; /* 读取的数据保存到外部缓冲区 */ } while ( -- i ); /* 上面这一小段C程序用汇编程序效率要高近一倍 */ CH375HM_INDEX_WR( PARA_CMD_LEN_ADDR ); CH375HM_DATA_WR( PARA_CMD_BIT_ACT ); /* 通知模块继续,说明64字节数据已经读取完成 */ } else if ( status == USB_INT_DISK_WRITE ) { /* 正在向U盘写数据块,请求数据写入 */ CH375HM_INDEX_WR( PARA_BUFFER_ADDR ); /* 指向缓冲区 */ i = 64; /* 计数 */ do { CH375HM_DATA_WR( *CurrentBuf ); /* 向索引地址0到63依次写入64字节的数据 */ CurrentBuf ++; /* 写入的数据来自外部缓冲区 */ } while ( -- i ); CH375HM_INDEX_WR( PARA_CMD_LEN_ADDR ); CH375HM_DATA_WR( PARA_CMD_BIT_ACT ); /* 通知模块继续,说明64字节数据已经写入完成 */ } else if ( status == USB_INT_DISK_RETRY ) { /* 读写数据块失败重试,应该向回修改缓冲区指针 */ CH375HM_INDEX_WR( PARA_BUFFER_ADDR ); /* 指向缓冲区 */ i = CH375HM_DATA_RD( ); /* 大端模式下为回改指针字节数的高8位,如果是小端模式那么接收到的是回改指针字节数的低8位 */ status = CH375HM_DATA_RD( ); /* 大端模式下为回改指针字节数的低8位,如果是小端模式那么接收到的是回改指针字节数的高8位 */ CurrentBuf -= ( (unsigned short)i << 8 ) + status; /* 这是大端模式下的回改指针,对于小端模式,应该是( (unsigned short)status << 8 ) + i */ CH375HM_INDEX_WR( PARA_CMD_LEN_ADDR ); CH375HM_DATA_WR( PARA_CMD_BIT_ACT ); /* 通知模块继续,说明重试状态码已经处理完成 */ } else { /* 操作失败 */ if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) { /* U盘刚刚连接或者断开,应该延时几十毫秒再操作 */ mDelaymS( 100 ); if ( CH375HM_INT_WIRE ) break; /* 没有中断则返回,如果仍然有中断请求说明之前的中断是U盘插拔通知中断,现在再处理命令完成中断而暂不返回 */ } else break; /* 操作失败返回 */ } } /* while( CH375HM_INT_WIRE == 0 ); 如果单片机速度很快,有可能该程序返回前模块尚未撤消中断请求,那么应该等待中断请求引脚无效 */ return( status ); }

/* 执行命令 */ unsigned char ExecCommand( unsigned char cmd, unsigned char len ) /* 输入命令码和输入参数长度,返回操作状态码,输入参数和返回参数都在CMD_PARAM结构中 */ { return( ExecCommandBuf( cmd, len, 0 ) ); /* 只有CMD_FileRead或者CMD_FileWrite命令用到输入参数bufstart,其它命令没有用到 */ }

/* 检查操作状态,如果错误则显示错误代码并停机,应该替换为实际的处理措施 */ void mStopIfError( unsigned char iError ) { unsigned char led; if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (unsigned short)iError ); /* 显示错误 */ led=0; while ( 1 ) { LED_OUT = led&1; /* LED闪烁 */ mDelaymS( 100 ); led^=1; } }

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


如果你那边有示波器的话,建议你这样操作,首先死循环的发送索引地址,用示波器去看下各个引脚在WR的上升延的时候个个信号线是否正常,其次,写数据端口,按照上面的方法在看下各个引脚的信号线是否正常。


公司没有 家里有。要回家测试了。 能再具体讲讲吗?具体看那个脚 。发索引地址是发60FF 吗? 谢谢 了 最好给个例子! 我用的单片机晶体是11。0592M


在帮看看 我程序是否错误!! /* **************************************** ** Copyright (C) W.ch 1999-2007 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Module @CH375 ** **************************************** */ /* CH375 主机文件系统接口模块 */ /* 支持: FAT12/FAT16/FAT32 */ /* U盘文件读写模块C语言头文件 */

#ifndef __CH375HM_H__ #define __CH375HM_H__

#define CH375HM_VER 0x30 /* 当前模块版本 */

/* ********************************************************************************************************************* */ /* 返回的操作状态码 */ /* 以下是事件通知状态码,检测到当前U盘已经连接或者已经断开,可以作为最终状态码 */ #define ERR_USB_CONNECT 0x15 /* 检测到USB设备连接事件,磁盘已经连接 */ #define ERR_DISK_DISCON 0x82 /* 检测到USB设备连接事件,磁盘已经断开,或者磁盘尚未连接 */ /* 代码0XH用于USB设备方式的操作状态代码,由CH375返回,是USB设备模式的中断状态 */ #define ERR_USB_DAT_DOWN 0x02 /* USB设备模式: 数据下传成功,上位机下传的数据已经在模块中 */ #define ERR_USB_DAT_UP 0x0A /* USB设备模式: 数据上传成功,模块中的上传数据已经被上位机取走 */ /* 以下是阶段性的状态码,用于请求数据交换,不是最终的操作状态 */ #define USB_INT_DISK_READ 0x1D /* USB存储器读数据块,只用于CMD_FileRead命令,请求数据读出 */ #define USB_INT_DISK_WRITE 0x1E /* USB存储器写数据块,只用于CMD_FileWrite命令,请求数据写入 */ #define USB_INT_DISK_RETRY 0xEE /* USB存储器读写数据块失败重试,只用于CMD_FileRead命令和CMD_FileRead命令,操作失败重试 */ /* USB_INT_DISK_RETRY重试状态码要求用户端程序回改文件数据缓冲区指针,以便重新发送或者接收文件数据, 在USB_INT_DISK_RETRY重试状态码之后用户端程序将收到两个字节的数据,也就是一个16位的数据,指定需要回改指针的字节数,大端时高字节在前,小端时低字节在前 */ /* 最终状态码 */ #define ERR_SUCCESS 0x00 /* 操作成功 */ #define ERR_CH375_ERROR 0x81 /* CH375硬件错误,可能需要复位CH375 */ #define ERR_STATUS_ERR 0x83 /* 磁盘状态错误,可能正在连接或者断开磁盘 */ #define ERR_MBR_ERROR 0x91 /* 磁盘的主引导记录无效,可能磁盘尚未分区或者尚未格式化 */ #define ERR_TYPE_ERROR 0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */ #define ERR_BPB_ERROR 0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */ #define ERR_TOO_LARGE 0xA2 /* 磁盘非正常格式化并且容量大于4GB,或者容量大于250GB,需要由WINDOWS采用默认参数重新格式化 */ #define ERR_FAT_ERROR 0xA3 /* 磁盘的文件系统不支持,只支持FAT12/FAT16/FAT32,需要由WINDOWS采用默认参数重新格式化 */ #define ERR_DISK_FULL 0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */ #define ERR_FDT_OVER 0xB2 /* 目录内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于500个,需要磁盘整理 */ #define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录没有找到,可能是目录名称错误 */ #define ERR_FILE_CLOSE 0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */ #define ERR_OPEN_DIR 0x41 /* 指定路径的目录被打开 */ #define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */ #define ERR_FOUND_NAME 0x43 /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中,如果需要使用,应该打开该文件 */ #define ERR_USB_DISK_ERR 0x1F /* USB存储器操作失败,在初始化时可能是USB存储器不支持,在读写操作中可能是磁盘损坏或者已经断开 */ /* 其余错误代码未定义,可以发出命令CMD_QueryStatus查询模块状态并分析 */

/* ********************************************************************************************************************* */ /* 磁盘及文件状态,适用于CMD_PARAM.Status.mDiskStatus */ #define DISK_UNKNOWN 0x00 /* 尚未初始化,未知状态 */ #define DISK_DISCONNECT 0x01 /* 磁盘没有连接或者已经断开 */ #define DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */ #define DISK_MOUNTED 0x03 /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */ #define DISK_READY 0x10 /* 已经分析磁盘的文件系统并且能够支持 */ #define DISK_OPEN_ROOT 0x12 /* 已经打开根目录,扇区模式,只能以扇区为单位读写目录的内容,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */ #define DISK_OPEN_DIR 0x13 /* 已经打开子目录,扇区模式,只能以扇区为单位读写目录的内容 */ #define DISK_OPEN_FILE 0x14 /* 已经打开文件,扇区模式,可以以扇区为单位进行数据读写 */ #define DISK_OPEN_FILE_B 0x15 /* 已经打开文件,字节模式,可以以字节为单位进行数据读写 */

/* ********************************************************************************************************************* */ /* FAT类型标志,适用于CMD_PARAM.Query.mDiskFat */ #define DISK_FS_UNKNOWN 0 /* 未知的文件系统 */ #define DISK_FAT12 1 /* FAT12文件系统 */ #define DISK_FAT16 2 /* FAT16文件系统 */ #define DISK_FAT32 3 /* FAT32文件系统 */

/* ********************************************************************************************************************* */ /* 文件属性,适用于CMD_PARAM.Modify.mFileAttr */ #define ATTR_READ_ONLY 0x01 /* 文件为只读属性 */ #define ATTR_HIDDEN 0x02 /* 文件为隐含属性 */ #define ATTR_SYSTEM 0x04 /* 文件为系统属性 */ #define ATTR_VOLUME_ID 0x08 /* 卷标 */ #define ATTR_DIRECTORY 0x10 /* 子目录 */ #define ATTR_ARCHIVE 0x20 /* 文件为存档属性 */ #define ATTR_LONG_NAME ( ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID ) /* 文件属性 unsigned char */ /* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */ /* 只 隐 系 卷 目 存 未定义 */ /* 读 藏 统 标 录 档 */ /* 文件时间 unsigned short,适用于CMD_PARAM.Modify.mFileTime */ /* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */ #define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 */ /* 文件日期 unsigned short,适用于CMD_PARAM.Modify.mFileDate */ /* Date = ((Year-1980)<<9) + (Month<<5) + Day */ #define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据 */

/* ********************************************************************************************************************* */ /* 文件名,适用于CMD_PARAM.?.mPathName */ #define PATH_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */ #define PATH_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */ #define PATH_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */ #ifndef MAX_PATH_LEN #define MAX_PATH_LEN 65 /* 最大路径长度,含所有斜杠分隔符和小数点间隔符以及路径结束符00H,并口方式下最大值为62 */ #endif #if MAX_PATH_LEN > 65 #undef MAX_PATH_LEN #define MAX_PATH_LEN 65 #endif #ifndef MAX_BYTE_IO #define MAX_BYTE_IO ( MAX_PATH_LEN - 1 ) /* 以字节为单位单次读写文件时的最大长度,超过该长度可以分多次读写,并口方式下最大值为61 */ #endif #if MAX_BYTE_IO > 64 #undef MAX_BYTE_IO #define MAX_BYTE_IO 64 #endif

/* ********************************************************************************************************************* */ /* 外部命令码 */ #define CMD_QueryStatus 0x60 /* 查询当前模块的状态 */ #define CMD_DiskQuery 0x61 /* 查询磁盘信息 */ #define CMD_FileEnumer 0x63 /* 枚举文件,返回文件名 */ #define CMD_FileOpen 0x64 /* 打开文件 */ #define CMD_FileCreate 0x65 /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ #define CMD_FileErase 0x66 /* 删除文件并关闭 */ #define CMD_FileClose 0x67 /* 关闭当前文件 */ #define CMD_FileQuery 0x68 /* 查询当前文件的信息 */ #define CMD_FileModify 0x69 /* 查询或者修改当前文件的信息 */ #define CMD_FileLocate 0x6A /* 移动当前文件指针 */ #define CMD_FileRead 0x6B /* 从当前文件读取数据 */ #define CMD_FileWrite 0x6C /* 向当前文件写入数据 */ #define CMD_ByteLocate 0x7A /* 以字节为单位移动当前文件指针 */ #define CMD_ByteRead 0x7B /* 以字节为单位从当前文件读取数据块 */ #define CMD_ByteWrite 0x7C /* 以字节为单位向当前文件写入数据块 */ #define CMD_BulkOnlyCmd 0x70 /* 执行基于BulkOnly协议的命令 */ #define CMD_DiskReady 0x71 /* 查询磁盘是否准备好 */ #define CMD_DiskSize 0x72 /* 查询磁盘容量 */ #define CMD_FileDirInfo 0x75 /* 存取当前已打开文件的目录信息 */ #define CMD_DirCreate 0x76 /* 新建目录并打开,如果目录已经存在则直接打开 */ #define CMD_FileReadLast


具体的将,假如在死循环的往索引地址上面发送0XAA的索引地址,那么,这个时候,一个示波器去探测WR引脚,在WR的上升延去用示波器的另外几个引脚,例如,发送0XAA的所以地址的话,在WR的上升延,A0=0,CS=0,RD=1,D7-D0的数据为10101010。这个你需要去测模块引脚,而不能去测单片机引脚。相同的方法,你去测试写数据是否一样。


测试结果:使用STC89C58RD+ 电路连接 /* 电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# P24 = A0 P1.3 = INT# */ sbit PINT = P1^3; #define CH375HM_INDEX XBYTE[0x6FFF] /* CH375模块的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0x7FFF] /* CH375模块的数据端口的I/O地址 */ #define CH375HM_INT_WIRE PINT /* 假定CH375模块的INT#引脚连接到单片机的INT0引脚 */

/* 假定文件数据缓冲区: ExtRAM: 0000H-7FFFH */ unsigned char xdata DATA_BUF[ 512 ]_at_ 0x1FF;

....... main( ) { // unsigned char i, c, SecCount; // unsigned long OldSize; // unsigned short NewSize, count; LED_OUT = 0; /* 开机后LED亮一下以示工作 */ mDelaymS( 200 ); /* 延时100毫秒,CH375模块上电后需要100毫秒左右的复位时间 */ mDelaymS( 250 ); LED_OUT = 1; mInitSTDIO( ); printf( "Start\n" ); // mCmdParam.Setup.mSetup = 0x01; /* 输入参数: 模块配置值,位0为1则空闲时查询U盘连接状态并自动中断通知 */ // i = ExecCommand( CMD_SetupModule, 1 ); /* 设置模块配置 */ // mStopIfError( i ); /* 其它电路初始化 */ while ( 1 ) { /* 主循环 */

CH375HM_INDEX_WR( 0xaa );

在WR 由0到1时,AO=0 CS=0 P0。0 P0。2 P0。3 P0。4 PO。6 P0。7 均为由1到0 或由0到1的变化 而P0。2和P0。5 一直是高电平 (1)。 发CH375HM_DATA_WR(0XAA) ;结果和上面一样 。?这样对吗? 感觉是不是CH375坏了啊!(没有新片更换)

还有什么问题啊?

问 :我用STC89C58RD+ 连接CH375

另有P2。0--P2。3做I/O中断可以吗?会影响CH375吗? 电路连接方式 单片机 模块 P0 = D0-D7 RD = RD# WR = WR# P2.7 = CS# P24 = A0 P1.3 = INT# */ sbit PINT = P1^3; #define CH375HM_INDEX XBYTE[0x60FF] /* CH375模块的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0x70FF] /* CH375模块的数据端口的I/O地址 */ #define CH375HM_INT_WIRE PINT


没有使用 外部RAM 对U盘操作 只是改名、查询等 能推荐个历程吗?(使用并口+查询的例程!)谢谢了!


5.4.1 初始化(除数据流模式的命令外,进行任何一种文件操作之前的必要步骤) ⑴ 初始化单片机与模块之间的接口,设置必要的参数等 ⑵ 等待U 盘连接(中断方式依靠CH375 事件通知,查询方式依靠主动查询) ⑶ CMD_DiskReady,可选步骤,强烈建议执行此步骤 ⑷ CMD_DiskSize,可选步骤,通常不需要

能详细说明初始化的过程吗?都对什么初始化 例如对并口+查询都要初始化什么内容啊?


while ( 1 ) { /* 主循环 */

CH375HM_INDEX_WR( 0x0a );CH375HM_INDEX_WR( 0x00 );

在WR 由0到1时,AO=0 CS=0 P0。0 P0。2 P0。3 P0。4 PO。6 P0。7 均为由1到0 或由0到1的变化 P0。2和P0。5 也由1到0 或由0到1的变化 能解释是什么原因吗?


while ( 1 ) { /* 主循环 */

CH375HM_INDEX_WR( 0x0a );

} 应该按照上面的程序来操作,看下每一个I/O口的电平,要确切的说明在WR的上升延的时候没个I/O口的电平是多少


发表于:2008-3-8 8:57:00,来源于:58.213.74.48 ,发贴心情: ----------------------------------------------------------------------------------------------------- while ( 1 ) { /* 主循环 */

CH375HM_INDEX_WR( 0x0a );

} 应该按照上面的程序来操作,看下每一个I/O口的电平,要确切的说明在WR的上升延的时候没个I/O口的电平是多少 wr 为上升沿 P0。7--P0。0 是00001010 这样对吗? 但P0。1一直是高电平。P0。4为脉冲 (矩形波)

请解答下列问题 !:5.4.1 初始化(除数据流模式的命令外,进行任何一种文件操作之前的必要步骤) ⑴ 初始化单片机与模块之间的接口,设置必要的参数等 ⑵ 等待U 盘连接(中断方式依靠CH375 事件通知,查询方式依靠主动查询) ⑶ CMD_DiskReady,可选步骤,强烈建议执行此步骤 ⑷ CMD_DiskSize,可选步骤,通常不需要

能详细说明初始化的过程吗?都对什么初始化 例如对并口+查询都要初始化什么内容啊?

没有使用 外部RAM 对U盘操作 只是改名、查询等 能推荐个历程吗?(使用并口+查询的例程!)谢谢了!


记得看过 HCN 在论坛中发过关于并口+查询 字节读写的例子 能在给发下吗? 找不到 了!

发表于:2008-3-8 8:57:00,来源于:58.213.74.48 ,发贴心情: ----------------------------------------------------------------------------------------------------- while ( 1 ) { /* 主循环 */

CH375HM_INDEX_WR( 0x0a );

} 应该按照上面的程序来操作,看下每一个I/O口的电平,要确切的说明在WR的上升延的时候没个I/O口的电平是多少 wr 为上升沿 P0。7--P0。0 是00001010 这样对吗? 但P0。1一直是高电平。P0。4为脉冲 (矩形波)

请解答下列问题 !:5.4.1 初始化(除数据流模式的命令外,进行任何一种文件操作之前的必要步骤) ⑴ 初始化单片机与模块之间的接口,设置必要的参数等 ⑵ 等待U 盘连接(中断方式依靠CH375 事件通知,查询方式依靠主动查询) ⑶ CMD_DiskReady,可选步骤,强烈建议执行此步骤 ⑷ CMD_DiskSize,可选步骤,通常不需要

能详细说明初始化的过程吗?都对什么初始化 例如对并口+查询都要初始化什么内容啊?

没有使用 外部RAM 对U盘操作 只是改名、查询等 能推荐个历程吗?(使用并口+查询的例程!)谢谢了!


如果按照你上面说的在WR的上升延为这个的话,示波器看到的数据是这个数据的话那是没有问题的。 1,这个初始化主要是只对单片机的一些和模块连接的I/O口的初始化,例如设置I/O口的方向等等。 2,实际是发送查询U盘是否连接的命令,如果连接的话,那么,返回的数据的第2个字节就是代表U盘是否连接 3,发送这个命令是将U盘初始化,否则不能对U盘进行正确的操作 4,这个命令仅仅是用来查询U盘的容量的,如果你不需要U盘的容量的话,也可以不需要。


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