全硬件TCP/IP协议栈学习笔记 W5500+FPGA实现tcp连接

经历了一个多月的调试,最终终于使用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错了但时候,恨透了愚蠢的自己。这段时间的学习真的收获了太多了,感谢这段时间的自己。

猜你喜欢

转载自blog.csdn.net/stanary/article/details/78704417
今日推荐