[求助]请教一下这个程序是否有问题

我的单片机直接与372相接 P2口接数据线,P3口中CH372_A0 = P3^7; CH372_WR = P3^4; CH372_RD = P3^5;CS接地。P3.3接372中断。我出现的问题是,第一次有提示,并看到有文件复制,说安装成功,可是一会我查看根本没找到设备。以后连有硬件接入的提示都没有,晶振好像也不正常,这个问题已出现很久,始终不得其解。下面是我的完整程序,请各位行家指点一下。

#include #include typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned long UINT32; typedef unsigned char * PUINT8; sfr ADC_CONTR =0xC5; sfr ADC_DATA =0xc6; sfr ADC_LOW2 =0xbe; sfr P1M0 =0x91; sfr P1M1 =0x92; sfr AUXR =0x8E; sbit CH372_A0 = P3^7; sbit CH372_WR = P3^4; sbit CH372_RD = P3^5; #define CMD_SET_USB_MODE 0x15 #define MAX_DATA_SIZE 60 typedef struct _USB_DOWN_PACKET { /* 下传的数据包结构,用于命令/写数据 */ UINT8 mCommand; UINT8 mLength; /* 下面的缓冲区的长度,读写操作的字节数 */ UINT8 mBuffer[ 5 ]; /* 数据缓冲区 */ } USB_DOWN_PKT; typedef struct _USB_UP_PACKET { UINT8 mStatus; UINT8 mBuffer0[ MAX_DATA_SIZE ]; UINT8 mBuffer1[ MAX_DATA_SIZE ]; /* 数据缓冲区 */ } USB_UP_PKT; typedef union _USB_DATA_PACKET { USB_DOWN_PKT down; USB_UP_PKT up; }USB_DATA_PKT; USB_DATA_PKT PACK ;

void Delay1us() { int i; for( i=3;i!=0;i--); } void Delay2us() { int i; for( i=6;i!=0;i--); } void CH375_WR_CMD_PORT(UINT8 CMD) { Delay2us(); /* 至少延时1uS */ P2 = CMD; /* 向CH372的并口输出数据 */ CH372_A0 = 1; CH372_WR = 0; /* 输出有效写控制信号, 写CH372芯片的命令端口 */ CH372_WR = 1; /* 输出无效的控制信号, 完成操作CH372芯片 */ CH372_A0 = 0; P2 = 0xFF; /* 禁止数据输出 */ Delay2us(); /* 至少延时2uS */ } void CH375_WR_DAT_PORT(UINT8 dat) { P2 = dat; /* 向CH372的并口输出数据 */ CH372_A0 = 0; CH372_RD = 1; CH372_WR = 0; /* 输出有效写控制信号, 写CH372芯片的数据端口 */ Delay1us(); CH372_WR = 1; /* 输出无效的控制信号, 完成操作CH372芯片 */ P2 = 0xFF; /* 禁止数据输出 */ Delay1us();/* 至少延时1.2uS */ } UINT8 CH375_RD_DAT_PORT(void) { UINT8 mData; Delay2us(); /* 至少延时1.2uS */ P2 = 0xFF; /* 输入 */ CH372_A0 = 0; CH372_WR = 1; CH372_RD = 0; /* 输出有效写控制信号, 读CH372芯片的数据端口 */ mData = P2; /* 从CH372的并口输入数据 */ Delay2us(); CH372_RD = 1; /* 输出无效的控制信号, 完成操作CH372芯片 */ return( mData ); } UINT8 CH372_Init(void) { UINT8 i; UINT8 j; CH375_WR_CMD_PORT(CMD_CHECK_EXIST); CH375_WR_DAT_PORT(0X55); i=~0x55; if(CH375_RD_DAT_PORT()!=i) { for(i=100;i!=0;i--) { CH375_WR_CMD_PORT(CMD_RESET_ALL); CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); for(i=250;i!=0;i--)for(j=100;j!=0;j--) Delay1us() ; CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); for(i=100;i!=0;i--)if(CH375_RD_DAT_PORT()==CMD_RET_SUCCESS)break; if(i==0){return 0;}//硬件连接错误返回错误// INT1=1; } return 1;

}

