第一,USB是little endian,不管是Byte或是Bit順序。
第二,免不了是一堆封包的格式規範,這個看看就好。比較重要的有:
- SOF(Start of Frame):SOF很重要,對HOST而言。如果你是作Device端的,看看就好。SOF基本上只有HOST可以發,如果是HS的話,是每125us發一次,每個裝置都要去聽SOF,因為後面就會開始資料傳輸了。FS的話是1ms發一次。
- HandShake封包:基本上就是收到資料回ACK,沒有資料回NAK(不是資料錯誤喔)。有問題回STALL,下一次的資料來不及準備,回NYET(但是這一次的已經收下)。ERR我沒見過,因為是HUB專用。
- HOST要讀資料之前,一定會發 In-Token,然後Device吐資料。注意喔,HOST在收到資料後,是不能回NAK的。這是因為HOST沒空間可以存資料幹嘛發In-Token?
- 同理,HOST要寫資料之前,一定會發Out-Token,然後吐資料給Device。
- Control Endpoint的資料傳輸比較特別,如果是Control In的話,順序是Setup packet --> Data In --> 0 byte Data Out --> Device Ack。如果是Control Out的話,順序是Setup packet --> Data Out --> In-token --> Device send 0 byte data --> HOST Ack。至於為什麼要定這麼奇怪的協定,我也不清楚...。一般工程師很容易犯的錯誤就是在Control Out的時候,最後沒發0 byte的資料,然後HOST就等在那邊,然後還會怪HOST沒做對...。
- 其他傳輸類型都是 In/Out Token --> Data --> ACK。Isochronous傳輸沒有ACK。
3 comments:
謝謝您的大作,是不是也能寫一下otg?最近一直抓不到問題的成因
不好意思,我沒碰過OTG....恕我無法幫助你。
大推經驗, 但需要有一定基礎才看得懂XD
Post a Comment