关于CH372的中断

想问一下,CH372在发送完一组数据后是自动将INT#置为低电平吗? 为什么。.我在做的时候,发完一组数据那个INT#的电平仍然为高,根本不能触发单片机的中断啊.这是什么原因,我的程序如下,希望大家能告诉我怎么样才能使CH372的INT#脚为低电平,触发单片机的中断? /* MCS-51单片机C语言的示例程序 */

#include #include #include #include "CH375INC.H" #define CH372_INT_WIRE INT0 typedef unsigned char UINT8; typedef unsigned char *PUINT8; UINT8 Len; UINT8 IntStatus; int i,j; unsigned char b[10]={0,0,0,0,0,0,0,0,0,0}; unsigned char a[10]={1,1,1,1,1,1,1,1,1,1};

typedef struct _COMMAND_PACKET { /* 自定义的命令包结构 */ unsigned char mCommandCode; /* 命令请求码,见下面的定义 */ unsigned char mCommandCodeNot; /* 命令码的反码,用于校验命令包 */ union { unsigned char mParameter[5]; /* 参数 */ struct { unsigned char mBufferID; /* 缓冲区识别码,本程序针对MCS51单片机定义: 1-专用功能寄存器SFR, 2-内部RAM, 3-外部RAM, 不过本程序实际只演示内部RAM */ unsigned int mBufferAddr; /* 读写操作的起始地址,寻址范围是0000H-0FFFFH,低字节在前 */ unsigned int mLength; /* 数据块总长度,低字节在前 */ } buf; } u; } mCOMMAND_PACKET, *mpCOMMAND_PACKET;

#define CONST_CMD_LEN 0x07 /* 命令块的长度 */ /* 由于命令与数据都是通过数据下传管道(USB端点2的OUT)下传, 为了防止两者混淆, 我们可以在计算机应用程序与单片机程序之间约定, 命令块的长度总是7, 而数据块的长度肯定不是7, 例如64,32等 另外, 可以约定, 命令块的首字节是命令码, 等等 本程序约定命令码: 80H-0FFH是通用命令,适用于各种应用 00H-7FH是专用命令,针对各种应用特别定义 */ /* 通用命令 */ #define DEF_CMD_GET_INFORM 0x90 /* 获取下位机的说明信息,长度不超过64个字符,字符串以00H结束 */ #define DEF_CMD_TEST_DATA 0x91 /* 测试命令,下位机将PC机发来的命令包的所有数据取反后返回 */ #define DEF_CMD_CLEAR_UP 0xA0 /* 在上传数据块之前进行同步,实际是让下位机清除上传缓冲区的已有内容 */ #define DEF_CMD_UP_DATA 0xA1 /* 从下位机的指定地址的缓冲区中读取数据块(上传数据块) */ #define DEF_CMD_DOWN_DATA 0xA2 /* 向下位机的指定地址的缓冲区中写入数据块(下传数据块) */ /* 专用命令 */

/* 对于MCS51单片机在使用通用命令时,还需要指定缓冲区识别码 */ #define ACCESS_MCS51_SFR 1 /* 读写51单片机的SFR */ #define ACCESS_MCS51_IRAM 2 /* 读写51单片机的内部RAM */ #define ACCESS_MCS51_XRAM 3 /* 读写51单片机的外部RAM */

unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */

/* 延时2微秒,不精确 */ void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); }

/* 延时50毫秒,不精确 */ /*void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }*/

/* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ void CH372_WR_CMD_PORT( UINT8 cmd ) { //Delay2us( ); CH375_CMD_PORT=cmd; //Delay2us(); }

/* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ void CH372_WR_DAT_PORT( UINT8 dat ) { CH375_DAT_PORT=dat; //Delay2us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ }

/* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ UINT8 CH372_RD_DAT_PORT( void ) { //Delay2us(); return(CH375_DAT_PORT); }

void CH372_WR_DATA(PUINT8 buf,UINT8 len) { CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); CH372_WR_DAT_PORT(len); if (len) { do { CH372_WR_DAT_PORT(*buf); buf++; } while (--len); } }

/* CH375初始化子程序 */ void CH372_Init( ) { int k; /* 设置USB工作模式, 必要操作 */ CH375_CMD_PORT = CMD_SET_USB_MODE; Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ CH375_DAT_PORT = 2; /* 设置为使用内置固件的USB设备方式 */ for (k=100; k!=0; k--) { /* 等待操作成功,通常需要等待10uS-20uS */ if (CH375_DAT_PORT==CMD_RET_SUCCESS) break; } /* 下述启用中断,假定CH372连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ EA = 1; /* 允许中断 */ }

/*CH375中断服务程序INT0,使用寄存器组1 */ void mCH375Interrupt( ) interrupt 0 using 1 { CH372_WR_CMD_PORT(CMD_GET_STATUS); IntStatus = CH372_RD_DAT_PORT( ); switch(IntStatus) { case USB_INT_EP2_IN: CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } }

main( ) { CH372_Init( ); /* 初始化CH375 */ while(1) { CH372_WR_DATA(b,10); } }

初始话CH372有没有成功,正确找到USB设备,程序没问题


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