375可以枚举,但是没中断,程序如下:

//GCC //ATMEGA16L //内部晶振 8M //CH375 _INT M16_INT0(PD2/16脚) //CH375 _CS (PC0/22脚) //CH375 _WR (PC1/23脚) //CH375 _RD (PC2/24脚) //CH375 _A0 (PC3/25脚) /* ; CH375/CH372 Bulk Data Test ; U2(AT89C51) Program ; 本程序测试数据传输的正确性,可以用于长时间连续测试,对应的计算机端的测试程序为TEST.EXE ; 方法: 下传随机长度的随机数据包,被单片机接收并将数据按位取反后返回,最终由计算机程序接收后比较数据是否正确 */

#include #include

#define CH375_CMD_PORT 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT 0xBCF0 /* CH375数据端口的I/O地址 */

//============================================================= //延时 //8M=2.25us //=============================================================

void delay2us( ) { asm("nop"); }

//============================================================= //延时指定毫秒时间,根据单片机主频调整,不精确 //8M=6180us //============================================================= void mDelaymS( unsigned char ms ) { volatile unsigned int i; while ( ms -- ) for ( i = 2600; i != 0; i -- ); }

//============================================================= // //通过并口直接读写CH375 // //向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 //============================================================= void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); PORTA = cmd; //向CH375的并口输出数据 DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的命令端口 PORTC|=(1< PORTC&=~(1< PORTC&=~(1< PORTC|=(1< DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

//输出无效的控制信号, 完成操作CH375芯片 PORTC|=(1< PORTC|=(1< PORTC|=(1< PORTC|=(1< DDRA = 0x00; //禁止数据输出 PORTC&=~(1< delay2us(); } //============================================================= // //通过并口直接写CH375 // //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= void CH375_WR_DAT_PORT( unsigned char dat ) { PORTA = dat; //向CH375的并口输出数据 DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的数据端口 PORTC&=~(1< PORTC&=~(1< PORTC&=~(1< PORTC|=(1< DDRA = 0xFF; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS

//输出无效的控制信号, 完成操作CH375芯片 PORTC&=~(1< PORTC|=(1< PORTC|=(1< PORTC|=(1< DDRA = 0x00; //禁止数据输出 delay2us(); } //============================================================= // //通过并口直接读CH375 // //从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= unsigned char CH375_RD_DAT_PORT( void ) { volatile unsigned char mData; delay2us(); DDRA = 0x00; //数据输入

//输出有效读控制信号, 读CH375芯片的数据端口 PORTC&=~(1< PORTC&=~(1< PORTC|=(1< PORTC&=~(1< DDRA = 0x00; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS mData = PINA; //从CH375的并口PA输入数据

//输出无效的控制信号, 完成操作CH375芯片 PORTC&=~(1< PORTC|=(1< PORTC|=(1< PORTC|=(1< return( mData ); } //============================================================= // // CH375初始化子程序 // //============================================================= void CH375_Init( ) { volatile unsigned char i; //测试CH375是否正常工作,可选操作,通常不需要 CH375_WR_CMD_PORT( 0x06 ); //测试CH375是否正常工作=0x06 CH375_WR_DAT_PORT( 0x55 ); //写入测试数据 i = ~ 0x55; if ( CH375_RD_DAT_PORT( ) != i ) //返回数据应该是测试数据取反 { //CH375不正常 for ( i=20; i!=0; i-- ) { CH375_WR_CMD_PORT( 0x05 ); //多次重复发命令,执行硬件复位=0x05 CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); mDelaymS(10); //延时60ms } //设置USB工作模式, 必要操作 CH375_WR_CMD_PORT( 0x15 ); //设置USB工作模式0x15 CH375_WR_DAT_PORT( 2 ); //设置为使用内置固件的USB设备方式 for ( i=100; i!=0; i-- ) { //等待操作成功,通常需要等待10uS-20uS if ( CH375_RD_DAT_PORT( ) == 0x51 ) break; //命令操作成功=0x51 } //if ( i==0 ) { CH372/CH375存在硬件错误 };

//下述启用中断,CH375连接在INT0 MCUCR=(0< MCUCR=(0< GICR=(1< GIFR=(1<}

//============================================================= // // CH375中断服务程序,使用INT0 // //============================================================= SIGNAL (INT0_vect) { GIFR=(1< volatile unsigned char InterruptStatus; volatile unsigned char i, length; volatile unsigned char buffer[ 64 ];

