以下文章來源于開心果 Need Car ,作者開心果 Need Car
相對于其他總線,以太網的知識龐雜,當然,可獲取的資料也豐富。以太網的知識從驅動層到上層協議棧,很難一下消化,所以,不妨從點開始,不斷地拓展和鏈接,從而形成完整地以太網知識框架,進而更好地解決工程問題。
本文,從通信出發,聊一聊以太網發送描述符(Transmit Descriptor)。
提示:基于TC4xx討論。
1、Transmit Descriptor
我們知道:相比與CAN、Lin等總線,以太網的數據吞吐量比較大,eg:1500bytes。如果讓CPU干數據搬運工作,尤其大量數據搬運工作,這有點"屈才"。所以,系統設計中,為了最大程度的釋放CPU,在以太網的數據搬運中,會使用專門的DMA(Direct Memory Access)搬運。如果想讓DMA知道如何搬運數據,就需要提前告知其搬運規則,因此,描述符(Descriptor)應用而生。對于以太網數據發送,則使用Transmit Descriptor描述以太網數據的發送規則。
Transmit Descriptor有兩種格式:Read格式和Write-Back格式。Transmit Descriptor Read Format如下所示:
如上圖,在進行數據發送時,需要注意字節序(單片機一般是小端模式),而如上的描述符可能需要大端處理。
Transmit Normal Descriptor (Write-Back Format),示意如下:
當DMA完成數據搬運以后,會對描述符進行寫回操作,主要操作TDES3的OWN和DESC STATUS位域,將發送狀態反饋給Application。
(一)Application與DMA的"握手"
描述符是Application與DMA之間的紐帶,Application通過描述符將待發送的信息填充到Transmit Descriptor中,DMA通過判斷DES3.OWN獲取發送請求。即:Application需要發送數據時,將數據地址放入Buffer1(對應DES0),同時,將一些控制信息寫入可用的Transmit Descriptor中,最后,設置DES3.OWN = 1,請求DMA發送數據,這一步可以看作:Application將操作后的發送描述符控制權交給DMA;當DMA發送完數據以后,將對應發送描述符的DES3.OWN復位(=0),這一步可以看作:DMA將目標描述符的控制權返還給Application。通過DES3.OWN,Application與DMA進行交流,也就是"握手"動作,進而保證數據有序交互,示意如下:
DMA發送完成或者接收完成,一般會有中斷觸發,如果有特殊操作,也可以在中斷回調函數中處理。
2、描述符鏈表
實際使用中,常常使用環形DMA描述符結構(DMA Descriptor Ring),示意如下:
如上結構,大家并不陌生。這里,我們需要注意一些細節。
(一)描述符間隔
當使用多個描述符時,描述符之間可以設置間隔(eg:DMA_Ch(#i)_Control寄存器的DSL位域,Descriptor Skip Length)。間隔設置多少需要根據手冊要求,本文可以設置的數據間隔:DWord(8 byte)的整數倍,如果DSL = 0,則意味著描述符間沒有間隔。
(二)發送描述符操作的寄存器
理解以太網發送,還需要理解與描述符操作相關的寄存器。本文聚焦發送相關的幾個DMA寄存器:
DMA_CHi_TXDESC_LIST_ADDRESS:發送描述符的基地址,指向發送描述符鏈表的第一個描述符,初始化時賦值;
DMA_CHi_CURRENT_APP_TXDESC:當前發送描述符,指向DMA當前可用的描述符;
DMA_CHi_TXDESC_RING_LENGTH:存放發送描述符長度,可使用長度 = n + 1(n是寄存器中存儲的實際值);
DMA_CHi_TXDESC_TAIL_POINTER:發送描述符尾指針,每次請求發送以太網Frame后,需要Application更新Transmit Descriptor地址,即:指向下一個可用的空閑描述符地址。
如果Current Descriptor Pointer == Descriptor Tail Pointer,則DMA會自動掛起(Suspend),停止數據搬運。當Application再次請求數據發送時,需要向Descriptor Tail Pointer中寫入發送信息,偏移Descriptor Tail Pointer,使其滿足:Current Descriptor Pointer < Descriptor Tail Pointer。如果Descriptor Tail Pointer偏移到尾部,則重新回到Descriptor Base Address。
3、以太網幀發送流程
以太網Frame的發送流程,示意如下:
具體發送流程解讀:
1、Application通過DMA_CHi_CURRENT_APP_TXDESC寄存器獲取當前可用的發送描述符地址,將發送信息填充到可用的發送描述符中,即:告知DMA搬運規則。之后,Application將TDES3.OWN置位(=1),請求發送數據;
2、DMA能否搬運數據,需要判斷DMA的工作模式,如果DMA處于Stop模式,需要重新啟動DMA。通過判斷DMA_CHj_Status (j=0-7)的TPS(Transmit Process Stopped)位域確認其是否處于Stop模式。具體描述:如果TPS == 1,表示DMA處于Stop模式,需要向TPS位域寫1清除,同時,進行DMA使能操作。當然,還可以進一步的檢查其他信息,eg:TBU(Transmit Buffer Unavailable);
3、當Application將描述符的控制權交給DMA以后,還需要Transmit Poll Demand,即:向DMA_CHi_TXDESC_TAIL_POINTER寄存器寫入信息,一般寫入下一個可用發送描述符地址,讓DMA脫離掛起狀態,去查詢待處理的發送描述符信息;
4、當DMA發送完數據以后,DMA_CHi_CURRENT_APP_TXDESC寄存器的發送描述符地址自動偏移一個,如果Current Descriptor Pointer < Descriptor Tail Pointer,DMA繼續發送數據;如果Current Descriptor Pointer == Descriptor Tail Pointer,DMA隨即掛起(Suspend),停止數據搬運,同時,數據的發送狀態回寫(write-back)到TDES3中。
數據的發送流程關鍵步驟如上,理解了數據發送,也就不難理解數據的接收過程。
(一)DMA狀態變化流程
1、以太網專用DMA初始化以后,如果沒有數據發送,進入Suspend狀態。此時,DMA_CHi_TXDESC_TAIL_POINTER指向空,示意如下:
2、Application請求發送數據時,從DMA_CHi_CURRENT_APP_TXDESC寄存器獲取可用的發送描述符地址,填充發送規則。向DMA_CHi_TXDESC_TAIL_POINTER寄存器寫入下一個可用描述符地址,使其滿足Current Descriptor Pointer < Descriptor Tail Pointer,即:觸發DMA發送,示意如下:
3、Frame發送完成以后,DMA_CHi_CURRENT_APP_TXDESC寄存器中的可用描述符地址,自動向后偏移一個,使得Current Descriptor Pointer == Descriptor Tail Pointer,DMA隨即掛起(Suspend),示意如下:
-
以太網
+關注
關注
40文章
5419瀏覽量
171598 -
cpu
+關注
關注
68文章
10854瀏覽量
211576 -
通信
+關注
關注
18文章
6024瀏覽量
135950 -
總線
+關注
關注
10文章
2878瀏覽量
88051
原文標題:深刻理解以太網發送,必經DMA Transmit Descriptor
文章出處:【微信號:Rocker-IC,微信公眾號:路科驗證】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論