|
基于STM32F103xx的USB轉(zhuǎn)多路串口(USB-Multiple-CDC)測試已完成,全部開啟DMA自動發(fā)送功能。簡要說明如下:
1. 支持通過DMA方式連續(xù)發(fā)送超過64字節(jié)大小的數(shù)據(jù)包。而且在DMA發(fā)送的同時,繼續(xù)接收來自PC主機的數(shù)據(jù)。發(fā)完64字節(jié)后,RS485不換向,可以立即發(fā)送剩余的數(shù)據(jù)。
2. USB轉(zhuǎn)多路串口(USB-Multiple-CDC)支持在大蝦103核心板,USB-Dual-RS485板上運行,代碼無需修改。在其它板子上運行,需要修改USB控制腳和RS485控制腳。
3. 三路CDC串口,均支持DMA發(fā)送功能,接收仍為中斷方式。TLL通信使用時,波特率不要超過921600bps。RS232/RS485通信時,硬件限制一般不能超過250000/500000bps。
STM32_USB-FS-Device_Lib_V7.0.0.2014.12.20_3CDC_for_DX103.zip 可不用修改直接運行在大蝦103核心板上。其它STM32F103xx板子需要修改。
備注: USB-Dual-RS485板的通信部分為專用磁耦隔離的RS485芯片,只需要一個USB端口,就能同時連接兩臺PLC
刷新程序。目前USB-Dual-RS485板處于缺貨狀態(tài),但有大蝦103核心板大量供應。
附錄:“USB復合設備”和“USB組合設備”的區(qū)別
關鍵字
Communication Device Class,簡稱CDC
USB Compound Device,USB復合設備
USB Composite Device,USB組合設備
摘要
Compound Device內(nèi)嵌Hub和多個Function,每個Function都相當于一個獨立的USB外設,有自己的PID/VID/DID。
Composite Device內(nèi)只有一個Function,只有一套PID/VID/DID,通過將不同的interface定義為不同的類來實現(xiàn)
多個功能的組合。
正文
Compound Device內(nèi)嵌Hub和多個Function,每個Function都相當于一個獨立的USB外設,有自己的PID/VID/DID。
Composite Device內(nèi)只有一個Function,只有一套PID/VID/DID,通過將不同的interface定義為不同的類來實現(xiàn)多個功能的組
合。很多人認為一個USB接口上實現(xiàn)多個設備,就是指復合設備,其實,這是不確切的,雖然USB Compound Device和USB Composite Device 都會被百度翻譯為USB復合設備。
在一個USB接口上實現(xiàn)多個設備有2中方法,一種是Compound Device,就是復合設備;另一種是Composite Device,就是組合設備。
在USB2.0的標準協(xié)議中,定義如下:
When multiple functions are combined with a hub in a single package, they are referred to as a compound device.

A device that has multiple interfaces controlled independently of each other is referred to as a
composite device.
所以,復合設備其實就是幾個設備通過一個USB Hub形成的單一設備;組合設備也就是具有多個接口的設備,每個接口代表一個獨立的設備。顯然,如果是想同樣的功能的話,組合設備的方法要簡單很多(可以去看一下USB2.0協(xié)議中,USB2.0 Hub的復雜度)。
附錄:USB Serial Tools工具軟件的特殊功能介紹
一般的串口調(diào)試工具,不會針對USB插拔做專門的檢測和處理,比較容易崩潰,例如微軟收購的超級終端等。
USB Serial Tools 是本人自2009-2012年,個人業(yè)余時間開發(fā)的一個帶有USB插拔檢測的串口調(diào)試軟件。
和其它串口調(diào)試工具相比,是專用軟件,值得一提的功能如下:
1 支持高波特率。(支持該功能的串口調(diào)試工具屈指可數(shù),大部分串口調(diào)試工具僅支持到115200)
2 支持USB插拔檢測。(支持該功能的串口調(diào)試工具屈指可數(shù),大部分串口調(diào)試工具都會因此崩潰)
3 支持STM32虛擬串口的USB端點號顯示(該工具特有的支持,和嵌入式及PC的底層驅(qū)動相關)。


1. USB數(shù)據(jù)接收及阻塞式串口發(fā)送,部分源代碼瀏覽如下:
/* USB的OUT端點 通過物理串口向外發(fā)送數(shù)據(jù)(阻塞方式) */
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\
uint32_t i;\
uint16_t USB_Rx_Cnt;\
USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \
GPIOx->BSRR = GPIO_Pin_x;\
for (i = 0; i < USB_Rx_Cnt; i++) {\
USARTx->DR = *(USB_Rx_Buffer + i);\
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\
}\
SetEPRxValid(ENDPx);\
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\
USART_ClearFlag(USARTx, USART_FLAG_TC);\
GPIOx->BRR = GPIO_Pin_x;\
}
2. USB數(shù)據(jù)接收及DMA式串口發(fā)送,部分源代碼瀏覽如下
/* USB的OUT端點 通過物理串口向外發(fā)送數(shù)據(jù)(DMA方式) */
#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\
uint16_t USB_Rx_Cnt;\
if(Flag_VCPx_Tx_Buf_Use == 0){\
USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
SetEPRxValid(ENDPx);\
GPIOx->BSRR = GPIO_Pin_x;\
DMA1_Channelx->CNDTR = USB_Rx_Cnt;\
DMA_Cmd(DMA1_Channelx, ENABLE);\
Flag_VCPx_Tx_Buf_Use = 1;\
VCPx_Tx_Buffer_Cnt = 0;\
} else {\
USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
SetEPRxValid(ENDPx);\
} else {\
PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
Flag_VCPx_Tx_Buf_Full = 1;\
}\
}\
}
以上兩段代碼是帶參數(shù)的宏,由于是多個USB端點和串口之間的通信數(shù)據(jù)轉(zhuǎn)發(fā),思路是一樣的,但寫代碼的時候,
就非常容易寫錯,因此用帶參數(shù)的宏代替。每個虛擬串口通信函數(shù)內(nèi),都插入這些帶參數(shù)的宏,編譯器在編譯預
處理時,會將這些宏展開, 然后再進行編譯。只要調(diào)好了一個虛擬串口,另外兩個就調(diào)好了,非常方便。編譯器
是不會出現(xiàn)書寫錯誤的。
One CDC function requires 2 IN / 1 OUT endpoints (interrupt IN/ bulk IN/ bulk OUT), other than the default EP.
Available endpoints of each STM32F family are,
STM32F102/103
- FS Device core: 7 IN / 7 OUT
STM32F105/107
- OTG_FS: 3 IN / 3 OUT
STM32F2xx/4xx
- OTG_FS: 3 IN / 3 OUT
- OTG_HS: 5 IN / 5 OUT
STM32F102/103 - 3x CDC composite
STM32F105/107 - just one CDC
STM32F2xx/4xx - 2x CDC composite on OTG_HS
|
評分
-
查看全部評分
|