找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 19110|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

基于STM32F103xx的USB轉(zhuǎn)多路串口(USB-Multiple-CDC)測(cè)試已完成,全部開(kāi)啟DMA自動(dòng)發(fā)...

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:75926 發(fā)表于 2015-4-4 01:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式

基于STM32F103xx的USB轉(zhuǎn)多路串口(USB-Multiple-CDC)測(cè)試已完成,全部開(kāi)啟DMA自動(dòng)發(fā)送功能。簡(jiǎn)要說(shuō)明如下:


1. 支持通過(guò)DMA方式連續(xù)發(fā)送超過(guò)64字節(jié)大小的數(shù)據(jù)包。而且在DMA發(fā)送的同時(shí),繼續(xù)接收來(lái)自PC主機(jī)的數(shù)據(jù)。發(fā)完64字節(jié)后,RS485不換向,可以立即發(fā)送剩余的數(shù)據(jù)。

2. USB轉(zhuǎn)多路串口(USB-Multiple-CDC)支持在大蝦103核心板,USB-Dual-RS485板上運(yùn)行,代碼無(wú)需修改。在其它板子上運(yùn)行,需要修改USB控制腳和RS485控制腳。

3. 三路CDC串口,均支持DMA發(fā)送功能,接收仍為中斷方式。TLL通信使用時(shí),波特率不要超過(guò)921600bps。RS232/RS485通信時(shí),硬件限制一般不能超過(guò)250000/500000bps。


STM32_USB-FS-Device_Lib_V7.0.0.2014.12.20_3CDC_for_DX103.zip 可不用修改直接運(yùn)行在大蝦103核心板上。其它STM32F103xx板子需要修改。

備注: USB-Dual-RS485板的通信部分為專用磁耦隔離的RS485芯片,只需要一個(gè)USB端口,就能同時(shí)連接兩臺(tái)PLC
刷新程序。目前
USB-Dual-RS485板處于缺貨狀態(tài),但有大蝦103核心板大量供應(yīng)。

附錄:“USB復(fù)合設(shè)備”和
“USB組合設(shè)備”的區(qū)別

關(guān)鍵字

Communication Device Class,簡(jiǎn)稱CDC

USB Compound Device,USB復(fù)合設(shè)備
USB Composite Device,USB組合設(shè)備

摘要
Compound Device內(nèi)嵌Hub和多個(gè)Function,每個(gè)Function都相當(dāng)于一個(gè)獨(dú)立的USB外設(shè),有自己的PID/VID/DID。
Composite Device內(nèi)只有一個(gè)Function,只有一套PID/VID/DID,通過(guò)將不同的interface定義為不同的類來(lái)實(shí)現(xiàn)
多個(gè)功能的組合。


正文
Compound Device內(nèi)嵌Hub和多個(gè)Function,每個(gè)Function都相當(dāng)于一個(gè)獨(dú)立的USB外設(shè),有自己的PID/VID/DID。

Composite Device內(nèi)只有一個(gè)Function,只有一套PID/VID/DID,通過(guò)將不同的interface定義為不同的類來(lái)實(shí)現(xiàn)多個(gè)功能的組

合。很多人認(rèn)為一個(gè)USB接口上實(shí)現(xiàn)多個(gè)設(shè)備,就是指復(fù)合設(shè)備,其實(shí),這是不確切的,雖然USB Compound Device和USB Composite Device 都會(huì)被百度翻譯為USB復(fù)合設(shè)備。

