<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 usb數(shù)據(jù)緩沖區(qū)疑問

          stm32 usb數(shù)據(jù)緩沖區(qū)疑問

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          USB不同的應(yīng)用需要使用到的端點(diǎn)數(shù)和端點(diǎn)數(shù)據(jù)長度各不相同,如果為每個(gè)端點(diǎn)都單獨(dú)規(guī)劃一個(gè)存儲(chǔ)區(qū)非常浪費(fèi)。

          所以STM32為USB模塊提供了共512個(gè)字節(jié)的存儲(chǔ)區(qū),至于如何為每個(gè)端點(diǎn)分配使用這512B的空間,就是用戶自己的事情了,這樣存儲(chǔ)區(qū)的分配就非常經(jīng)濟(jì)靈活。這512B空間的首地址是0x40006000。

          你看到的#defineENDP2_RXADDR(0xD8),這個(gè)0xD8就是在這512B空間里的偏移地址,說明端點(diǎn)2收到的數(shù)據(jù)將放在0x40006000+0xD8*2的地址空間里。至于為什么要×2,是因?yàn)檫@部分存儲(chǔ)區(qū)是按照2字節(jié)訪問的,即每存放1個(gè)字節(jié)的數(shù)據(jù)要占據(jù)2個(gè)字節(jié)的空間。所以這段存儲(chǔ)區(qū)的地址是從0x40006000到0x400063FF。

          至于如何定義端點(diǎn)2的發(fā)送緩沖區(qū),就看你的應(yīng)用了。你把端點(diǎn)2的接受緩沖區(qū)定義在0xd8,如果端點(diǎn)2的接收數(shù)據(jù)長度是64個(gè)字節(jié),那就要為端點(diǎn)2的接收保留64個(gè)字節(jié),端點(diǎn)2的發(fā)送緩沖區(qū)就要定義到0xd8+64之后的空間。
          即:#defineENDP2_TXADDR(0xD8+64),
          當(dāng)然也可以#defineENDP2_TXADDR(0xD8+100)或是其他。

          總之如何分配這段存儲(chǔ)區(qū),完全可以按照你應(yīng)用的需求來做。
          最近研究了下103VBT6的USB,看了很多次都看不明白,我開始懷疑我的閱讀能力了?,F(xiàn)有以下幾點(diǎn)疑問請(qǐng)教大家

          1.緩沖區(qū)描述表在緩沖區(qū)內(nèi)即0x40006000--0x400063FF。如果我只用端點(diǎn)0,那么端點(diǎn)0的緩沖區(qū)描述表為
          ADDR0_TX、COUNT0_TX、ADDR0_RX、COUNT0_RX所對(duì)應(yīng)的地址為0x40006000--0x40006008(USB_BTABLE=0)
          現(xiàn)在有兩人疑問:
          A.0x40006008以后的地址可不可以作緩沖區(qū)?
          B.如果給ADDR0_TX、COUNT0_TX賦個(gè)合適的值,會(huì)不會(huì)端點(diǎn)0的緩沖區(qū)在0x40006000--0x40006008內(nèi),從而覆蓋了它的緩沖區(qū)描術(shù)表?

          2.為什么分組緩沖區(qū)地址(按字節(jié)編址)要乘以2才是緩沖區(qū)在MCU的地址,能不能舉個(gè)例子說明?

          3.0x40006000--0x400063FF等于1024字節(jié),為什么是512字節(jié),是不是后一半沒有使用,芯片為103VBT6?如果我有一個(gè)端
          點(diǎn)用了512字節(jié)緩沖區(qū),那么緩沖區(qū)就用完了,是不是表示其他端點(diǎn)就沒有緩沖區(qū)可用了,連緩沖區(qū)描述表都沒有空間可分配了
          1.A)如果只使用端點(diǎn)0,0x40006010以后的地址可以作緩沖區(qū)。注意不是0x40006008以后的地址,原因請(qǐng)看下面的2)。
          1.B)如果給ADDR0_TX、COUNT0_TX賦的值不合適,端點(diǎn)0的緩沖區(qū)有可能覆蓋緩沖區(qū)描述表,所以請(qǐng)選擇合適的值,以避免沖突。

          2)這是因?yàn)榉纸M緩沖區(qū)是一個(gè)雙端口的RAM,CPU一端需要使用32位方式訪問,但USB模塊一端使用16位方式訪問。
          例如需要從0x40006010開始分配8個(gè)字節(jié)的緩沖區(qū),則從CPU一端看,需要占用0x40006010、0x40006014、0x40006018和0x4000601C開始的4個(gè)字的空間,即CPU端每4個(gè)字節(jié)的地址空間中,只有2個(gè)字節(jié)的地址空間對(duì)應(yīng)實(shí)際的存儲(chǔ)器,而另2個(gè)字節(jié)的地址空間沒有對(duì)應(yīng)到任何物理的存儲(chǔ)器。

          3)1024字節(jié)與512字節(jié)的問題,請(qǐng)看上面的說明。
          如果有一個(gè)端點(diǎn)用了512字節(jié)緩沖區(qū),那么緩沖區(qū)就用完了,表示其他端點(diǎn)就沒有緩沖區(qū)可用了,連緩沖區(qū)描述表都沒有空間可分配了。


          關(guān)鍵詞: stm32usb數(shù)據(jù)緩沖

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();