logo

关于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);
}

}
这人很懒,什么都没留下
热门产品推荐 : 无线充电管理芯片CH246
初始话CH372有没有成功,正确找到USB设备,程序没问题
no excuse!
只有登录才能回复,可以选择微信和github账号登录