經(jīng)歷了一個多月的調(diào)試,最終終于使用basys2將tcp模式配置成功了。
首先說一下思路吧,首先W5500的發(fā)送與接收與開發(fā)板的通信使用的是SPI協(xié)議,下降沿發(fā)送,上升沿接收。每次發(fā)送的數(shù)據(jù)格式為前十六位為地址位,之后五位為寄存器區(qū)的選塊,例如常用的為5‘b00000為通用寄存器區(qū),5’b00001為socket1寄存器區(qū)。接下來一位為讀寫操作位,0為讀數(shù)據(jù),1為寫數(shù)據(jù)。接下來兩位是SPI模式選擇,00代表使用SCSN信號確定位寬,01代表一位字長(八個二進制數(shù)),10代表兩位字長(十六個二進制數(shù)),11代表四位字長(32個二進制數(shù))。隨后便是和之前字長相匹配的數(shù)據(jù)位。格式如下:
0000000000000000_ 00000__1_01_00000000
地址位 寄存器區(qū) 寫 一位字長 數(shù)據(jù)
在發(fā)送數(shù)據(jù)與接收數(shù)據(jù)的時候,要保證數(shù)據(jù)位和SCK信號沿對其,同時要保證SCSN為低電平。具體的SPI發(fā)送可以參考之前的博客。
說完了發(fā)送的格式,接下來我們來說一說發(fā)送的數(shù)據(jù)。
首先我們要明確我們要配置數(shù)據(jù),我們要發(fā)送我們的IP,GATEWAY,MAC,端口以及目的IP,端口。實際上我們講的發(fā)送應該是配置寄存器,我們是在將我們發(fā)送所必須的信息寫入寄存器中。在發(fā)送數(shù)據(jù)之前我們要首先將我們W5500通過外邊的接口硬復位,之后對模式寄存器進行讀操作,直到模式寄存器的最低位為0時,即復位完成,我們在進行其他的寫入操作。在復位結(jié)束之后,我們可以將IP,MAC,GATEWAY等數(shù)據(jù)寫入對應的寄存器中,具體的寄存器地址和所屬寄存器區(qū)具體參看W5500的手冊,里邊的東西都寫的非常清楚。
在配置完成這些之后,我們對socket1 mode即1端口的模式選擇寄存器進行書寫,將W5500模式選擇為TCP模式。具體的操作為將對應的后三位寫入為001。之后再對該寄存器進行讀操作,以此來確定模塊卻是在TCP模式運行。確認之后開始配置目標IP,端口,最大字長等信息。之所以先配置TCP模式是因為我們后邊配置的寄存器都屬于端口寄存器區(qū),而我們在配置之前應先配置模式寄存器。
完成這些配置之后,我們來接觸兩個很特殊但是也很重要的寄存器,一個是CR寄存器,另一個是SR寄存器(原諒我平板打字實在不想寫全稱了)。在我們完成以上基礎的寄存器配置之后,我們對CR寄存器寫入對應特定的值,該值可以讓模塊進行對應的操作。而我們要知道該操作是否完成,我們就要對SR寄存器進行讀操作,讀出的對應值代表模塊當前所處在的模式狀態(tài)。如我們最初對CR寄存器寫入值0x01,表示我們將模塊設置為TCP,之后我們對SR寄存器進行讀操作,如果讀出的值是0x13,那么代表模塊當前處在TCP客戶端模式,我們即可進行下一步操作。我們之后再進行對應的操作,例如要將模塊設置為偵聽狀態(tài)下,將CR寄存器寫入0x04,讀SR寄存器值為0x17即為處在偵聽狀態(tài)。接下來我們對發(fā)送區(qū)讀指針寄存器讀操作來獲取當前讀指針,隨后根據(jù)讀指針讀出的數(shù)據(jù)將我們要發(fā)送的數(shù)據(jù)寫入到發(fā)送緩存即可。這樣就完成了數(shù)據(jù)的發(fā)送。
這樣,我們將配置的大概思路講完了。
設計模塊如下
在具體書寫時,我將SPI發(fā)送與接收寫在了一個模塊,而且發(fā)送與接收都只是發(fā)送8位和接收8位。SCSN信號是在該模塊中產(chǎn)生,具體發(fā)送與接收都是使用狀態(tài)機來書寫,SCSN信號在發(fā)送第一位的時候拉低,最后一位發(fā)送結(jié)束之后拉高。(注意,是發(fā)送結(jié)束之后不是發(fā)送最后一位時就拉低。)SPI發(fā)送與接收部分就結(jié)束了,在書寫時要注意接收條件為SCSN信號為低信號同時SCK信號的上升沿,發(fā)送的條件是SCSN信號為低同時SCK信號的下降沿。
8位發(fā)送數(shù)據(jù)波形如下
我們將要發(fā)送的信息寫在一個狀態(tài)機模塊中,通過狀態(tài)機來實現(xiàn)發(fā)送信息的按順序發(fā)送。我們將每次發(fā)送的信息按照8位來拆解,想對應的想發(fā)送一位時就要發(fā)送總共32位,和下來就是發(fā)送四段。兩位時發(fā)送五段,四位時發(fā)送7段。相應的讀操作也是一樣,由于我在我所做的項目中所需讀的數(shù)據(jù)均為一個字長,即為8位,所以我只寫了讀一個字長的操作。拆解的過程就是移位加取高8位,另加一個計數(shù)器即可完成。而每次發(fā)送的觸發(fā)信號即為上邊的SPI控制模塊在接受或者發(fā)送結(jié)束后發(fā)送的結(jié)束信號。當接收到發(fā)送或接收的結(jié)束信號,即可將下一個8位數(shù)據(jù)傳輸給SPI控制模塊。
最后我寫了一個同步FIFO來將幾個拆分的幾位數(shù)據(jù)合并。
合并之后波形如下
其實最初這個FIFO是用來救場的,由于最初書寫的時候沒有認真的研究說明書,想成每次發(fā)送8位,后來意識到這件事情的時候時間有些緊張,就想寫一個FIFO來救個場,就過再后來做的時候,發(fā)現(xiàn)實際上是因禍得福,這種書寫方式可以有效的減少資源,而且在SPI控制模塊也會更加簡單,在最后糾錯時也好找錯誤字段。
到此,設計思路和配置思路均結(jié)束。這幾天還是有些忙,稍后把仿真圖補一下吧。等到元旦后期末結(jié)束了認認真真的將W5500數(shù)據(jù)傳輸從硬件連接到網(wǎng)絡編程寫一篇大報告分享出來。
最后,說個心聲吧,從ping通到今天完成,足足過了5,6這五六周,有躊躇滿志,更多的是茫然無措。但是我就決定一定要做出來?,F(xiàn)在完成之后激動的都不想睡覺了抓緊時間總結(jié)發(fā)出來。代碼量對于我來說感覺仿佛突破了自己,風格可能還很稚嫩,但是真的很有成就感。尤其是在一個問題卡住了2周多的時間結(jié)果一個偶然發(fā)現(xiàn)是配置管腳的UCF錯了但時候,恨透了愚蠢的自己。這段時間的學習真的收獲了太多了,感謝這段時間的自己。
-
FPGA設計
+關注
關注
9文章
428瀏覽量
26465 -
TCP
+關注
關注
8文章
1347瀏覽量
78933
發(fā)布評論請先 登錄
相關推薦
評論