如上图是我自己做的一个CH375B电路,但是在做好板子之后,375的晶振可以起振,测量XI、XO两管脚电压在2.5V左右。灯D11不亮。CH375二管脚也就是复位管脚电压为0。设置模式2后,PC机识别不了375,PC机上装有驱动,但没有任何显示。且UD+、UD-电压为负0.0几伏。当进行取反测试时,单片机通过串口读回的数据为0x0FFH。 程序如下:
#include #include #define CH375_D0_D7 P0 sbit CH375_CS=P2^2; sbit CH375_WR = P3^6; sbit CH375_RD = P3^7; sbit CH375_A0 = P2^0; #define CMD_CHECK_EXIST 0x06 #define CMD_RESET_ALL 0x05 #define CMD_SET_USB_MODE 0x15 #define CMD_RET_SUCCESS 0x51 unsigned char a,b,i,dat; /***********************************************************************************************/ /* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char k, j; for ( k=200; k!=0; k-- ) for ( j=250; j!=0; j-- ); }
/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char j; for ( j = 2; j != 0; j -- ); /* 根据单片机的时钟选择初值 */ } /******************************************************************************************/
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); /* 用普通I/O引脚模拟8位并口的时序,CH375_CS引脚是可选的,可以一直接GND强制片选 */ CH375_D0_D7 = cmd; CH375_A0 = 1; //选择CH375的命令口 CH375_RD = 1; //如果I/O默认电平是高电平,那么这是可选操作 CH375_CS = 0; CH375_WR = 0; CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平 delay2us(); }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ /* 用普通I/O引脚模拟8位并口的时序 */ CH375_D0_D7 = dat; CH375_CS = 0; CH375_WR = 0; CH375_WR = 1; CH375_CS = 1; CH375_D0_D7 = 0xFF; // 对于准双向I/O,请在此设置输出全高电平 }
unsigned char CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ /* 用普通I/O引脚模拟8位并口的时序 */ CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平,便于输入 delay2us(); CH375_CS = 0; CH375_RD = 0; delay2us(); dat = CH375_D0_D7; CH375_RD=1; CH375_CS=1; CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平 return( dat ); } void CH375_Init( ) { /* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); delay2us(); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */ for ( a=100; a!=0; a-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } if ( a==0 ) //{ CH372/CH375存在硬件错误 }; */ SBUF=0X00; else SBUF=0X01; /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ Delay50ms( ); /* 延时50ms */ }
/***********************************************************************************************/ void main (void) { TMOD = 0x20; //在11.0592M下,设置波特率9600,方式1 TL1 = 0xfd; TH1 = 0xfd; SCON = 0Xd8; PCON = 0X00; TR1 = 1; while(1) { CH375_Init( ); while(TI == 0); TI = 0; } }
希望各位指正一下错误。谢谢大家。