STM32学习笔记之驱动W5500建立tcp连接

根据官方使用手册以及网上大神的一些文章,自己根据需要从头到尾写了一遍,如下:

一、下载好官方的W5500库函数文件,里面包括的文件如图所示在这里插入图片描述
二、创建包含自定义的IP、MAC地址等信息的结构体(根据应用需求修改,也可输入,我这里直接固定

static wiz_NetInfo gWIZNETINFO = {{0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},
								  {192, 168, 88, 11},
                                  {255,255,255,0},
                                  {192, 168, 88, 1},
                                  {0,0,0,0},
                                  NETINFO_STATIC };             //

三、注册回调函数:注册临界回调函数、注册片选回调函数、注册SPI读写回调函数。
四、网络初始化函数:设置网络配置。把之前的结构体信息写进去。回读网络配置,放进一个新的结构体中。写配置与读配置进行比较, 相同则是设置成功,不同则失败。

void network_init()
{
	//uint32_t ret=0;
	wiz_NetInfo conf;
//	//ÉèÖÃÍøÂçÅäÖÃ
	if(ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO) == -1)
		{
			while(1);
		}
	//»Ø¶ÁÍøÂçÅäÖÃ
	if(ctlnetwork(CN_GET_NETINFO, (void*)&conf) == -1)
	{
		while(1);
	}
	
	if(memcmp(&conf,&gWIZNETINFO,sizeof(wiz_NetInfo)) == 0)
	{
		u3_printf("network config success!\r\n");
	}else
	{
		u3_printf("network config failed!\r\n");
	}

五、步骤如下:
1、系统初始化、SPI初始化、注册回调函数。
2、W5500初始化并软重置。
3、网络初始化。
此时W5500已经运作。接下是应用层。

	register_wizchip();
	
	if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){
		 while(1);
		
	}//³õʼ»¯w5500
	
	if(ctlwizchip(CW_RESET_WIZCHIP,(void *)0) == -1)
		{
			while(1);

		}//ÈíÖØÖÃw5500		
	
	do{
		 if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){
				u3_printf("Unknown PHY Link stauts.\r\n");
		}
	}while(tmp == PHY_LINK_OFF);
	
	network_init();
4、采取轮询的方式建立TCP连接。
switch(getSn_SR(SOCK_TCPS))											            	/*»ñÈ¡socketµÄ״̬*/
	{
		case SOCK_CLOSED:													                  /*socket´¦ÓڹرÕ״̬*/
			socket(SOCK_TCPS ,Sn_MR_TCP,7000,Sn_MR_ND);	        /*´ò¿ªsocket*/
			if(ret !=SOCK_TCPS )
			{
				u3_printf("socket failed!\r\n");
				delay_ms(1000);
			}
			setSn_KPALVTR(SOCK_TCPS,2);
			break;     
		case SOCK_INIT:														                  /*socketÒѳõʼ»¯×´Ì¬*/
			listen(SOCK_TCPS);												                /*socket½¨Á¢¼àÌý*/
			break;
		
		case SOCK_ESTABLISHED:												              /*socket´¦ÓÚÁ¬½Ó½¨Á¢×´Ì¬*/
			if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)
			{
				setSn_IR(SOCK_TCPS, Sn_IR_CON);								          /*Çå³ý½ÓÊÕÖжϱê־λ*/
			}
			len=getSn_RX_RSR(SOCK_TCPS);									            /*¶¨ÒålenΪÒѽÓÊÕÊý¾ÝµÄ³¤¶È*/
			if(len>0)
			{
				recv(SOCK_TCPS,tcp_buff,len);							              	/*½ÓÊÕÀ´×ÔClientµÄÊý¾Ý*/
				command_analyze((char *)tcp_buff);
				u3_printf("tcp_buff:%s\r\n",tcp_buff);
				if(heart == 1)
				{
					tcp_buff[len]=0x00; 																		/*Ìí¼Ó×Ö·û´®½áÊø·û*/
					send(SOCK_TCPS,tcp_buff,len);
					//u3_printf("tcp_buff:%s\r\n",tcp_buff);
					heart=0;		
				}			
			}
			break;
		
		case SOCK_CLOSE_WAIT:												                /*socket´¦Óڵȴý¹Ø±Õ״̬*/
			close(SOCK_TCPS);
			break;
	}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32CubeMX和HAL库驱动W5500的代码示例,使用SPI通信: ``` #include "main.h" #include "spi.h" #include "gpio.h" #include "w5500.h" #include "socket.h" #define WIZ_RESET_PORT GPIOA #define WIZ_RESET_PIN GPIO_PIN_1 void WIZ_CS_Select(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); } void WIZ_CS_Deselect(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); } void WIZ_SPI_Transmit(uint8_t *buf, uint16_t len) { HAL_SPI_Transmit(&hspi1, buf, len, 1000); } void WIZ_SPI_Receive(uint8_t *buf, uint16_t len) { HAL_SPI_Receive(&hspi1, buf, len, 1000); } void WIZ_Delay_ms(uint32_t ms) { HAL_Delay(ms); } int main(void) { HAL_Init(); MX_GPIO_Init(); MX_SPI1_Init(); WIZ_RESET_PORT->BSRR = WIZ_RESET_PIN; // Deassert reset HAL_Delay(10); WIZ_RESET_PORT->BRR = WIZ_RESET_PIN; // Assert reset HAL_Delay(10); WIZ_RESET_PORT->BSRR = WIZ_RESET_PIN; // Deassert reset HAL_Delay(1000); // Wait for W5500 to initialize uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x11, 0x22, 0x33}; uint8_t ip_addr[4] = {192, 168, 0, 10}; uint8_t gateway_addr[4] = {192, 168, 0, 1}; uint8_t subnet_mask[4] = {255, 255, 255, 0}; WIZ_Init(mac_addr, ip_addr, gateway_addr, subnet_mask); while (1) { uint8_t socket_num = 0; uint16_t port = 80; uint8_t server_ip_addr[4] = {192, 168, 0, 2}; uint16_t server_port = 8080; // Open socket uint8_t socket_status = 0; socket_num = socket(0, Sn_MR_TCP, port, 0); if (socket_num != 0xFF) { socket_status = getSn_SR(socket_num); if (socket_status == SOCK_INIT) { // Connect to server connect(socket_num, server_ip_addr, server_port); socket_status = getSn_SR(socket_num); if (socket_status == SOCK_ESTABLISHED) { // Send data to server uint8_t tx_buf[] = "Hello, server!"; send(socket_num, tx_buf, sizeof(tx_buf)); socket_status = getSn_SR(socket_num); if (socket_status == SOCK_ESTABLISHED) { // Receive data from server uint8_t rx_buf[1024] = {0}; uint16_t rx_len = recv(socket_num, rx_buf, sizeof(rx_buf)); if (rx_len > 0) { // Process received data } } } // Close socket close(socket_num); } } HAL_Delay(1000); } } ``` 在此示例中,`WIZ_Init`函数用于初始化W5500,`socket`、`connect`、`send`和`recv`函数用于与服务器进行TCP通信。注意,在使用W5500之前需要正确配置引脚、SPI和时钟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值