372初始化都成功,能收到CMD_RET_SUCCESS,我将372挂在ARM的外部中断2上,能进入中断,并正确接收/发送数据,但有个问题: 1.如果PC机发送几个字节,我在中断程序里设置断点,372申请中断后,ARM能接收到正确的长度和正确的数据,但会2次进入中断服务程序。当第2次进入中断服务程序时,接收到的长度是0,为什么PC发送1次,会两次进入中断程序? 2.372能发送的数据包最大是4096个字节,我现在需要PC机一次发送4096个字节,但我在中断程序里加上断点,372应该是每64个字节申请1次中断,一共申请64次中断,但我发现只能收到3次中断,前2次长度是64个字节,第3次是0个字节。
附上中断处理程序:
void __irq IRQ_Eint2(void) { EXTINT = 0x04; // 清除EINT2中断标志 CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ delay2us(); //延迟两个微秒 switch (InterruptStatus) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ delay2us(); //延迟2微秒后 length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */
case USB_INT_EP2_IN: { /* 批量数据发送成功,当ARM向CH372发数,如果成功,就进入这个判断分支 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break;} default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 CH375_WR_CMD_PORT表示令CH372的A0=1,表示下面访问的是命令口 */ break;} }
VICVectAddr = 0; // 向量中断结束 }