CH375无法识别U盘

我自己参考沁恒公司的CH372芯片的中文版说明书 版本3.5.pdf,的窜口方式,做了一个作品,新型单片机编程器,但是做到CH375识别U盘时,却无法识别,我用1602做跟踪显示,但显示模块只显示初始化时的第一句“Please insert U pan!”,但当我插入U盘后它却没显示“The U pan had been inserted! ”,即,CH375无法识别U盘已经插入,不知道是我的原理图有错还是我的硬件电路有错,我测量了CH375和AVR单片机的电压都正常为5V,但就识别不了U 盘,现在特急,因为这是毕设,过些天就要交上去,恳请各位大虾给小弟指导指导!以下时我的原理图,以及程序CH375test为测试程序,1602.h为显示模块的程序,AVR为控制单片机,51为下载终端单片机。UploadImages/20094141535419.rar

你的硬件结构是:单片机<---------->CH375<---------->U盘? 串口 USB 若是,那么你的程序参考错了,现在的程序我们U盘读写模块的例程 下载CH375EVT.ZIP,参考\CH375EVT\PUB\MCS51C\MISCELL下的程序,只要把375的接口函数改为串口方式即可,不知道你是用了什么单片机,操作U盘的话,建议采用我们的子程序库:\CH375EVT\PUB\CH375HF.PDF


你的硬件结构是:单片机<---------->CH375<---------->U盘 串口 USB

我的参考程序是PUB/SER_SYNC,是看CH375HM.PDF所说的,里面的:示例程序->(8)三线串口连接,串口等待状态,它给出了51单片机的例子。我用的时AVR单片机。非常谢谢您的解答,我用您的建议试试!


我看了您说的,\CH375EVT\PUB\MCS51C\MISCELL,里面的四个示例程序,在程序部分/* 设置CH375为USB主机方式 */说到,CH375出错,例如芯片型号错或者处于串口方式或者不支持 ,那不是不支持串口吗?那不是不能用这个参考程序?


我们的例程是并口方式,在主机模式下可以采用串口通信,以51为例,对于例程只要做2个部分修改 (1)串口初始化为9位数据方式,默认波特率为9600 (2)void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); TI = 0; TB8 = 1; /* 表示命令 */ SBUF = cmd; while( TI == 0 ); delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ TI = 0; TB8 = 0; /* 表示数据 */ SBUF = dat; while( TI == 0 ); delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ }

unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ UINT8 dat; delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ while( RI == 0 ); dat = SBUF; RI = 0; return( dat ); } 另,程序中串口打印输出printf去掉


我参照CH375芯片的中文版说明书 版本3.5.pdf里的串口连接图,我的原理图里,CH375的A0,CS,WR,RE,都没跟单片机连接到,复位键RSTI也是照它的连接个电容再接地,但看程序里却有写入命令和写入数据之分,看了看资料说是根据A0的电平决定的,还有你写入数据和命令的WR管脚我没接,读命令的RE管脚我也没接,我这样的接法是不是错了?


非常感谢您的指导.请原谅我大胆举动,可以加您的QQ吗?我希望在这最关键的几天,遇到关于CH375的问题,可以尽快的问您,及时的得到您的解答,身边的人都不熟悉CH375芯片,导师也没用过,出差去了还没回来.现在一头雾水!若能得您的及时帮助,我将感激不尽,并能出色的完成任务!


(1)我们工作期间只可以通过邮件或BBS与客户交流 (2)想确一下,究竟是通过什么口操作CH375的,并口或串口?感觉你把这两种接口混淆了,建议参考CH375DS1.PDF中对这两种接口的解释


串口啊,U盘的-UD,+UD与CH375的-UD,+UD相连,CH375的TXD,RXD与AVRM16单片机的TXD,RXD相连,现在我做了几根跳线,让CH375的A0,CS,WR,RE管脚与M16的几个管脚相连.这个不是很明显的串口连接吗?并口的话要将RXD管脚直接接地,我看CH375芯片的中文版说明书 版本3.5.pdf,里面是这么说的!