void GET_AD_RESULT(void) { UINT8 *p; UINT8 n=0; UINT8 temp; if(F0==0) p=(UINT8 *)&PACK.up.mBuffer0; else p=(UINT8 *)&PACK.up.mBuffer1; while(1) { while(ADC_CONTR&0x10)break; ADC_CONTR|=0X08; if(n { temp= (ADC_DATA>>6)&0x03; //取高2 位 *(p+n)=temp; n++; *(p+n)=ADC_DATA<<2|ADC_LOW2; 低 n++; } else break; } } void set_p1_adc_channel(void) { P1=0xff; ADC_CONTR=ADC_CONTR|0X80; P1M0=0X01; P1M1=0X01; Delay1us(); } void Senddata(void) { UINT8 cnt; UINT8* buf; CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt=MAX_DATA_SIZE; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if(F0==0) buf=(UINT8*)&PACK.up.mBuffer0; /* 指向状态包缓冲区 */ else buf=(UINT8*)&PACK.up.mBuffer1; do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } UINT8 CH372_CHECK(void) { UINT8 Status; UINT8 send=0; while(INT1==1); INT1=1; CH375_WR_CMD_PORT(CMD_GET_STATUS); Status=CH375_RD_DAT_PORT(); if (Status == USB_INT_EP2_IN) //批量数据发送成功,状态包已发送 */ { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ send=1; return (send); } return (send);

}

main(void) {

if(!CH372_Init()) return; set_p1_adc_channel(); ADC_CONTR|=0XE0; F0=0; ADC_DATA=0; ADC_LOW2=0; ADC_CONTR|=0X08; while(1) { Delay2us(); GET_AD_RESULT(); ADC_CONTR|=0x0E8; Senddata(); while(!CH372_CHECK())Senddata(); F0=~F0;

}

}

你先看一下这个帖子 /bbs/View.asp?S=101&I=24748 看你程序没有多大问题. 如果没有出现外部接口的话,你做一下测试命令看看返回值是否正确!372Init


我能够写命令进去,我查过返回值,是0X51,但是在进行CMD_CHECK_EXIST命令时,写任何数据都是返回是0X5F,特别的是晶振不正常,没有硬件接入提示,只是最开始一次能够识别,我已经做几块板子都是这个问题。


你的硬件出现问题了,首先上电后50MS延时,让372复位,不知道晶振不正常的现象是什么,如果停振的话,你换一个20P或者15P的电容,也有可能是 如果是用助焊剂焊接的小电容,由于助焊剂有导电成分,有时会振荡不起来. 根据经验有的小电容和晶振受潮漏电,导致不起振. 万用表或者示波器测量过程中会由于并联电容电阻的存在导致停振


我的晶振并没有停振,工作开始正常,都在2V 左右,接着就不行了,晶振电压一脚4.8V,一脚1.5V,还有个情况是,D+,D-,都在0V左右.


372是上电需要大概50MS的延时. UD+,UD-上出现0电平是因为372模式没有设置成功,你更换一下晶振,或者把电容换成15P,正常起振的情况下应该在2.5伏左右!你可以把原理图发到我们技术支持信箱,我们看一下,硬件设计是不是有问题!


我是照着你们资料做的,也给你们看过了,说没什么问题,我也做了几个板子,都是这情况,我第一次把程序写进去,电脑可以识别,以后就不行了.过后晶振也不正常了.


我的问题解决了,的确是红桃六说的那样,电容质量不行,把我的电源拉到了4.5V以下超成的。感谢红桃六和SCM对 我的大力帮助。感谢WCH公司对我的支持。


大哥,你的上位机是用什么显示的啊?我做的是虚拟示波器,用的是LABVIEW 显示啊。可我现在还部知道这样去显示啊,能否把你的电路图及显示给我。小弟将不胜感谢 我的邮箱:个人信息保护,已隐藏


看你的电路连接,好象是做并口的吧 如果是串口的,那程序该如何写呢?请各位指教!


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