372初始化都成功,能收到CMD_RET_SUCCESS,我將372掛在ARM的外部中斷2上,能進(jìn)入中斷,并正確接收/發(fā)送數(shù)據(jù),但有個(gè)問(wèn)題: 1.如果PC機(jī)發(fā)送幾個(gè)字節(jié),我在中斷程序里設(shè)置斷點(diǎn),372申請(qǐng)中斷后,ARM能接收到正確的長(zhǎng)度和正確的數(shù)據(jù),但會(huì)2次進(jìn)入中斷服務(wù)程序。當(dāng)?shù)?次進(jìn)入中斷服務(wù)程序時(shí),接收到的長(zhǎng)度是0,為什么PC發(fā)送1次,會(huì)兩次進(jìn)入中斷程序? 2.372能發(fā)送的數(shù)據(jù)包最大是4096個(gè)字節(jié),我現(xiàn)在需要PC機(jī)一次發(fā)送4096個(gè)字節(jié),但我在中斷程序里加上斷點(diǎn),372應(yīng)該是每64個(gè)字節(jié)申請(qǐng)1次中斷,一共申請(qǐng)64次中斷,但我發(fā)現(xiàn)只能收到3次中斷,前2次長(zhǎng)度是64個(gè)字節(jié),第3次是0個(gè)字節(jié)。
附上中斷處理程序:
void __irq IRQ_Eint2(void) { EXTINT = 0x04; // 清除EINT2中斷標(biāo)志 CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ delay2us(); //延遲兩個(gè)微秒 switch (InterruptStatus) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ delay2us(); //延遲2微秒后 length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功,當(dāng)ARM向CH372發(fā)數(shù),如果成功,就進(jìn)入這個(gè)判斷分支 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break;} default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) CH375_WR_CMD_PORT表示令CH372的A0=1,表示下面訪問(wèn)的是命令口 */ break;} }
VICVectAddr = 0; // 向量中斷結(jié)束 }