CH375_WR_CMD_PORT( 0x22 ); //获取中断状态并取消中断请求=0x22 InterruptStatus = CH375_RD_DAT_PORT( ); //获取中断状态 switch ( InterruptStatus ) { //分析中断状态处理 case 0x02: //USB_INT_EP2_OUT=0x02 { //批量端点下传成功 CH375_WR_CMD_PORT( 0x28 ); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区=0x28 length = CH375_RD_DAT_PORT( ); //首先读取后续数据长度 for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); //接收数据包 //测试数据正确性,将接收到的命令包数据取反后返回给PC机 CH375_WR_CMD_PORT( 0x2b ); //向USB端点2的发送缓冲区写入数据块=0x2b CH375_WR_DAT_PORT( length ); //首先写入后续数据长度,回传刚接收到的数据长度 for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~buffer[ i ] ); //数据取反后返回,由计算机应用程序测试数据是否正确 break; } case 0x0a: //USB_INT_EP2_IN=0x0a { //批量数据发送成功 CH375_WR_CMD_PORT( 0x23 ); //释放当前USB缓冲区=0x23 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT( 0x23 ); //释放当前USB缓冲区=0x23 break; } } }

//============================================================= // // 主程序 // //============================================================= int main(void ) { DDRA=0xFF; DDRC=0xFF; PORTA=0xFF; PORTC=0xFF;

mDelaymS(8); //延时约48ms等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 CH375_Init( ); //初始化CH375 sei(); //允许中断 while(1); }

是指找到了设备,没有实现下传数据?CH375的中断脚可变低了? 将三个子程序用下面这个试试. //向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 //============================================================= void CH375_WR_CMD_PORT( unsigned char cmd ) { //delay2us(); PORTA = cmd; //向CH375的并口输出数据 PORTC|=(1<DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的命令端口 PORTC|=(1<PORTC&=~(1<PORTC&=~(1< DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

