老丁帶你學USB-解疑1:STM32 USB數據緩衝區疑問

1、STM32 USB數據緩衝區疑問

USB不同的應用需要使用到的端點數和端點數據長度各不相同,如果爲每個端點都單獨規劃一個存儲區非常浪費。

 

所以STM32爲USB模塊提供了共512個字節的存儲區,至於如何爲每個端點分配使用這512B的空間,就是用戶自己的事情了,這樣存儲區的分配就非常經濟靈活。這512B空間的首地址是0x40006000。

 

你看到的#define ENDP2_RXADDR        (0xD8),

這個0xD8就是在這512B空間裏的偏移地址,說明端點2收到的數據將放在0x40006000 + 0xD8 * 2的地址空間裏。至於爲什麼要×2,是因爲這部分存儲區是按照2字節訪問的,即每存放1個字節的數據要佔據2個字節的空間(只利用其中一個字節,另一個空閒在那)。所以這段存儲區的地址是從0x40006000到0x400063FF。(佔用3FF,1K空間)

 

至於如何定義端點2的發送緩衝區,就看你的應用了。你把端點2的接受緩衝區定義在0xd8,如果端點2的接收數據長度是64個字節,那就要爲端點2的接收保留64個字節,端點2的發送緩衝區就要定義到0xd8+64之後的空間。

即:#define ENDP2_TXADDR        (0xD8+64),

當然也可以#define ENDP2_TXADDR        (0xD8+100)或是其他。

 

總之如何分配這段存儲區,完全可以按照你應用的需求來做。

 

2、爲什麼ENDP0_RXADDR從0x40開始? 前面64個字節怎麼不利用?

因爲發送緩衝地址寄存器USB_ADDR_TX、發送數據字節寄存器USB_COUNT_TX、 接收緩衝地址寄存器USB_ADDR_RX、接收數據字節寄存器USB_COUNT_RX這四個寄存器中的值也是存在在緩衝描述表中的。一個端點有四個寄存器,每個寄存器2個字節,就是8個字節,一共8個端點,正好就是64個字節。也就爲什麼端點0的接收地址從0x40開始了。

代碼:

_SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1))

 

_pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr))

就是將具體設置的值存在前面64個字節的某個位置,具體爲什麼乘以2,如前所述。

 

可以說這四個寄存器並不是真正的寄存器,只是虛擬出來的。

 

3.緩衝區描述表在緩衝區內即0x4000 6000--0x400063FF。

如果我只用端點0,那麼端點0的緩衝區描述表爲ADDR0_TX、COUNT0_TX、ADDR0_RX、COUNT0_RX所對應的地址爲0x4000 6000--0x4000 6008 (USB_BTABLE = 0) 

現在有兩人疑問: 

A.0x4000 6008以後的地址可不可以作緩衝區? 

B.如果給ADDR0_TX、COUNT0_TX賦個合適的值,會不會端點0的緩衝區在0x4000 6000--0x4000 6008內,從而覆蓋了它的緩衝區描術表? 

 

2.爲什麼分組緩衝區地址(按字節編址)要乘以2纔是緩衝區在MCU的地址,能不能舉個例子說明? 

 

3.0x4000 6000--0x400063FF等於1024字節,爲什麼是512字節,是不是後一半沒有使用,芯片爲103VBT6?如果我有一個端 

點用了512字節緩衝區,那麼緩衝區就用完了,是不是表示其他端點就沒有緩衝區可用了,連緩衝區描述表都沒有空間可分配了

 

1.A) 如果只使用端點0,0x4000 6010以後的地址可以作緩衝區。注意不是0x4000 6008以後的地址,原因請看下面的2)。 

1.B) 如果給ADDR0_TX、COUNT0_TX賦的值不合適,端點0的緩衝區有可能覆蓋緩衝區描述表,所以請選擇合適的值,以避免衝突。 

 

2)這是因爲分組緩衝區是一個雙端口的RAM,CPU一端需要使用32位方式訪問,但USB模塊一端使用16位方式訪問。 

例如需要從0x4000 6010開始分配8個字節的緩衝區,則從CPU一端看,需要佔用0x4000 6010、0x4000 6014、0x4000 6018和0x4000 601C開始的4個字的空間,即CPU端每4個字節的地址空間中,只有2個字節的地址空間對應實際的存儲器,而另2個字節的地址空間沒有對應到任何物理的存儲器。 

 

3)1024字節與512字節的問題,請看上面的說明。 

如果有一個端點用了512字節緩衝區,那麼緩衝區就用完了,表示其他端點就沒有緩衝區可用了,連緩衝區描述表都沒有空間可分配了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章