STM32之W5500网络通信
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网络通信相关推荐
- 基于STM32和W5500的Modbus TCP通讯
在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植前的准备工作 为了实现Modbus ...
- STM32驱动W5500连接腾讯云
STM32驱动W5500连接腾讯云 1.W5500简介 W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP ...
- 基于stm32之w5500以太网应用
基于stm32之w5500以太网应用 强调一下前半段为基础知识普及(这段还是很重要的.不管用什么工具开发精通协议才是王道),后半段为实战代码干货. 如上图所示,最底下的一层叫做"物理层&qu ...
- STM32F103+W5500网络通信
STM32F103+W5500网络通信 一.W5500模块 (一)W5500以太网模块介绍 (二)模块排针功能表 二. modbus协议 (一)modbus协议原理 (二)Modbus 通讯方式 1. ...
- STM32基于W5500模块实现通信
目录 一.W5500及modbus 二.代码实现 1.初始化网络 2.响应函数 3.main函数循环 三.通信结果 链接 一.W5500及modbus W5500 芯片是一款集成全硬件 TCP/IP ...
- AD原理图设计、STM32+W5500网络通信
一.Altium Designer (一)简介 Altium Designer 提供了唯一一款统一的应用方案,其综合电子产品一体化开发所需的所有必须技术和功能.Altium Designer 在单一设 ...
- STM32/TMS320F2812+W5500硬软件调试总结
使用STM32+W5500方案是一种比较节省CPU开支的方案,无需多余的CPU资源管理Lwip协议. 调试的时候很多情况下无法通信,现结合笔者近10年的调试经验(每次用W5500做板子,不会说是一帆风 ...
- STM32之W5500:掉线重联????
1.前言 经常的情况下,我们的w5500芯片是不能够支持所谓"热拔插",因为w5500工作在tcp的模式下的时候,没有能够检测对端的设备是否还存在,所以当拔掉网线的情况下,它的so ...
- STM32驱动W5500动态分配IP
TM32驱动W5500动态分配IP 1.W5500简介 W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP ...
最新文章
- Binary Differences
- asp.net获取页面url参数值的实现代码实例
- Redis序列化配置类
- 深度模型的起跑线,初始化的意义
- Oracle基本概念与数据导入
- Switchover and Failover说明
- java编写算术平均数,[求助]基础-怎样编一个计算算术平均数的程序(急啊)
- android 聊天背景图片,Android 实现从本地读取图片更改聊天背景
- java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
- LeetCode 463. Island Perimeter
- 混乱的MVC,.NET非要MVC不可么?
- Java学习-Overload和Override的区别
- Navicat Premium 12破解方法(亲测可用)
- 应用之星教你制作高下载量的App
- AI会玩魔方了!全是自学,比任何人都快,包括机器人
- Java学习手册:大疆创新2020届校园招聘——软件类岗位B卷题一
- 游戏机器人的开发工具及开发步骤
- ajax三种错误ie,ie下jquery ajax 80020101错误的解决方法
- 目标跟踪 | 3D目标跟踪高级入门!
- 【机房收费个人版】触发器与存储过程
热门文章
- 【UnityShader】自定义unity粒子系统使用的shader
- 什么是Base64算法
- 小米(红米)AC2100 硬路由配置的坑
- 1985-2016年全球自杀数据分析(Kaggle)
- thinkphp php5.4,【thinkphp下载】thinkphp官方最新版 v5.0.24 完整版-开心电玩
- C语言实现BMP图片的放大缩小-24位
- cloudSim学习
- 从空间分布、空间关系、空间演化、属性数据的扩展与再分析、数据分析扩展的角度举例分析GIS空间分析的特点与重要性,并且写出一句宣传GIS空间分析的广告语
- oracle 11g rac adg搭建,11G RAC ADG 配置
- GM7150BC是一颗将CVBS/S-Video视频源转换成BT656/601