PORTC|=(1<PORTC|=(1<PORTC&=~(1<//PORTC|=(1<DDRA = 0x00; //禁止数据输出

//delay2us(); } //============================================================= // //通过并口直接写CH375 // //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= void CH375_WR_DAT_PORT( unsigned char dat ) { PORTA = dat; //向CH375的并口输出数据 DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的数据端口 //PORTC&=~(1<PORTC&=~(1<PORTC&=~(1<//PORTC|=(1<DDRA = 0xFF; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS PORTC|=(1<PORTC|=(1<DDRA = 0x00; //禁止数据输出 // delay2us(); } //============================================================= // //通过并口直接读CH375 // //从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= unsigned char CH375_RD_DAT_PORT( void ) { volatile unsigned char mData; // delay2us(); DDRA = 0x00; //数据输入

//输出有效读控制信号, 读CH375芯片的数据端口 //PORTC&=~(1< PORTC&=~(1<//PORTC|=(1< PORTC&=~(1<DDRA = 0x00; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS mData = PINA; //从CH375的并口PA输入数据

//输出无效的控制信号, 完成操作CH375芯片 //PORTC&=~(1< //PORTC|=(1<PORTC|=(1<PORTC|=(1<return( mData ); }


测INT0没有低电平信号.


按照你所说,在计算机端可以找到外部接口CH375/CH372吗?如果找到的话,那么,只有在你计算机端给你发送数据之后才会出现中断的。


我用上位机TEST软件测试,INT0不为0


现在INTO为低电平,改为查询方式.上位机TEST软件返回为:return length error:0


那你用CH372DBG这个软件来调试。看下有没有数据给你返回


没有数据返回.


那在上位机给你传输数据的时候,下位机收到的中断之后,中断状态是多少?是端点2下传端点吗?如果是的话,那么,能读取到数据吗?


//GCC //ATMEGA16L //内部晶振 8M //CH375 _INT M16_INT0(PD2/16脚) //CH375 _CS (PC0/22脚) //CH375 _WR (PC1/23脚) //CH375 _RD (PC2/24脚) //CH375 _A0 (PC3/25脚) /* ; CH375/CH372 Bulk Data Test ; U2(AT89C51) Program ; 本程序测试数据传输的正确性,可以用于长时间连续测试,对应的计算机端的测试程序为TEST.EXE ; 方法: 下传随机长度的随机数据包,被单片机接收并将数据按位取反后返回,最终由计算机程序接收后比较数据是否正确 */

#include #include

#define CH375_CMD_PORT 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT 0xBCF0 /* CH375数据端口的I/O地址 */

//============================================================= //延时 //8M=2.25us //=============================================================

void delay2us( ) { asm("nop"); }

//============================================================= //延时指定毫秒时间,根据单片机主频调整,不精确 //8M=6180us //============================================================= void mDelaymS( unsigned char ms ) { unsigned int i; while ( ms -- ) for ( i = 2600; i != 0; i -- ); }

//============================================================= // //通过并口直接读写CH375 // //向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 //============================================================= void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); PORTC|=(1<PORTA = cmd; //向CH375的并口输出数据 DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的命令端口 PORTC|=(1< PORTC&=~(1< PORTC&=~(1<PORTC|=(1<DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

//输出无效的控制信号, 完成操作CH375芯片 PORTC|=(1<PORTC|=(1<PORTC|=(1<PORTC|=(1<DDRA = 0x00; //禁止数据输出 PORTC&=~(1< delay2us(); } //============================================================= // //通过并口直接写CH375 // //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= void CH375_WR_DAT_PORT( unsigned char dat ) { PORTA = dat; //向CH375的并口输出数据 DDRA = 0xFF; //并口D0-D7输出

//输出有效写控制信号, 写CH375芯片的数据端口 PORTC&=~(1< PORTC&=~(1< PORTC&=~(1<PORTC|=(1<DDRA = 0xFF; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS

//输出无效的控制信号, 完成操作CH375芯片 PORTC&=~(1<PORTC|=(1<PORTC|=(1<PORTC|=(1<DDRA = 0x00; //禁止数据输出 delay2us(); } //============================================================= // //通过并口直接读CH375 // //从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 //============================================================= unsigned char CH375_RD_DAT_PORT( void ) { unsigned char mData; delay2us(); DDRA = 0x00; //数据输入

//输出有效读控制信号, 读CH375芯片的数据端口 PORTC&=~(1< PORTC&=~(1<PORTC|=(1< PORTC&=~(1<DDRA = 0x00; //该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS mData = PINA; //从CH375的并口PA输入数据

//输出无效的控制信号, 完成操作CH375芯片 PORTC&=~(1<PORTC|=(1<PORTC|=(1<PORTC|=(1<return( mData ); } //============================================================= // // CH375初始化子程序 // //============================================================= void CH375_Init( ) { unsigned char i; //测试CH375是否正常工作,可选操作,通常不需要 CH375_WR_CMD_PORT( 0x06 ); //测试CH375是否正常工作=0x06 CH375_WR_DAT_PORT( 0x55 ); //写入测试数据 i = ~ 0x55; if ( CH375_RD_DAT_PORT( ) != i ) //返回数据应该是测试数据取反 { //CH375不正常 for ( i=20; i!=0; i-- ) { CH375_WR_CMD_PORT( 0x05 ); //多次重复发命令,执行硬件复位=0x05 CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); mDelaymS(10); //延时60ms } //设置USB工作模式, 必要操作 CH375_WR_CMD_PORT( 0x15 ); //设置USB工作模式0x15 CH375_WR_DAT_PORT( 2 ); //设置为使用内置固件的USB设备方式 for ( i=100; i!=0; i-- ) { //等待操作成功,通常需要等待10uS-20uS if ( CH375_RD_DAT_PORT( ) == 0x51 ) break; //命令操作成功=0x51 } //if ( i==0 ) { CH372/CH375存在硬件错误 }; }

//============================================================= // // 主程序 // //============================================================= int main(void ) { DDRA=0xFF; DDRC=0xFF; DDRD=0x00; PORTA=0xFF; PORTC=0xFF; PORTD=0xFF; mDelaymS(8); //延时约48ms等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 CH375_Init( ); //初始化CH375 while(1) { PORTD=0XFF; if(PIND&0x04) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ];

CH375_WR_CMD_PORT( 0x22 ); //获取中断状态并取消中断请求=0x22 InterruptStatus = CH375_RD_DAT_PORT( ); //获取中断状态 switch ( InterruptStatus ) { //分析中断状态处理 case 0x02: //USB_INT_EP2_OUT=0x02 { //批量端点下传成功 CH375_WR_CMD_PORT( 0x28 ); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区=0x28 length = CH375_RD_DAT_PORT( ); //首先读取后续数据长度 for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); //接收数据包 //测试数据正确性,将接收到的命令包数据取反后返回给PC机 CH375_WR_CMD_PORT( 0x2b ); //向USB端点2的发送缓冲区写入数据块=0x2b CH375_WR_DAT_PORT( length ); //首先写入后续数据长度,回传刚接收到的数据长度 for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~buffer[ i ] ); //数据取反后返回,由计算机应用程序测试数据是否正确 break; } case 0x0a: //USB_INT_EP2_IN=0x0a { //批量数据发送成功 CH375_WR_CMD_PORT( 0x23 ); //释放当前USB缓冲区=0x23 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT( 0x23 ); //释放当前USB缓冲区=0x23 break; } } //end switch }//end if }//end while }


用USBDEBUG软件调试,显示"读取数据错误"


我现在是问你你上位机给下位机写数据的时候,下位机有中断过来吗?中断状态是多少?


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