找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6530|回复: 2
打印 上一主题 下一主题
收起左侧

stm32+w5500建立TCP连接 源码

[复制链接]
跳转到指定楼层
楼主
  1. #include "usart.h"
  2. #include "device.h"
  3. #include "spi2.h"
  4. #include "ult.h"
  5. #include "socket.h"
  6. #include "w5500.h"
  7. #include "24c16.h"
  8. #include "md5.h"
  9. #include "string.h"

  10. extern uint8 txsize[];                                                                                // 引用外部变量,声明Socket发送缓存大小
  11. extern uint8 rxsize[];                                                                                // 引用外部变量,声明Socket接收缓存大小

  12. uint8 buffer[2048];                                                                                                // 定义一个2KB的数组,用来存放Socket的通信数据

  13. int main(void)
  14. {
  15.   uint8 server_ip[4]={192,168,1,151};                        // 配置远程服务器IP地址
  16.         uint16 server_port=5000;                                                                // 配置远程服务器端口
  17.   uint16 local_port=6000;                                                                        // 初始化一个本地端口
  18.   uint16 len=0;
  19.         
  20.   /***** MCU时钟初始化 *****/                                                         
  21.         Systick_Init(72);        
  22.         
  23.         /***** 中断控制器配置 *****/
  24.         NVIC_Configuration();
  25.         
  26.         /***** GPIO、SPI初始化 *****/
  27.         GPIO_Configuration();                        
  28.         WIZ_SPI_Init();
  29.         
  30.         /***** 串口初始化 *****/
  31.         USART1_Init();                 
  32.         
  33.         /***** 初始化eeprom *****/
  34.   at24c16_init();
  35.         
  36.         /***** 硬重启W5500 *****/
  37.         Reset_W5500();
  38.         
  39.         /***** W5500的IP信息初始化 *****/
  40.         set_default();                                                                                                                 // 设置默认MAC、IP、GW、SUB、DNS
  41.         set_network();                                                                                                                // 配置初始化IP信息并打印,初始化8个Socket
  42.         
  43.         /***** 打开W5500的Keepalive功能 *****/
  44.         setkeepalive(0);
  45.         
  46.         printf("TCP Server IP: %d.%d.%d.%d \r\n",server_ip[0],server_ip[1],server_ip[2],server_ip[3]);
  47.   printf("TCP Server Port: %d \r\n",server_port);        
  48.         printf("W5500 Init Complete!\r\n");
  49.   printf("Start TCP Client Test!\r\n");
  50.   
  51.         /*Socket状态机,MCU通过读Sn_SR(0)的值进行判断Socket应该处于何种状态
  52.                 Sn_SR状态描述:
  53.                 0x00                SOCK_CLOSED
  54.                 0x13                SOCK_INIT
  55.                 0x14                SOCK_LISTEN
  56.                 0x17                SOCK_ESTABLISHED
  57.                 0x1C                SOCK_CLOSE_WAIT
  58.                 0x22                SOCK_UDP
  59.         */
  60.         while(1)                                                                                                                                                                // Socket状态机
  61.         {        
  62.                 switch(getSn_SR(0))                                                                                                                // 获取socket0的状态
  63.                 {
  64.                         case SOCK_INIT:                                                                                                                        // Socket处于初始化完成(打开)状态
  65.                                         connect(0, server_ip,server_port);                        // 配置Sn_CR为CONNECT,并向TCP服务器发出连接请求
  66.                         break;
  67.                         case SOCK_ESTABLISHED:                                                                                        // Socket处于连接建立状态
  68.                                         if(getSn_IR(0) & Sn_IR_CON)                                          
  69.                                         {
  70.                                                 setSn_IR(0, Sn_IR_CON);                                                                // Sn_IR的CON位置1,通知W5500连接已建立
  71.                                         }
  72.                                         // 数据回环测试程序:数据从上位机服务器发给W5500,W5500接收到数据后再回给服务器
  73.                                         len=getSn_RX_RSR(0);                                                                                // len=Socket0接收缓存中已接收和保存的数据大小
  74.                                         if(len>0)
  75.                                         {
  76.                                                 recv(0,buffer,len);                                                                                // W5500接收来自服务器的数据,并通过SPI发送给MCU
  77.                                                 printf("%s\r\n",buffer);                                                        // 串口打印接收到的数据
  78.                                                 send(0,buffer,len);                                                                                // 接收到数据后再回给服务器,完成数据回环
  79.                                         }
  80.                                         // W5500从串口发数据给客户端程序,数据需以回车结束
  81.                                         if(USART_RX_STA & 0x8000)                                                                // 判断串口数据是否接收完成
  82.                                         {                                          
  83.                                                 len=USART_RX_STA & 0x3fff;                                                // 获取串口接收到数据的长度
  84.                                                 send(0,USART_RX_BUF,len);                                                        // W5500向客户端发送数据
  85.                                                 USART_RX_STA=0;                                                                                                // 串口接收状态标志位清0
  86.                                                 memset(USART_RX_BUF,0,len+1);                                        // 串口接收缓存清0
  87.                                         }
  88.                         break;
  89.                         case SOCK_CLOSE_WAIT:                                                                                                // Socket处于等待关闭状态
  90.                                         close(0);                                                                                                                                // 关闭Socket0
  91.                         break;
  92.                         case SOCK_CLOSED:                                                                                                                // Socket处于关闭状态
  93.                                         socket(0,Sn_MR_TCP,local_port,Sn_MR_ND);                // 打开Socket0,并配置为TCP无延时模式,打开一个本地端口
  94.                         break;
  95.                 }
  96.         }
  97. }
复制代码


0.png (5.69 KB, 下载次数: 53)

0.png

TCPC.zip

337.23 KB, 下载次数: 185, 下载积分: 黑币 -5

w5500,TCP建立程序

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:689565 发表于 2020-5-2 16:01 | 只看该作者
学习了,在此基础上来实现UDP通信
回复

使用道具 举报

板凳
ID:432004 发表于 2020-8-1 13:46 | 只看该作者
和32的接线 不说下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表