在【EFM8 Universal Bee试用体验】通过SPI0+W5500以太网1--ping通的基础上,我们进一步修改函数,完成一个TCP Server的例子,并进行通讯验证.
1、Socket0的配置
- /* Config Scoket */
- void Socket0_Config(void)
- {
- /* Set Socket 0 Port Number as 5000 */
- Write_SOCK_2_Byte(0,Sn_PORT,5000);
- /* Set Maximum Segment Size as 1460 */
- Write_SOCK_2_Byte(0, Sn_MSSR, 500);
- /* Set RX Buffer Size as 2K */
- Write_SOCK_1_Byte(0,Sn_RXBUF_SIZE, 0x02);
- /* Set TX Buffer Size as 2K */
- Write_SOCK_1_Byte(0,Sn_TXBUF_SIZE, 0x02);
- }
复制代码
在这个函数中,我们首先设定了Socket0对应的端口号,然后设置最大数据帧长度为500字节,为什么呢,因为EMF8的内存太小了,设置的太大就放不下了,不过对于我们的测试还是够用了。
2、关闭Socket
- /**
- [url=home.php?mod=space&uid=2666770]@Brief[/url] This function close the socket and parameter is "s" which represent the socket number
- */
- void close(SOCKET s)
- {
- Write_SOCK_1_Byte(s, Sn_CR, CLOSE);
- /* wait to process the command... */
- while( Read_SOCK_1_Byte(s,Sn_CR) )
- ;
- /* ------- */
- /* all clear */
- Write_SOCK_1_Byte(s, Sn_IR, 0xFF);
- }
复制代码
目的是在通讯异常情况下关闭socket,并可以重新进入到等待连接状态。
3、loopback环路测试
- /* Process Received data */
- void Loop_Back(void)
- {
- unsigned int data i;
- i=Read_SOCK_Data_Buffer(0, S_Buffer); /* Read W5200 Data to Rx_Buffer */
- if(i==0)
- return;
- Write_SOCK_Data_Buffer(0, S_Buffer, i);
- do
- {
- i=Read_SOCK_1_Byte(0,Sn_IR);
- }while(((i&IR_TIMEOUT)==0)&&((i&IR_SEND_OK)==0));
- }
复制代码
这个函数的目的就是通过TCP的连接接收来自客户端的数据,并将数据反送给客户端,简单的说就是发什么收什么。
4、TCP Server进入监听状态的代码
- if((Read_1_Byte(PHYCFGR)&LINK)==0) /* Detect Ethernet Link */
- {
- LED0=1;
- Write_SOCK_1_Byte(0,Sn_CR,CLOSE);
- while((Read_1_Byte(PHYCFGR)&LINK)==0); /* Wait Ethernet Link */
- }
- i=Read_IR(0); /* Process IR */
- if(i&IR_TIMEOUT)
- {
- LED0=1;
- Write_SOCK_1_Byte(0,Sn_CR,CLOSE);
- }
- if(i&IR_CON)
- LED1=0;
- if(i&IR_DISCON)
- {
- LED1=1;
- Write_SOCK_1_Byte(0,Sn_CR,CLOSE);
- }
- i=Read_SOCK_1_Byte(0,Sn_SR);
- if(i==0)
- {
- Socket0_Config();
- while(Socket_Listen(0)==FALSE)
- Delay(1000);
- }
- else if(i==SOCK_ESTABLISHED)
- Loop_Back();
复制代码
5、接下来测试连接是否成功
这里设置的端口号为5000,通过软件建立了一个TCP的连接,绿色表示链接成功的建立,采用1s间隔发送“1234”这几个 数据,可以看到,TCP的接收区不断地打印出与发送相同的数据,这说明我们的loopback测试成功了。
|