374雙緩沖問(wèn)題

貴公司給我發(fā)了個(gè)例子,但好像是374做為主機(jī)的雙緩沖,好像還要支持BulkOnly協(xié)議 我現(xiàn)在的374是做為設(shè)備的,想使用端點(diǎn)2的雙緩沖接收PC機(jī)下傳的數(shù)據(jù),不使用BulkOnly協(xié)議,就是下傳數(shù)據(jù),讀出來(lái),可以嗎? 我已經(jīng)將06號(hào)寄存器的位3,位2置為01=連續(xù)接收緩沖區(qū)以連續(xù)接收128字節(jié)

那么我在單片機(jī)端怎么讀出數(shù)據(jù)呢,是這樣讀嗎? 先讀取長(zhǎng)度,再讀出0xc0緩沖區(qū)數(shù)據(jù) 再讀出長(zhǎng)度,再讀出0x80備用緩沖區(qū)數(shù)據(jù) 那么這兩個(gè)長(zhǎng)度都是讀長(zhǎng)度寄存器嗎,怎么對(duì)應(yīng)不同的緩沖區(qū)呢?

非常感謝!

01方式發(fā)送和接收時(shí):前64字節(jié)放在USB設(shè)備方式下的端點(diǎn)2發(fā)送/接收緩沖區(qū),后64字節(jié)放在USB設(shè)備方式下的端點(diǎn)2備用緩沖區(qū),DATA0,DATA1都是一樣使用. 10方式時(shí): 只有在DATA1的時(shí)候從備用緩沖區(qū)發(fā)送和接收64字節(jié).DATA0的時(shí)候從USB設(shè)備方式下的端點(diǎn)2發(fā)送/接收緩沖區(qū)發(fā)送和接收64字節(jié). 11方式時(shí):在DATA1的時(shí)候從備用緩沖區(qū)接收64字節(jié),從USB設(shè)備方式下的端點(diǎn)2發(fā)送/接收緩沖區(qū)的發(fā)送緩沖區(qū)發(fā)送64字節(jié).只有在00方式時(shí),DATA0的時(shí)候從USB設(shè)備方式下的端點(diǎn)2發(fā)送/接收緩沖區(qū)發(fā)送和接收64字節(jié).需要注意DATA0,DATA1的切換.


這個(gè)我看過(guò)了,我的問(wèn)題具體是: 兩個(gè)緩沖區(qū)數(shù)據(jù)長(zhǎng)度怎么獲取 那么我在單片機(jī)端怎么讀出數(shù)據(jù)呢,是這樣讀嗎? 先讀取長(zhǎng)度,再讀出0xc0緩沖區(qū)數(shù)據(jù) 再讀出長(zhǎng)度,再讀出0x80備用緩沖區(qū)數(shù)據(jù) 那么這兩個(gè)長(zhǎng)度都是讀長(zhǎng)度寄存器嗎,怎么對(duì)應(yīng)不同的緩沖區(qū)呢?


實(shí)際每次獲取的長(zhǎng)度都在長(zhǎng)度緩沖區(qū)里面,你先讀取地一個(gè)64字節(jié),讀取完成之后在讀取一下備用緩沖區(qū),這樣就應(yīng)該可以了。


我做了個(gè)實(shí)驗(yàn):將06號(hào)寄存器的位3,位2置為01=連續(xù)接收緩沖區(qū)以連續(xù)接收128字節(jié)

我傳了3個(gè)字節(jié)數(shù)據(jù) 查詢到下傳的中斷后,我讀出長(zhǎng)度寄存器為3,然后從接收緩沖區(qū)讀出3個(gè)數(shù)據(jù) 然后,再讀長(zhǎng)度寄存器(應(yīng)該是備用緩沖區(qū)長(zhǎng)度了吧?),也是3,照說(shuō),應(yīng)該是0才對(duì)啊,那么讓我怎么處理呢,難道從接收緩沖區(qū)不滿來(lái)判斷備用緩沖區(qū)為空嗎?