(1)并口模式下,是把TXD接地,RXD悬空 (2)串口模式下,不需要关系A0,CS,WR,RD,它们都是悬空的 请再把8.2. 串口方式部分看看


哦,我看了你们公司给的我的参考程序是PUB/SER_SYNC,是看CH375HM.PDF所说的,里面的:示例程序->(8)三线串口连接,串口等待状态,它给出了51单片机的例子。难道我参考的串口程序真的错了吗?可是CH375HM.PDF里面明明是这样说的啊!


现在头脑好乱,您让我参考的程序CH375EVT\PUB\MCS51C\MISCELL里面有/* 设置CH375为USB主机方式 */这个函数,还有void CH375Interrupt( ) interrupt 0 using 1这个函数,unsigned char mCH375Init( )这几个函数都用得到吗?或者更具体一点,可以给我说说我这个作品需要到那些具体函数吗?


如果是工作在串口模式下的话,那么你需要在CH375LIB.ZIP里面的MCS51文件夹下面的FILELIB5的例子程序,你只需要修改三个读写子函数以及中断引脚的定义(查询方式)或者中断的配置(中断方式)就可以实现读写U盘


CH375EVT\PUB\MCS51C\MISCELL 这里面的例程你可以用,只需要修改一下三个读写函数,参考4楼程序,把单片机串口设置成9位数据模式,波特率为9600bps ,CH375的TXD,RXD分别与AVRM16单片机的RXD,TXD相连


CH375HM.PDF是我们U盘读写模块的说明文档。其次,你需要参考CH375EVT\PUB\MCS51C\MISCELL下的程序,但是不要参考EXAM0下的device那是CH375做设备的例子程序,参考MISCELL下的EXAM1例子程序,你的接口方式不是并口,你需要修改的接口函数就是第四楼所列举出的.


现在我打算做一个简单测试程序,测试CH375识别U盘。参考12楼的建议。自己根据CH375HFT.C修改了部分程序,用ICC编译,可是程序一直提示出错贵公司给的头文件出错。错误如下: CH375HF5.H(407): syntax error; found `*' expecting `;'

406到408行代码如下: #ifndef PUINT8C typedef unsigned char code *PUINT8C; #endif 这是我的简单测试程序,请问是不是我的程序哪里写错了?

程序如下:

#include #include #include "CH375HF5.H" #include "1602.h"

void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { return; } void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }

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

UINT8 TI,TB8,SBUF,RI; void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); delay2us( ); delay2us( ); }

void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); delay1us( ); }

UINT8 xReadCH375Data( void ) { delay1us(); while ( RI == 0 ); RI = 0; return( SBUF ); }

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

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ LCD_write_string(0,0,"Error: %02X"); /* 显示错误 */ } void mInitSTDIO( ) { UBRRH = 0; UBRRL = 47; /* 9600bps@7.3728MHz */ UCSRB = 0x1C; /* BIT(RXEN) | BIT(TXEN);|BIT(UCSZ2) */ UCSRC = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); 9个数据位 设置串口为9位数据设置波特率和其它串口参数*/ }

main( ) { UINT8 i; mInitSTDIO( ); LCD_write_string(0,0, "Start" ); mDelay100mS( ); mDelay100mS( ); i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */

while ( 1 ) { LCD_write_string(0,0,"Wait Udisk" ); mDelay100mS( ); mDelay100mS( ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ mDelay100mS( );

/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); LCD_write_string(0,0,"Ready ?" ); mDelay100mS( ); mDelay100mS( ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */ LCD_write_string(0,0,"Too large sector"); LCD_write_string(0,1,"size"); mDelay100mS( ); mDelay100mS( ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif LCD_write_string(0,0,"Open" ); mDelay100mS( ); mDelay100mS( ); } }


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