STM32之W5500网络通信

  • 一、W5500
  • 二、DHCP
  • 三、modbus
  • 四、实现web服务
  • 参考

一、W5500

  • Niren_W5500模块是一款基于WIZnet W5500芯片的以太网模块,是泥人电子继 Niren_W5100模块后设计的一块性能更好、性价比更高的以太网模块。模块集成硬件化TCP/IP协议:内部32K字节存储器作TX/RX

修改main.c代码如下:

修改以太网本地ip地址:

SPI代码:

void SPI_Configuration(void)
{GPIO_InitTypeDef   GPIO_InitStructure;SPI_InitTypeDef      SPI_InitStructure;     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);    /* 初始化SCK、MISO、MOSI引脚 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);/* 初始化CS引脚 */GPIO_InitStructure.GPIO_Pin = W5500_SCS;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);/* 初始化配置STM32 SPI1 */SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode=SPI_Mode_Master;                         //设置为主SPISPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;                       //SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;                         //时钟悬空低SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;                          //数据捕获于第1个时钟沿SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;                               //NSS由外部管脚管理SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;   //波特率预分频值为2SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;                    //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial=7;                                //CRC多项式为7SPI_Init(SPI1,&SPI_InitStructure);                                    //根据SPI_InitStruct中指定的参数初始化外设SPI1寄存器SPI_Cmd(SPI1,ENABLE);   //STM32使能SPI1
}

运行程序后,修改默认ip,然后连接网线,并连接到设定网络,启动服务,测试tcp通信:


二、DHCP

device.c:

void set_network(void)
{uint8 ip[4];setSHAR(ConfigMsg.mac);/*配置Mac地址*/setSUBR(ConfigMsg.sub);/*配置子网掩码*/setGAR(ConfigMsg.gw);/*配置默认网关*/setSIPR(ConfigMsg.lip);/*配置Ip地址*///Init. TX & RX Memory size of w5500sysinit(txsize, rxsize); /*初始化8个socket*/setRTR(2000);/*设置溢出时间值*/setRCR(3);/*设置最大重新发送次数*/getSIPR (ip);printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);getSUBR(ip);printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);getGAR(ip);printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);}

运行结果:


三、modbus

main.c:

int main(void)
{unsigned char i;/* Initialize STM32F103 */System_Initialization();//系统配置SysTick_Init();//启动系统滴答定时器 SysTick/* Config W5500 */W5500_Configuration();//W5500配置Delay_ms(200);//延时等待/* Modbus-TCP Init */eMBTCPInit(MB_TCP_PORT_USE_DEFAULT); //端口依赖事件模块初始化Delay_ms(200); //延时等待/* Enable Modbus-TCP Stack */    eMBEnable();//激活协议栈    printf("\r\nModbus-TCP Start!\r\n");printf("IP:192.168.1.190\r\n");while(1){i=Read_SOCK_1_Byte(0,Sn_SR);  //读W5500状态if(i==0)   {do{Delay_ms(100);//延时等待}while(Socket_Listen(0)==FALSE);//设置“Socket n”为“TCP服务器模式”}else if(i==SOCK_ESTABLISHED)         //建立TCP连接{eMBPoll();//启动modbus侦听BSP_LED();//线圈控制LED灯}}
}

w5500参数配置:

/* W5500 configuration */
void W5500_Configuration()
{unsigned char array[6];GPIO_SetBits(GPIO_W5500_RST_PORT, GPIO_W5500_RST_Pin);//上拉Delay_ms(100);    /*delay 100ms 使用systick 1ms时基的延时*///等待以太网链路while((Read_1_Byte(PHYCFGR)&LINK)==0);         /* Waiting for Ethernet Link */Write_1_Byte(MR, RST);//写入W5500普通寄存器一个字节Delay_ms(20);        /*delay 20ms *//* Set Gateway IP as: 192.168.1.1 */array[0]=192;array[1]=168;array[2]=1;array[3]=1;Write_Bytes(GAR, array, 4);//设置网关IP/* Set Subnet Mask as: 255.255.255.0 */array[0]=255;array[1]=255;array[2]=255;array[3]=0;Write_Bytes(SUBR, array, 4);//设置子网掩码/* Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 */array[0]=0x48;array[1]=0x53;array[2]=0x00;array[3]=0x57;array[4]=0x55;array[5]=0x00;Write_Bytes(SHAR, array, 6);//设置MAC地址/* Set W5500 IP as: 192.168.1.128 */array[0]=192;array[1]=168;array[2]=1;array[3]=190;Write_Bytes(SIPR, array, 4);//设置W5500的IP地址
}

运行结果:


四、实现web服务

void SPI1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 |    RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;       SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;           SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  SPI_InitStructure.SPI_CRCPolynomial = 7;    SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè}
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));SPI1->CR1&=0XFFC7;SPI1->CR1|=SPI_BaudRatePrescaler;   SPI_Cmd(SPI1,ENABLE); }

w5500参数:

