做了STM32 W5500联网通讯几个月了,回头总结一下 STM32 W5500 的TCP Server要注意的一些点:
1、有好用的W5500基础支持库
3、在测试的时候,条件允许登录到路由器的管理页面,查看连接设备是否有W5500的有线连接(非必须)。
满足以上几点,基本可以测通TCP Server的回环测试了。
贴出测试的主函数代码:
#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif
#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endif
#ifndef __Z_HARDWARE_LED_H
#define __Z_HARDWARE_LED_H
#include "z_hardware_led.h"
#endif
#ifndef __Z_HARDWARE_SPI_H
#define __Z_HARDWARE_SPI_H
#include "z_hardware_spi.h"
#endif
#include "w5500.h"
#include "socket.h"
#include "w5500_conf.h"
uint8 buffer[2048];
int main(void)
{
uint8 mac[6]={0x00, 0x0C, 0x32, 0xDA, 0x07, 0x4C};
uint8 lip[4]={192,168,1,112};
uint8 sub[4]={255,255,255,0};
uint8 gw[4]={192,168,1,1};
uint8 remote_ip[4] = {192,168,1,105};
uint16 remote_port = 9000;
uint16 local_port = 5000;
uint16 len;
u8 sock_status;
init_led();
init_system_spi();
func_w5500_reset();
setSHAR(mac);
setSUBR(sub);
setGAR(gw);
setSIPR(lip);
sysinit(txsize, rxsize);
setRTR(2000);
setRCR(3);
setkeepalive(0);
// socket(0,Sn_MR_UDP,local_port-1,0);
// buffer[0] = 0x55;
// buffer[1] = 0xAA;
// len = 2;
// sendto(0, buffer, len, remote_ip, remote_port);
for(;;)
{
sock_status = getSn_SR(1);
switch(sock_status)
{
case SOCK_CLOSED:
socket(1 ,Sn_MR_TCP,local_port,Sn_MR_ND);
break;
case SOCK_INIT:
listen(1);
break;
case SOCK_ESTABLISHED:
if(getSn_IR(1) & Sn_IR_CON)
{
setSn_IR(1, Sn_IR_CON);
}
len=getSn_RX_RSR(1);
if(len>0)
{
len = recv(1, buffer, len);
send(1, buffer, len);
}
break;
case SOCK_CLOSE_WAIT:
close(1);
break;
}
func_led1_on();
delay_ms(500);
func_led1_off();
delay_ms(500);
}
}
通过PC的CMD命令窗口PING设备:
回环测试的效果如下:
W5500的库函数,可以参考 《测试工程代码00_W5500_ping.rar》。
将以上的主函数替换到工程的主函数即可。
TCP Server的拓展应用场景,可以做一个小型的嵌入式Web网站。