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