CH375工作在内置固件模式下,连接到计算机有提示,并且安装了驱动。用公司给的CH375/372调试软件调试时,通过端点2上传数据,点完之后调试软件就一直没有反应了。 我的程序如下所示,请大家帮忙看看,不胜感激~~ #include #include"CH375INC.H"
typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned long UINT32;
sbit A0=P3^3;
/* 延时2微秒,不精确,需要根据硬件实际情况调整 */ void Delay2us( ) { UINT8 i; for ( i=1000; i!=0; i-- );
} void Delay5ms() { UINT8 j; for (j=1000;j!=0;j--) { Delay2us(); }
}
//写命令函数 void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay2us(); A0=1; RD=1; WR=0; P1=cmd; WR=1; Delay2us(); } //写数据函数 void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ A0=0; RD=1; WR=0; P1=dat; WR=1; Delay2us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */
} ////读数据 函数 UINT8 CH375_RD_DAT_PORT(){ UINT8 USBData; //P1=0xff;// 端口数据清零 A0=0; WR=1; RD=0; RD=0; Delay2us(); USBData=P1; Delay2us(); RD=1; return USBData ;
}
//初始化CH375 选择内置固件 模式
void CH375_Init(){
/* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */; IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH372中断,假定CH372的INT#引脚连接到单片机的INT0 */
}
UINT8 UsbLength; /* USB数据缓冲区中数据的长度 */ UINT8 UsbBuffer[ CH375_MAX_DATA_LEN ]={'1','2','3','4','5','6','7','8'};/* USB数据缓冲区 */ //CH375_MAX_DATA_LEN =60
// 中断函数 /* CH375中断服务程序,假定CH375的INT#引脚连接到单片机的INT0,使用寄存器组1 */ void CH375Interrupt( void ) interrupt 0 using 1 {
UINT8 IntStatus; UINT8 cnt; UINT8 *buf; EX0=0;//关外部中断 CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ Delay2us(); IntStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */
switch( IntStatus ) { /* 分析中断状态 */
case USB_INT_EP2_OUT: /* 批量端点下传成功,接收到数据 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ /* 如果使用CMD_RD_USB_DATA0命令码,那么读取数据块后不会自动释放缓冲区,需要CMD_UNLOCK_USB命令后才释放 */ UsbLength = cnt = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ if ( cnt ) { /* 接收到数据放到缓冲区中 */ buf = UsbBuffer; /* 指向缓冲区 */ do { *buf = CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */ buf ++; } while ( -- cnt ); } else break; /* 长度为0,没有数据,在某些应用中也可以将长度0定义为一种特殊命令 */
/* 分析接收到的数据并处理,此处略去,下面示回传数据 */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = UsbLength; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } break;
case USB_INT_EP2_IN: /* 批量端点上传成功,数据发送成功 */ /* 如果还有数据需要接着发送,可在此通过CMD_WR_USB_DATA7命令写入,参考前面的回传 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ cnt = 10; CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */ if ( cnt ) { /* 将缓冲区中的数据发出 */ buf = UsbBuffer; /* 指向缓冲区 */ do { CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */ buf ++; } while ( -- cnt ); } CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ break; case USB_INT_EP1_IN: /* 中断端点上传成功,中断数据发送成功 */ /* 中断端点可以用于单片机及时通知计算机端,本程序未用到 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; case USB_INT_EP1_OUT: /* 辅助端点下传成功,接收到辅助数据 */ /* 辅助端点可以用于计算机端向单片机端发送包,本程序未用到,辅助数据的接收可以参考批量端点 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break;
///////////////*暂时还不懂的部分 ///////////////////////////////////////////////////////////// #ifdef ENABLE_USB_SUSPEND /* 默认情况下不会出现这些中断状态,只有当执行相应的命令后才会出现这些状态,根据需要处理 */ case USB_INT_USB_SUSPEND: /* USB总线挂起事件,只有当执行过CMD_CHK_SUSPEND命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ CH375_WR_CMD_PORT( CMD_ENTER_SLEEP ); /* 这是可选操作,进入低功耗睡眠挂起状态 */ break;
case USB_INT_WAKE_UP: /* 从睡眠中被唤醒事件,只有当执行过CMD_ENTER_SLEEP命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; #endif default: /* 内置固件的USB方式下不应该出现其它中断状态,如果启用USB总线挂起检查,那么还要处理USB总线挂起和睡眠唤醒事件 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } }
main(){ Delay5ms();//延时5ms CH375_Init(); IT0=1;//负电平中断 EX0=1; //外部中断开 EA=1;//CPU开中断
}