#ifdef __DEF_IINCHIP_PPP__#include "md5.h"
#endifstatic uint8 I_STATUS[MAX_SOCK_NUM];
static uint16 SSIZE[MAX_SOCK_NUM]; /**< Max Tx buffer size by each channel */
static uint16 RSIZE[MAX_SOCK_NUM]; /**< Max Rx buffer size by each channel */uint8 getISR(uint8 s)
{return I_STATUS[s];
}
void putISR(uint8 s, uint8 val)
{I_STATUS[s] = val;
}uint16 getIINCHIP_RxMAX(uint8 s)
{return RSIZE[s];
}
uint16 getIINCHIP_TxMAX(uint8 s)
{return SSIZE[s];
}
void IINCHIP_CSoff(void)
{WIZ_CS(LOW);
}
void IINCHIP_CSon(void)
{WIZ_CS(HIGH);
}
u8  IINCHIP_SpiSendData(uint8 dat)
{return(SPI2_SendByte(dat));
}void IINCHIP_WRITE( uint32 addrbsb,  uint8 data)
{IINCHIP_ISR_DISABLE();                        // Interrupt Service Routine DisableIINCHIP_CSoff();                              // CS=0, SPI startIINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);    // Data write command and Write data length 1IINCHIP_SpiSendData(data);                    // Data write (write 1byte data)IINCHIP_CSon();                               // CS=1,  SPI endIINCHIP_ISR_ENABLE();                         // Interrupt Service Routine Enable
}uint8 IINCHIP_READ(uint32 addrbsb)
{uint8 data = 0;IINCHIP_ISR_DISABLE();                        // Interrupt Service Routine DisableIINCHIP_CSoff();                              // CS=0, SPI startIINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2IINCHIP_SpiSendData( (addrbsb & 0x000000F8))    ;// Data read command and Read data length 1data = IINCHIP_SpiSendData(0x00);             // Data read (read 1byte data)IINCHIP_CSon();                               // CS=1,  SPI endIINCHIP_ISR_ENABLE();                         // Interrupt Service Routine Enablereturn data;
}uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len)
{uint16 idx = 0;if(len == 0) printf("Unexpected2 length 0\r\n");IINCHIP_ISR_DISABLE();IINCHIP_CSoff();                              // CS=0, SPI startIINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);    // Data write command and Write data length 1for(idx = 0; idx < len; idx++)                // Write data in loop{IINCHIP_SpiSendData(buf[idx]);}IINCHIP_CSon();                               // CS=1, SPI endIINCHIP_ISR_ENABLE();                         // Interrupt Service Routine Enable    return len;
}uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len)
{uint16 idx = 0;if(len == 0){printf("Unexpected2 length 0\r\n");}IINCHIP_ISR_DISABLE();//SPI MODE I/FIINCHIP_CSoff();                                  // CS=0, SPI startIINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2IINCHIP_SpiSendData( (addrbsb & 0x000000F8));    // Data write command and Write data length 1for(idx = 0; idx < len; idx++)                    // Write data in loop{buf[idx] = IINCHIP_SpiSendData(0x00);}IINCHIP_CSon();                                   // CS=1, SPI endIINCHIP_ISR_ENABLE();                             // Interrupt Service Routine Enablereturn len;
}

http请求

void do_http(void)
{uint8 ch=SOCK_HTTP;uint16 len;st_http_request *http_request;memset(rx_buf,0x00,MAX_URI_SIZE);http_request = (st_http_request*)rx_buf;        // struct of http request  /* http service start */switch(getSn_SR(ch)){case SOCK_INIT:listen(ch);break;case SOCK_LISTEN:break;case SOCK_ESTABLISHED://case SOCK_CLOSE_WAIT:if(getSn_IR(ch) & Sn_IR_CON){setSn_IR(ch, Sn_IR_CON);}if ((len = getSn_RX_RSR(ch)) > 0)     {len = recv(ch, (uint8*)http_request, len); *(((uint8*)http_request)+len) = 0;proc_http(ch, (uint8*)http_request); // request is processeddisconnect(ch);}break;case SOCK_CLOSE_WAIT:   if ((len = getSn_RX_RSR(ch)) > 0){//printf("close wait: %d\r\n",len);len = recv(ch, (uint8*)http_request, len);       *(((uint8*)http_request)+len) = 0;proc_http(ch, (uint8*)http_request); // request is processed}disconnect(ch);break;case SOCK_CLOSED:socket(ch, Sn_MR_TCP, 80, 0x00);    /* reinitialize the socket */break;default:break;}// end of switch
}void JTXD_do_http(void)
{uint8 ch=SOCK_HTTP;uint16 len;st_http_request *http_request;memset(rx_buf,0x00,MAX_URI_SIZE);http_request = (st_http_request*)rx_buf;        // struct of http request/* http service start */switch(getSn_SR(ch)){case SOCK_INIT:listen(ch);break;case SOCK_LISTEN:break;case SOCK_ESTABLISHED://case SOCK_CLOSE_WAIT:if(getSn_IR(ch) & Sn_IR_CON){setSn_IR(ch, Sn_IR_CON);}if ((len = getSn_RX_RSR(ch)) > 0)       {len = recv(ch, (uint8*)http_request, len); *(((uint8*)http_request)+len) = 0;JTXD_proc_http(ch, (uint8*)http_request); // request is processeddisconnect(ch);}break;case SOCK_CLOSE_WAIT:   if ((len = getSn_RX_RSR(ch)) > 0){//printf("close wait: %d\r\n",len);len = recv(ch, (uint8*)http_request, len);       *(((uint8*)http_request)+len) = 0;JTXD_proc_http(ch, (uint8*)http_request); // request is processed}disconnect(ch);break;case SOCK_CLOSED:                   socket(ch, Sn_MR_TCP, 80, 0x00);    /* reinitialize the socket */break;default:break;}// end of switch
}

