关于372的中断问题[求助]

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; // 向量中断结束 }

你第2次进中断,还是进入的是批量端点下传成功的中断里面去吗?正常情况下只有372接收到数据之后才将372的中断线拉低,如果存在干扰的话,那是不会获取到正确的中断状态的,你查下你第2次进中断的时候程序跑到哪去了


经过测试: 2次进入中断程序后,读InterruptStatus都等于0X02 (批量端点下传成功) 具体是:PC发送7个字节后 InterruptStatus length buffer[] 第一次进入中断 02 7 正 确 第而次进入中断 02 0 由于length=0,buffer[]不赋值


hcn 麻烦来帮我一下,谢谢了。。。。为什么会有这个现象?


正在测试


已经测试过了,我们这边没有什么问题,我给你我改的程序,你可以参考,上位机就用CH372DEBUG来调试,下位机就用我给你的程序来调试看可以不可以


非常感谢。请问程序在哪儿?


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