我的程序运行上传一次数据后,即显示USB设备拔出。只能上传一次数据,请各位帮忙了,我单片机用的是89S52,AD用ADC0809,单片机24M晶振,CH372用的是12M晶振。以下是程序,麻烦各位看看!貌似初始化都没执行好,中断没进入。。。 #pragma NOAREGS #pragma AREGS
#include #include #include #include "CH375INC.H"
#define TEST_ERR P2_1 #define TEST_INT P2_2 #define AD_START P3_1 #define AD_OE P3_0 #define AD_EOC P3_4 //INT0 P3_2
unsigned char volatile xdata CH372_CMD_PORT _at_ 0x0100; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH372_DAT_PORT _at_ 0x0000; /* CH375数据端口的I/O地址 */
unsigned char ad0809() { unsigned char x; AD_OE=0; AD_START=0; AD_START=1; AD_START=0; while(AD_EOC==0){;} AD_OE=1; x=P1; AD_OE=0; return(x) ; }
/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 8; i != 0; i -- ); /* 根据单片机的时钟选择初值 */ }
/* 基本操作 */
void CH372_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); CH372_CMD_PORT=cmd; delay2us(); }
void CH372_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ delay2us( ); CH372_DAT_PORT=dat; }
unsigned char CH372_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ // delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ // ******************** 注释中是用普通I/O引脚模拟8位并口的时序
/******************** */ delay2us( ); return( CH372_DAT_PORT); }
/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
/* CH375初始化子程序 */ void CH372_Init( ) { unsigned char i; /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH372_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH372_WR_DAT_PORT( 0x55 ); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH372_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=160; i!=0; i-- ) { CH372_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ CH372_RD_DAT_PORT( ); } CH372_WR_CMD_PORT( 0 ); Delay50ms( ); Delay50ms( ); /* 延时50ms */ } /* 设置USB工作模式, 必要操作 */ CH372_WR_CMD_PORT( CMD_SET_USB_MODE ); CH372_WR_DAT_PORT(2 ); /* 设置为使用内置固件的USB设备方式 */ for ( i=200; i!=0; i-- ) /* 等待操作成功,通常需要等待10uS-20uS */ { if ( CH372_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } if ( i==0 ){TEST_ERR=0;} /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }
/* CH375中断服务程序,使用寄存器组1 */ void mCh372Interrupt( ) interrupt 0 using 1 {
unsigned char InterruptStatus; IE0 = 0;//清除中断标志 CH372_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH372_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) /* 分析中断状态处理 */ { case USB_INT_EP2_OUT: /* 批量端点下传成功 */ { break; } case USB_INT_EP2_IN: //数据发送成功中断程序 { TEST_INT=0; CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }
void main( void ) { unsigned char UsbSendBuf ; Delay50ms( ); Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH372_Init( ); /* 初始化CH375 */ Delay50ms( ); EA = 1; /* 允许中断 */ do { UsbSendBuf=ad0809(); CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); CH372_WR_DAT_PORT(1); CH372_WR_DAT_PORT(UsbSendBuf); } while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }