STM32 USB虚拟串口原理(上)
USB虛擬串口是使用USB的CDC(CDC為communication device class(virtual port com))類(lèi)實(shí)現(xiàn)的一種通訊接口。使用STM32自帶的USB?slave功能可以在電腦上實(shí)現(xiàn)一個(gè)USB虛擬串口,在電腦上可以直接使用串口調(diào)試助手打開(kāi)該虛擬串口和STM32進(jìn)行通訊。STM32?OTG_FS是雙重角色設(shè)備(DRD)控制器,支持主機(jī)端和設(shè)備端的功能,完全遵從On-The-Go Supplement to the USB2.0規(guī)范。同時(shí),該控制器也可配置為僅支持主機(jī)端或僅支持設(shè)備端功能的控制器,遵從USB2.0規(guī)范。在主機(jī)模式下,OTG_FS支持全速(FS, 12Mbits/s)和低速(LS,1.5Mbits/s)通信,而在設(shè)備模式下,支持全速(FS, 12Mbits/s)通信。OTG_FS控制器支持HNP和SRP協(xié)議。外圍僅在主機(jī)模式下需要配置一個(gè)針對(duì)VBUS的電荷泵,即可完成設(shè)計(jì)。
FS: 全速 LS: 低速 USB: 通用串行總線(xiàn) OTG: On-the-Go PHY: 物理層通用串行總線(xiàn)(USB)協(xié)議:
管道:邏輯數(shù)據(jù)傳遞的信道
控制端點(diǎn):具有雙向通訊能力的默認(rèn)端點(diǎn),是所有USB設(shè)備必須支持的端點(diǎn)。
端點(diǎn)的屬性:
端點(diǎn)號(hào):區(qū)分同一接口上不同的端點(diǎn)
傳輸類(lèi)型:不同的傳輸類(lèi)型針對(duì)的是不同的端點(diǎn),不同的端點(diǎn)支持的傳輸類(lèi)型可能不同,如控制端點(diǎn)實(shí)現(xiàn)控制傳輸、同步端點(diǎn)實(shí)現(xiàn)同步
傳輸?shù)姆较?#xff1a;主機(jī)---->設(shè)備(OUT),設(shè)備---->主機(jī)(IN),OUT和IN的判定總是站在主機(jī)的角度
最大數(shù)據(jù)包長(zhǎng)度:一次傳輸?shù)淖畲髷?shù)據(jù)包長(zhǎng)度
總線(xiàn)供電設(shè)備是從VBUS取電,本身不自己供電,比較常見(jiàn)的就是U盤(pán),有線(xiàn)鍵鼠等。對(duì)于總線(xiàn)供電設(shè)備,消耗電流超過(guò)500mA會(huì)報(bào)浪涌保護(hù)。設(shè)備通過(guò)設(shè)備描述符向主機(jī)自報(bào)家門(mén),報(bào)告的信息包含供電配置(即自供電/總線(xiàn)供電)以及功耗要求。
主機(jī)會(huì)判斷是否能夠提供設(shè)備所需要的最大功耗,若可以則進(jìn)行設(shè)備的枚舉,若滿(mǎn)足不了則拒絕枚舉該設(shè)備。
處于掛起模式的USB總線(xiàn)供電設(shè)備,高功耗總線(xiàn)設(shè)備消耗電流不能超過(guò)2.5mA,低功耗總線(xiàn)設(shè)備消耗電流不能超過(guò)0.5mA
SOF(start of frame)
EOF(end of packet)
一般情況下設(shè)備不會(huì)檢測(cè)到3mS無(wú)數(shù)據(jù)傳輸從而進(jìn)入掛起模式,只有當(dāng)主設(shè)備進(jìn)入休眠狀態(tài)或者主設(shè)備有意停止信號(hào)發(fā)送時(shí)從設(shè)備才會(huì)進(jìn)入掛起模式。如當(dāng)U盤(pán)插到筆記本上后是正常工作的模式,當(dāng)筆記本蓋子扣上后進(jìn)入掛起模式。
差分信號(hào)傳輸,和RS485、CAN在硬件層面很類(lèi)似,因?yàn)椴罘中盘?hào)抗干擾能力比較強(qiáng)。總線(xiàn)處于Idle狀態(tài)大于3mS從設(shè)備就會(huì)進(jìn)入掛起模式,低速和全速模式下的J狀態(tài)是不同的
USB主機(jī)內(nèi)部都是通過(guò)15K電阻下拉到地的,因此當(dāng)無(wú)設(shè)備接入時(shí),D+、D-均為低電平。在USB從設(shè)備中,如果從設(shè)備是高速設(shè)備則會(huì)將D+通過(guò)1.5K電阻上拉到VBUS。如果從設(shè)備是低速設(shè)備則會(huì)在將D-通過(guò)1.5K電阻上拉至VBUS。因此主機(jī)通過(guò)對(duì)D-、D-電平的檢測(cè),就可以判斷出是否有設(shè)備接入以及接入設(shè)備的通訊速度。
當(dāng)需要傳輸?shù)臄?shù)據(jù)長(zhǎng)度大于接口上端點(diǎn)的最大傳輸數(shù)據(jù)長(zhǎng)度,則數(shù)據(jù)會(huì)被分為多個(gè)transaction進(jìn)行傳輸,如需要傳送100byte,斷點(diǎn)的最大傳輸數(shù)據(jù)長(zhǎng)度為64byte,則需要分為2個(gè)transaction進(jìn)行傳送。每一個(gè)transaction都需要由3個(gè)packet組成,只有在同步傳輸是transaction中沒(méi)有握手包。
PID用于區(qū)分不同包的類(lèi)型,就是上面Packet的四大類(lèi),不同類(lèi)型的包,其組成部分即PID后面跟的內(nèi)容也是不同的。
令牌包中的幀號(hào)和數(shù)據(jù)是不存在的
SOF包中不存在地址和數(shù)據(jù)
數(shù)據(jù)包中無(wú)地址和幀號(hào)
握手包中無(wú)地址、幀號(hào)、數(shù)據(jù)、CRC,握手包用于表示當(dāng)前傳輸?shù)膫鬏敔顩r
接收方只有正確收到數(shù)據(jù)包且數(shù)據(jù)包的PID和自身期望的PID一致時(shí)才會(huì)toggle自身的PID。發(fā)送方只有收到來(lái)自接收方有效的ACK握手信號(hào)后才會(huì)toggle自身的PID。數(shù)據(jù)傳輸起始的PID會(huì)在USB reset階段被清0,因此傳輸開(kāi)始時(shí)發(fā)送方和接收方都是DATA0的PID。
當(dāng)接收方在成功接收一個(gè)數(shù)據(jù)包并toggle自身的PID(從DATA0變?yōu)镈ATA1),在回復(fù)發(fā)送方ACK信號(hào)的過(guò)程中由于某種原因造成ACK信號(hào)被破壞,因此發(fā)送方并未受到ACK信號(hào)。發(fā)送方不切換自身的PID(保持DATA0),此時(shí)收發(fā)雙方的PID不再保持一致。在下一次通訊的時(shí)候,發(fā)送方以DATA0作為PID進(jìn)行數(shù)據(jù)的發(fā)送。當(dāng)數(shù)據(jù)正確到達(dá)接收方時(shí),接收方發(fā)現(xiàn)當(dāng)前數(shù)據(jù)的PID和自身的PID對(duì)不上,因此回復(fù)ACK信號(hào)表示當(dāng)前數(shù)據(jù)已成功收到,但其并不toggle自身的PID。當(dāng)發(fā)送方收到接收方返回的ACK信號(hào)時(shí)會(huì)切換自身的PID(從DATA0變?yōu)镈ATA1),在下一次通訊的時(shí)候,手法雙方就又會(huì)回到同步的狀態(tài)(收發(fā)雙方的PID都是DATA1)。
?
參考資料:
【1】B站視頻
?視頻對(duì)應(yīng)PDF:https://www.stmcu.com.cn/Index/search?search_keywords=usb2.0
【2】STM32CubeMX系列教程25:USB Device
https://www.waveshare.net/study/article-664-1.html
總結(jié)
以上是生活随笔為你收集整理的STM32 USB虚拟串口原理(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 语料库
- 下一篇: spring-boot注解详解(七)