我想用VB做個后臺調(diào)試程序,將發(fā)送出去的數(shù)據(jù)通過偽中斷程序接受回來,想請教高手在CH374芯片中 CH375SetIntRoutine(mIndex, AddressOf mInterruptEvent)這個函數(shù)如何實現(xiàn)的?
對于下位機(jī)該有哪些動作
謝謝啦
我想用VB做個后臺調(diào)試程序,將發(fā)送出去的數(shù)據(jù)通過偽中斷程序接受回來,想請教高手在CH374芯片中 CH375SetIntRoutine(mIndex, AddressOf mInterruptEvent)這個函數(shù)如何實現(xiàn)的?
對于下位機(jī)該有哪些動作
謝謝啦
如果是通過端點(diǎn)2下數(shù)據(jù)的話,那么下位機(jī)先產(chǎn)生端點(diǎn)2下傳成功,再通過中斷端點(diǎn)1回傳,等數(shù)據(jù)被PC取走之后,產(chǎn)生端點(diǎn)1上傳成功。
如果上位機(jī)調(diào)用CH375SetIntRoutine,下位機(jī)只要向端點(diǎn)1寫一些數(shù)據(jù),上位機(jī)就可以進(jìn)入中斷服務(wù)函數(shù)mInterruptEvent中.
好的,我試試
后臺發(fā)送一個數(shù)據(jù)塊給下位機(jī),下位機(jī)用端點(diǎn)2接受,然后下位機(jī)通知上位機(jī)馬上有數(shù)據(jù)上傳,接著講后臺所傳送的數(shù)據(jù)回傳給后臺,不知道該怎么寫呢
case USB_INT_EP2_OUT: { // 批量端點(diǎn)下傳成功 UINT8 buf[64]; if ( s & BIT_STAT_TOG_MATCH ) { // 僅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 數(shù)據(jù)取反由計算機(jī)驗證 Write374Block( RAM_ENDP2_TRAN, l, buf ); // 演示回傳 Write374Byte( REG_USB_LENGTH, l ); // Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); Write374Index( REG_USB_ENDP2 ); // 對于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時間,提高效率 Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); } break;
這部分該怎么改呢
case USB_INT_EP1_IN: { // 中斷端點(diǎn)上傳成功,未處理 Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); break; }
這是端點(diǎn)1的程序,不知道該改哪些地方
case USB_INT_EP2_OUT: { // 批量端點(diǎn)下傳成功 if ( s & BIT_STAT_TOG_MATCH ) { // 僅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); for ( s = 0; s < l; s ++ ) buf[s] ^= 0xFF; // 數(shù)據(jù)取反由計算機(jī)驗證 Write374Block( RAM_ENDP1_TRAN, l, buf ); // 演示回傳 Write374Byte( REG_USB_LENGTH, l ); Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); // Write374Index( REG_USB_ENDP1 ); // 對于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時間,提高效率 // Write374Data( M_SET_EP1_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP1_RECV_TOG ); } break;
我將下位機(jī)改成這樣還是不行
下位機(jī)通知上位機(jī)馬上有數(shù)據(jù)上傳,如果是端點(diǎn)2的話是不可以實現(xiàn)的. 這樣你先看懂程序了在去修改,否則的話是不可能成功的. 5樓代碼是演示數(shù)據(jù)回傳,把數(shù)據(jù)取反后上傳到PC. 6樓代碼是端點(diǎn)1上傳完畢后產(chǎn)生中斷的處理,切換同步標(biāo)志位,應(yīng)答NAK,為下次數(shù)據(jù)傳輸做準(zhǔn)備 7樓修改有問題: 把數(shù)據(jù)接收后送給端點(diǎn)1,但是l長度可能大于8個,端點(diǎn)1無法接收.端點(diǎn)1的大小為8個,端點(diǎn)2為64,仔細(xì)看程序,幾乎沒有一句是正確的,全部錯誤了.
不好意思,我剛剛翻了資料的確是錯的,我想實現(xiàn)下位機(jī)端點(diǎn)2接收數(shù)據(jù),端點(diǎn)1發(fā)送數(shù)據(jù),不知道怎么進(jìn)行呢
不好意思,我剛剛翻了資料的確是錯的,我想實現(xiàn)下位機(jī)端點(diǎn)2接收數(shù)據(jù),端點(diǎn)1發(fā)送數(shù)據(jù),不知道怎么進(jìn)行呢
回傳數(shù)據(jù)的時候,我先通過端點(diǎn)1隨便發(fā)個數(shù)據(jù)給PC,然后仍然用端點(diǎn)2回傳數(shù)據(jù),這樣的話PC能進(jìn)入中斷嗎
有沒有端點(diǎn)1上傳數(shù)據(jù)的例子,具體該怎么實現(xiàn)
參考下面的例程試試 Write374Block( RAM_ENDP1_TRAN, 8, buf1 ); // 演示端點(diǎn)1上傳數(shù)據(jù) 端點(diǎn)1最多上傳8字節(jié) Write374Byte(REG_USB_ENDP1,M_SET_EP1_TRAN_ACK(Read374Byte( REG_USB_ENDP1 ),8)); Write374Block( RAM_ENDP2_TRAN, 64, buf2 ); // 演示端點(diǎn)2上傳數(shù)據(jù) 端點(diǎn)2最多上傳64字節(jié) Write374Byte( REG_USB_LENGTH, 64 ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) );
我設(shè)置了個全局變量signal,端點(diǎn)2接收成功的話,signal置1,然后在主循環(huán)中通過端點(diǎn)1發(fā)送8個數(shù)據(jù)給PC,用的是
Write374Block( RAM_ENDP1_TRAN, 8, buf1 ); // 演示端點(diǎn)1上傳數(shù)據(jù) 端點(diǎn)1最多上傳8字節(jié) Write374Byte(REG_USB_ENDP1,M_SET_EP1_TRAN_ACK(Read374Byte( REG_USB_ENDP1 ),8));
然后將signal清零,可是后臺中發(fā)送兩次才能接收到一次端點(diǎn)傳來的數(shù)據(jù),想請教高手們是怎么回事
現(xiàn)在不清楚是你的下位機(jī)有問題,還是上位機(jī)有問題,建議上位機(jī)先使用DEBUG372調(diào)試.