你這樣試試: 將06號(hào)寄存器的位3,位2置為11=連續(xù)接收第二緩沖區(qū),同步標(biāo)志為1 選中 在端點(diǎn)2下傳中斷中: (1)切換同步標(biāo)志,取出本次傳輸?shù)拈L(zhǎng)度 (2)重新配置端點(diǎn)2的配置寄存器:對(duì)OUT事務(wù)響應(yīng)ACK (3)清中斷標(biāo)志 (4)從緩沖區(qū)中取數(shù)據(jù)(緩沖區(qū)的選擇由同步標(biāo)志決定,此時(shí)0選中備用緩沖區(qū),1選中主緩沖區(qū),因?yàn)椋?)中同步標(biāo)志已經(jīng)切換過(guò)了) 注:這段流程與DEVICE.C有點(diǎn)不同,即(3)提前做了,應(yīng)對(duì)DEVIC.C中 else if ( s & BIT_IF_TRANSFER ){} 作部分修改: (1)刪掉Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中斷標(biāo)志 (2)在每個(gè)CASE中添加Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中斷標(biāo)志


文檔中這句我就不太明白:11=連續(xù)接收第二緩沖區(qū),同步標(biāo)志為1選中 是說(shuō)同步標(biāo)志為1時(shí)選中備用緩沖區(qū)嗎? 第(1)步中讀取的長(zhǎng)度應(yīng)該是哪個(gè)緩沖區(qū)的長(zhǎng)度呢? 我比較關(guān)注第(4)步中取數(shù)據(jù),這步應(yīng)該是取兩個(gè)緩沖區(qū)的數(shù)據(jù)吧 通過(guò)同步標(biāo)志選擇不同的緩沖區(qū),那么這個(gè)同步標(biāo)志應(yīng)該是我自己設(shè)的吧 我想取主緩沖區(qū),就設(shè)接收同步標(biāo)志為1,想取備用緩沖區(qū),就設(shè)同步標(biāo)志為0


(1)同步標(biāo)志為1,則表示當(dāng)前操作的緩沖區(qū)應(yīng)為備用緩沖區(qū) (2)數(shù)據(jù)長(zhǎng)度總是從長(zhǎng)度寄存器中取,表示本次傳輸?shù)臄?shù)據(jù)長(zhǎng)度 (3)每次下傳成功,只能根據(jù)此時(shí)的同步標(biāo)志,從相應(yīng)的緩沖區(qū)中取數(shù)據(jù),同步標(biāo)志不可以自己設(shè)定,總是以DATA0為起始,傳輸成功后再切換。 注:所謂雙緩沖傳輸,我個(gè)人理解的原理是這樣的,假設(shè)主緩沖區(qū)編號(hào)為A,備用為B 端點(diǎn)2上傳: (1)先把數(shù)據(jù)放入緩沖區(qū)A,配置相關(guān)寄存器(如長(zhǎng)度寄存器,控制寄存器),啟動(dòng)上傳,等待PC來(lái)取 (2)374此時(shí)正在上傳,但還未產(chǎn)生上傳成功中斷: 若不用雙緩沖,單片機(jī)則只能等到上傳成功中斷后才能向A中寫(xiě)入新的數(shù)據(jù),再次上傳,依次類推,直至完畢 若使用雙緩沖,單片機(jī)則不用等待上傳成功中斷,緊接向B中寫(xiě)入新的數(shù)據(jù),但不配置相關(guān)寄存器,等到上傳成功中斷產(chǎn)生后,切換同步位,配置相關(guān)寄存器,啟動(dòng)上傳。這一過(guò)程利用等待時(shí)間向緩沖區(qū)B中寫(xiě)入數(shù)據(jù) 端點(diǎn)2下傳: 下傳成功后,切換同步位,讀取本次傳輸長(zhǎng)度,但是暫不從緩沖區(qū)A中取數(shù)據(jù),重配置控制寄存器,啟動(dòng)第二次下傳,此時(shí)第二次下傳還未成功,利用這段時(shí)間根據(jù)同步標(biāo)志位從相應(yīng)的緩沖區(qū)取數(shù)據(jù)。

總之一點(diǎn):使用雙緩沖,就是利用傳輸時(shí)間間隙,向緩沖區(qū)存取數(shù)據(jù),不用等待傳輸是否完成。建議樓上,再多參考一下HOSTDISK.C例子程序。


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

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