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