關(guān)于374做設(shè)備時主動上傳的問題

我的374是做設(shè)備使用的,在處理端點(diǎn)2數(shù)據(jù)傳輸時遇到兩個問題: 1.在例子程序中,下傳成功后,再上傳數(shù)據(jù),再返回ACK,這個ACK是將端點(diǎn)2控制寄存器 位1,位0置00,異或位7的接收同步標(biāo)志,可以看作:下傳+上傳+ACK,那么我想將下傳和上傳分開,即:下傳+ACK1;上傳+ACK2,那么ACK1和ACK2怎么寫呢?

2.第二個問題可以是PC機(jī)端的,如果一次下傳成功后,下位機(jī)讀出數(shù)據(jù)后,并沒有上傳握手信號,而此時PC機(jī)端又要發(fā)送一次下傳,這樣就出錯了,那么在PC機(jī)端 有什么命令,可以放棄上次的握手信號嗎,而使第二次下傳正傳執(zhí)行?

在下傳之后,你就可以每次上傳數(shù)據(jù),你說的ACK2這個實(shí)際的在0X0E寄存器里面有詳細(xì)的介紹,你可以看下。


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 ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_RECV_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG );

if(time==0){ //第一次則上傳 for ( s = 0; s < 10; s ++ ) buf[s] = s; Write374Block( RAM_ENDP2_TRAN, 10, buf ); // 演示回傳 Write374Byte( REG_USB_LENGTH, 10 ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); time=time+1; }

// Write374Index( REG_USB_ENDP2 ); // 對于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時間,提高效率 // Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); } break; }

這段程序不會出現(xiàn)你以前所說的,一次上傳之后不再上傳,但如果上位機(jī)去讀還能讀到第一次上傳的數(shù)據(jù)的情況。


恩,謝謝兩位 “這段程序不會出現(xiàn)你以前所說的,一次上傳之后不再上傳,但如果上位機(jī)去讀還能讀到第一次上傳的數(shù)據(jù)的情況?!? 這個問題已經(jīng)解決了,謝謝! 我現(xiàn)在的問題是:下傳成功后,讀出數(shù)據(jù),我給PC機(jī)回了個ACK1(0x0E寄存器的位7異或,即接收標(biāo)志位取反,位6,位5置00,即接收響應(yīng)(對OUT事務(wù))應(yīng)答ACK),我運(yùn)行了下,這樣應(yīng)該沒問題

緊接著,我又向上發(fā)送了數(shù)據(jù),然后再寫ACK2,這個ACK2試了很多方式,都不行,

由于程序需要,我必須將下傳和上傳的事務(wù)分別獨(dú)立分開,希望知道ACK1和ACK2應(yīng)該怎么處理,謝謝!


你的ACK2的包是如何組織的?

端點(diǎn)2的上傳: 1。向端點(diǎn)2上傳緩沖區(qū)(RAM_ENDP2_TRAN)寫入數(shù)據(jù)、 2。向長度寄存器(REG_USB_LENGTH)寫入數(shù)據(jù)長度 3。配置端點(diǎn)2的控制寄存器(REG_USB_ENDP2) 完成以上步驟后,等待PC機(jī)取走數(shù)據(jù)


對,我就是這個步驟

關(guān)鍵是: 3。配置端點(diǎn)2的控制寄存器(REG_USB_ENDP2) 我總是配置不好! 我將0x0e的位6發(fā)送標(biāo)志位取反,將位1,位0置位00,即端點(diǎn)2發(fā)送響應(yīng) 00=應(yīng)答數(shù)據(jù)長度從reg_usb_length寫入 。但是這樣不成功 然后,就清除中斷標(biāo)志位,跳到查詢低電平處了!


對,我就是這個步驟

關(guān)鍵是: 3。配置端點(diǎn)2的控制寄存器(REG_USB_ENDP2) 我總是配置不好! 我將0x0e的位6發(fā)送標(biāo)志位取反,將位1,位0置位00,即端點(diǎn)2發(fā)送響應(yīng) 00=應(yīng)答數(shù)據(jù)長度從reg_usb_length寫入 。但是這樣不成功 然后,就清除中斷標(biāo)志位,跳到查詢低電平處了!


你第一次上傳的同步位錯了,第一次是DATA0,也就是0x0e的位6是0,等PC取走數(shù)據(jù),374產(chǎn)生端點(diǎn)2上傳成功中斷后,才將該位取反。


也就是需要這一句: Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); 其中M_SET_EP2_TRAN_ACK()你可以參考頭文件CH374INC.H.


我試試,那么我在下傳數(shù)據(jù)后,沒有上傳,接著回應(yīng)0x0e怎么設(shè)置呢 我這樣設(shè)置對嗎: 0x0E寄存器的位7異或,即接收標(biāo)志位取反,位6,位5置00,即接收響應(yīng)(對OUT事務(wù))應(yīng)答ACK)


其中,這也不是我第一次上傳數(shù)據(jù),前面有下傳,上傳,回應(yīng)等很多處理了。


正確,但還得把位1,0置為10,即對IN事務(wù)應(yīng)答NAK


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频