日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 USB虚拟串口原理(上)

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 USB虚拟串口原理(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

USB虛擬串口是使用USB的CDC(CDC為communication device class(virtual port com))類實現的一種通訊接口。使用STM32自帶的USB?slave功能可以在電腦上實現一個USB虛擬串口,在電腦上可以直接使用串口調試助手打開該虛擬串口和STM32進行通訊。STM32?OTG_FS是雙重角色設備(DRD)控制器,支持主機端和設備端的功能,完全遵從On-The-Go Supplement to the USB2.0規范。同時,該控制器也可配置為僅支持主機端或僅支持設備端功能的控制器,遵從USB2.0規范。在主機模式下,OTG_FS支持全速(FS, 12Mbits/s)和低速(LS,1.5Mbits/s)通信,而在設備模式下,支持全速(FS, 12Mbits/s)通信。OTG_FS控制器支持HNP和SRP協議。外圍僅在主機模式下需要配置一個針對VBUS的電荷泵,即可完成設計。

FS: 全速 LS: 低速 USB: 通用串行總線 OTG On-the-Go PHY: 物理層

通用串行總線(USB)協議:

管道:邏輯數據傳遞的信道

控制端點:具有雙向通訊能力的默認端點,是所有USB設備必須支持的端點。

端點的屬性:

端點號:區分同一接口上不同的端點

傳輸類型:不同的傳輸類型針對的是不同的端點,不同的端點支持的傳輸類型可能不同,如控制端點實現控制傳輸、同步端點實現同步

傳輸的方向:主機---->設備(OUT),設備---->主機(IN),OUT和IN的判定總是站在主機的角度

最大數據包長度:一次傳輸的最大數據包長度

總線供電設備是從VBUS取電,本身不自己供電,比較常見的就是U盤,有線鍵鼠等。對于總線供電設備,消耗電流超過500mA會報浪涌保護。設備通過設備描述符向主機自報家門,報告的信息包含供電配置(即自供電/總線供電)以及功耗要求。

主機會判斷是否能夠提供設備所需要的最大功耗,若可以則進行設備的枚舉,若滿足不了則拒絕枚舉該設備。

處于掛起模式的USB總線供電設備,高功耗總線設備消耗電流不能超過2.5mA,低功耗總線設備消耗電流不能超過0.5mA

SOF(start of frame)

EOF(end of packet)

一般情況下設備不會檢測到3mS無數據傳輸從而進入掛起模式,只有當主設備進入休眠狀態或者主設備有意停止信號發送時從設備才會進入掛起模式。如當U盤插到筆記本上后是正常工作的模式,當筆記本蓋子扣上后進入掛起模式。

差分信號傳輸,和RS485、CAN在硬件層面很類似,因為差分信號抗干擾能力比較強。總線處于Idle狀態大于3mS從設備就會進入掛起模式,低速和全速模式下的J狀態是不同的

USB主機內部都是通過15K電阻下拉到地的,因此當無設備接入時,D+、D-均為低電平。在USB從設備中,如果從設備是高速設備則會將D+通過1.5K電阻上拉到VBUS。如果從設備是低速設備則會在將D-通過1.5K電阻上拉至VBUS。因此主機通過對D-、D-電平的檢測,就可以判斷出是否有設備接入以及接入設備的通訊速度。

當需要傳輸的數據長度大于接口上端點的最大傳輸數據長度,則數據會被分為多個transaction進行傳輸,如需要傳送100byte,斷點的最大傳輸數據長度為64byte,則需要分為2個transaction進行傳送。每一個transaction都需要由3個packet組成,只有在同步傳輸是transaction中沒有握手包。

PID用于區分不同包的類型,就是上面Packet的四大類,不同類型的包,其組成部分即PID后面跟的內容也是不同的。

令牌包中的幀號和數據是不存在的

SOF包中不存在地址和數據

數據包中無地址和幀號

握手包中無地址、幀號、數據、CRC,握手包用于表示當前傳輸的傳輸狀況

接收方只有正確收到數據包且數據包的PID和自身期望的PID一致時才會toggle自身的PID。發送方只有收到來自接收方有效的ACK握手信號后才會toggle自身的PID。數據傳輸起始的PID會在USB reset階段被清0,因此傳輸開始時發送方和接收方都是DATA0的PID。

當接收方在成功接收一個數據包并toggle自身的PID(從DATA0變為DATA1),在回復發送方ACK信號的過程中由于某種原因造成ACK信號被破壞,因此發送方并未受到ACK信號。發送方不切換自身的PID(保持DATA0),此時收發雙方的PID不再保持一致。在下一次通訊的時候,發送方以DATA0作為PID進行數據的發送。當數據正確到達接收方時,接收方發現當前數據的PID和自身的PID對不上,因此回復ACK信號表示當前數據已成功收到,但其并不toggle自身的PID。當發送方收到接收方返回的ACK信號時會切換自身的PID(從DATA0變為DATA1),在下一次通訊的時候,手法雙方就又會回到同步的狀態(收發雙方的PID都是DATA1)。

?

參考資料:

【1】B站視頻

?視頻對應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

總結

以上是生活随笔為你收集整理的STM32 USB虚拟串口原理(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。