在一個(gè)USB接口上實(shí)現(xiàn)多個(gè)設(shè)備有2中方法,一種是Compound Device,就是復(fù)合設(shè)備;另一種是Composite Device,就是組合設(shè)備。
在USB2.0的標(biāo)準(zhǔn)協(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.


所以,復(fù)合設(shè)備其實(shí)就是幾個(gè)設(shè)備通過(guò)一個(gè)USB Hub形成的單一設(shè)備;組合設(shè)備也就是具有多個(gè)接口的設(shè)備,每個(gè)接口代表一個(gè)獨(dú)立的設(shè)備。顯然,如果是想同樣的功能的話,組合設(shè)備的方法要簡(jiǎn)單很多(可以去看一下USB2.0協(xié)議中,USB2.0 Hub的復(fù)雜度)。

附錄:USB Serial Tools工具軟件的特殊功能介紹


一般的串口調(diào)試工具,不會(huì)針對(duì)USB插拔做專門(mén)的檢測(cè)和處理,比較容易崩潰,例如微軟收購(gòu)的超級(jí)終端等。
USB Serial Tools 是本人自2009-2012年,個(gè)人業(yè)余時(shí)間開(kāi)發(fā)的一個(gè)帶有USB插拔檢測(cè)的串口調(diào)試軟件。
和其它串口調(diào)試工具相比,是專用軟件,值得一提的功能如下:
1 支持高波特率。(支持該功能的串口調(diào)試工具屈指可數(shù),大部分串口調(diào)試工具僅支持到115200)
2 支持USB插拔檢測(cè)。(支持該功能的串口調(diào)試工具屈指可數(shù),大部分串口調(diào)試工具都會(huì)因此崩潰)
3 支持STM32虛擬串口的USB端點(diǎn)號(hào)顯示(該工具特有的支持,和嵌入式及PC的底層驅(qū)動(dòng)相關(guān))。







1. USB數(shù)據(jù)接收及阻塞式串口發(fā)送,部分源代碼瀏覽如下:
/* USB的OUT端點(diǎn) 通過(guò)物理串口向外發(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端點(diǎn) 通過(guò)物理串口向外發(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ù)的宏,由于是多個(gè)USB端點(diǎn)和串口之間的通信數(shù)據(jù)轉(zhuǎn)發(fā),思路是一樣的,但寫(xiě)代碼的時(shí)候,
就非常容易寫(xiě)錯(cuò),因此用帶參數(shù)的宏代替。每個(gè)虛擬串口通信函數(shù)內(nèi),都插入這些帶參數(shù)的宏,編譯器在編譯預(yù)
處理時(shí),會(huì)將這些宏展開(kāi), 然后再進(jìn)行編譯。只要調(diào)好了一個(gè)虛擬串口,另外兩個(gè)就調(diào)好了,非常方便。編譯器
是不會(huì)出現(xiàn)書(shū)寫(xiě)錯(cuò)誤的。

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






評(píng)分

參與人數(shù) 1威望 +5 收起 理由
0406445 + 5 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

19#
ID:94309 發(fā)表于 2019-1-24 15:15 | 只看該作者
我還以為提供全部代碼給我們參考呢
回復(fù)

使用道具 舉報(bào)

18#
ID:294362 發(fā)表于 2018-11-28 10:20 | 只看該作者
你好樓主,這個(gè)組合設(shè)備CDC,如果PC端發(fā)修改波特率下來(lái)后,是發(fā)給哪個(gè)設(shè)備的要如何識(shí)別?怎么區(qū)分是發(fā)給哪個(gè)設(shè)備的?我只能控制所有設(shè)備都同時(shí)改波特率了,因?yàn)槲覠o(wú)法區(qū)分?jǐn)?shù)據(jù)是發(fā)給哪個(gè)設(shè)備的!要怎么做才能獨(dú)立控制?
回復(fù)

使用道具 舉報(bào)

17#
ID:294362 發(fā)表于 2018-11-28 10:15 | 只看該作者
你好,樓主,組合設(shè)備的CDC設(shè)備,PC端發(fā)下來(lái)的修改CDC波特率怎么實(shí)現(xiàn)?怎么才能識(shí)別到是發(fā)給哪個(gè)設(shè)備的CDC?我現(xiàn)在改收到波特率是幾個(gè)串口同時(shí)改波特率了,因無(wú)法知道是發(fā)給哪個(gè)的設(shè)備,所有只能改所有的設(shè)備波特率,無(wú)法實(shí)現(xiàn)獨(dú)立控制,挺麻煩的!請(qǐng)問(wèn)要如何解決?
回復(fù)

使用道具 舉報(bào)

16#
ID:165037 發(fā)表于 2018-6-20 09:43 | 只看該作者
能下載測(cè)試一下么
回復(fù)

使用道具 舉報(bào)

15#
ID:275678 發(fā)表于 2018-1-13 21:06 | 只看該作者
seven 發(fā)表于 2015-9-23 15:58
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

你好!我想問(wèn)下你這個(gè)方案最后實(shí)現(xiàn)了嗎?
回復(fù)

使用道具 舉報(bào)

14#
ID:73429 發(fā)表于 2016-12-30 23:22 | 只看該作者
樓主有沒(méi)有公開(kāi)源碼啊?還有,你寫(xiě)的那個(gè)串口工具,在哪里可以找到啊?
回復(fù)

使用道具 舉報(bào)

13#
ID:74620 發(fā)表于 2016-6-22 18:44 | 只看該作者
樓主你好,不知你用的單片機(jī)具體型號(hào)是什么,我的是STM32f103vet6,HID模式OK,CDC模式插上后連無(wú)法識(shí)別的USB提示都沒(méi)有,我的QQ是1036980828,希望看到后可以給我回復(fù),謝謝了,么么噠!
回復(fù)

使用道具 舉報(bào)

12#
ID:74620 發(fā)表于 2016-6-22 18:39 | 只看該作者
想問(wèn)問(wèn)樓主用的單片機(jī)具體型號(hào),我用的是STM32f103vet6,HID模式OK,CDC模式插上后,連無(wú)法識(shí)別的USB接口的提示都沒(méi)有,希望幫忙解決一下,我的QQ是1036980828,請(qǐng)您有時(shí)間幫助解決下,謝謝,么么噠!
回復(fù)

使用道具 舉報(bào)

11#
ID:74620 發(fā)表于 2016-6-22 18:31 | 只看該作者
想問(wèn)問(wèn)樓主用的單片機(jī)的具體型號(hào),我用的是STM32F103VET6,HID模式ok,CDC插上后,連無(wú)法識(shí)別的USB提示都沒(méi)有,我查的JLINK模式需要退出調(diào)試后,將單片機(jī)復(fù)位,試過(guò)后,還是覺(jué)得不行,看看你能不能給點(diǎn)好的建議。謝謝親,么么噠!
回復(fù)

使用道具 舉報(bào)

10#
ID:91616 發(fā)表于 2015-10-4 22:35 | 只看該作者
good!!!!!
回復(fù)

使用道具 舉報(bào)

9#
ID:90881 發(fā)表于 2015-9-23 16:01 | 只看該作者
USB 轉(zhuǎn)3路串口,需要?jiǎng)?chuàng)建3個(gè)cdc-acm類,還是3個(gè)實(shí)例?這部分不懂,請(qǐng)賜教
回復(fù)

使用道具 舉報(bào)

8#
ID:90881 發(fā)表于 2015-9-23 15:58 | 只看該作者
樓主好,我正在做USB枚舉3個(gè)串口的項(xiàng)目。想請(qǐng)教您一些問(wèn)題。我的郵箱  550253025@qq.com,請(qǐng)加我好么
回復(fù)

使用道具 舉報(bào)

7#
ID:89891 發(fā)表于 2015-9-11 14:44 | 只看該作者
樓主,能給個(gè)源碼呀?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表