运行结果:


参考

STM32+W5500网络通信

STM32之W5500网络通信相关推荐

  1. 基于STM32和W5500的Modbus TCP通讯

     在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植前的准备工作 为了实现Modbus ...

  2. STM32驱动W5500连接腾讯云

    STM32驱动W5500连接腾讯云 1.W5500简介    W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP ...

  3. 基于stm32之w5500以太网应用

    基于stm32之w5500以太网应用 强调一下前半段为基础知识普及(这段还是很重要的.不管用什么工具开发精通协议才是王道),后半段为实战代码干货. 如上图所示,最底下的一层叫做"物理层&qu ...

  4. STM32F103+W5500网络通信

    STM32F103+W5500网络通信 一.W5500模块 (一)W5500以太网模块介绍 (二)模块排针功能表 二. modbus协议 (一)modbus协议原理 (二)Modbus 通讯方式 1. ...

  5. STM32基于W5500模块实现通信

    目录 一.W5500及modbus 二.代码实现 1.初始化网络 2.响应函数 3.main函数循环 三.通信结果 链接 一.W5500及modbus W5500 芯片是一款集成全硬件 TCP/IP ...

  6. AD原理图设计、STM32+W5500网络通信

    一.Altium Designer (一)简介 Altium Designer 提供了唯一一款统一的应用方案,其综合电子产品一体化开发所需的所有必须技术和功能.Altium Designer 在单一设 ...

  7. STM32/TMS320F2812+W5500硬软件调试总结

    使用STM32+W5500方案是一种比较节省CPU开支的方案,无需多余的CPU资源管理Lwip协议. 调试的时候很多情况下无法通信,现结合笔者近10年的调试经验(每次用W5500做板子,不会说是一帆风 ...

  8. STM32之W5500:掉线重联????

    1.前言 经常的情况下,我们的w5500芯片是不能够支持所谓"热拔插",因为w5500工作在tcp的模式下的时候,没有能够检测对端的设备是否还存在,所以当拔掉网线的情况下,它的so ...

  9. STM32驱动W5500动态分配IP

    TM32驱动W5500动态分配IP 1.W5500简介    W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP ...

最新文章

  1. Binary Differences
  2. asp.net获取页面url参数值的实现代码实例
  3. Redis序列化配置类
  4. 深度模型的起跑线,初始化的意义
  5. Oracle基本概念与数据导入
  6. Switchover and Failover说明
  7. java编写算术平均数,[求助]基础-怎样编一个计算算术平均数的程序(急啊)
  8. android 聊天背景图片,Android 实现从本地读取图片更改聊天背景
  9. java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
  10. LeetCode 463. Island Perimeter
  11. 混乱的MVC,.NET非要MVC不可么?
  12. Java学习-Overload和Override的区别
  13. Navicat Premium 12破解方法(亲测可用)
  14. 应用之星教你制作高下载量的App
  15. AI会玩魔方了!全是自学,比任何人都快,包括机器人
  16. Java学习手册:大疆创新2020届校园招聘——软件类岗位B卷题一
  17. 游戏机器人的开发工具及开发步骤
  18. ajax三种错误ie,ie下jquery ajax 80020101错误的解决方法
  19. 目标跟踪 | 3D目标跟踪高级入门!
  20. 【机房收费个人版】触发器与存储过程

热门文章

  1. 【UnityShader】自定义unity粒子系统使用的shader
  2. 什么是Base64算法
  3. 小米(红米)AC2100 硬路由配置的坑
  4. 1985-2016年全球自杀数据分析(Kaggle)
  5. thinkphp php5.4,【thinkphp下载】thinkphp官方最新版 v5.0.24 完整版-开心电玩
  6. C语言实现BMP图片的放大缩小-24位
  7. cloudSim学习
  8. 从空间分布、空间关系、空间演化、属性数据的扩展与再分析、数据分析扩展的角度举例分析GIS空间分析的特点与重要性,并且写出一句宣传GIS空间分析的广告语
  9. oracle 11g rac adg搭建,11G RAC ADG 配置
  10. GM7150BC是一颗将CVBS/S-Video视频源转换成BT656/601