-
2016-04-29 14:19:16
一、模块介绍
是以太网转spi接口的,模块上有3个led和一个复位按钮,灯的含义是:
LINKLED
网络连接指示灯(Link LED)
显示当前连接状态:
低电平:连接建立;
高电平:未连接;
DUPLED
全/半双工指示灯(Duplex LED)
显示当前连接的双工状态:
低电平:全双工状态;
高电平:半双工状态;
ACTLED
活动状态指示灯(Active LED)
显示数据收/发活动时,物理介质子层的载波侦听活动情
况:
低电平:有物理介质子层的载波侦听信号;
高电平:无物理介质子层的载波侦听信号;
但貌似配置成全双工100M的速度也没什么增加,哪里出问题了呢?我现在使用18M的spi,使用wiz官方loopback软件测试速度为5Mb/s左右,好慢啊(/ □ \)
二、模块驱动
注意:在官网上有人共享了github的库函数驱动,不过是C99标准的,这一段Keil的c编译器支持好像有问题,而且对于是库函数很致命,使用寄存器则无所谓
比如:ctlsocket和ctlwizchip函数的参数会因C99和C89的强转void类型定义不同,使其失效。eg:0x0000不会错,0x0010可能会篡改成0x4e3c
更多相关内容 -
W5500以太网模块中英文.rar
2019-05-09 15:39:38文档包含以太网模块W5500中文和英文文档介绍资料,非常方便,分享给大家! -
全硬件TCP/IP协议以太网模块W5500设计资料(模块原理图、源码)-电路方案
2021-04-22 16:32:51W5500以太网模块是一款基于WIZnet W5500芯片的以太网模块,性能出色、性价比高。 模块集成硬件化TCP/IP协议;内部具有32K字节存储器作为TX/RX缓存;支持10/100Mbps网络传输速率;支持8个独立端口同时运行;同时支持... -
STM32的W5500以太网通信模块快速实现方法.pdf
2021-06-27 20:10:22STM32的W5500以太网通信模块快速实现方法.pdf -
STM32+W5500以太网模块
2021-12-24 15:33:18一:w5500以太网模块介绍: W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方 案。W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC) 及物理层(PHY),使得 ...一:w5500以太网模块介绍:
W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方 案。W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC) 及物理层(PHY),使得 用户使用单芯片就能够在他们的应用中拓展网络连接。
久经市场考验的 WIZnet 全硬件 TCP/IP 协议栈支持 TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 协议。W5500 内嵌 32K 字节片上缓存以供以太网包处理。如果你使用 W5500, 你只需要一些简单 的 Socket 编程就能实现以太网应用。这将会比其他嵌入式以太网方案 更加快捷、简便。用户可以同 时使用 8 个硬件 Socket 独立通讯。
W5500 提供了 SPI(外设串行接口)从而能够更加容易与外设 MCU 整合。而且, W5500 的使用了新的高效SPI协议支持 80MHz 速率,从而能够更好的实现高速网络通讯。 为了减少系统能耗, W5500 提供了网络唤醒模式(WOL)及掉电模式供客户选择使用。
模块排针功能表:STM32与W5500连接方法:
PA15->W5500_RST(源程序使用的是PC5,这里没有该引脚修改为PA15)
PC4->W5500_INT(使用寄存器查询方式的例程时,此引脚可以不接,其他例程可能涉及修改引脚)
PA4->W5500_SCS
PA5->W5500_SCK
PA6->W5500_MISO
PA7->W5500_MOSI
调试寄存器的UDP模式:
基于stm32与w5500以太网应用:
如上图所示,最底下的一层叫做“物理层”,也叫“PHY 层”,最上面的一层叫做“应用层”,中间的三层(自下而上)分别是“链路层”,也叫“MAC 层”、 “网络层”和“传输层”。越下面的层,越靠近硬件;越上面的层,越靠近用户。
我们一层一层讲解
一、物理层
物理层就是最基础的类似于modbus中的硬件连接是rs485的两根线。物理层由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。上面的4层都是基于物理层的。
二、数据链路层
实际上由两个独立的部分组成,介质存取控制(Media AccessControl,MAC)和逻辑链路控制层(Logical Link Control,LLC)。其中spi2的四根线要接上w5500的 SCSn, SCLK, MOSI, MISO 4 路信号。还有中断信号和复位信号。
W5500 有两种工作模式,分别是可变数据长度模式和固定数据长度模式。在可变数据长度模式中,W5500 可以与其他 SPI 设备共用 SPI 接口。但是一旦将 SPI接口指定给 W5500 之后,也就是 1 脚 CS 片选信号如果选中了这个 W5500,则不能再与其他 SPI 设备共用。在固定数据长度模式,SPI 将指定给 W5500,不能与其他 SPI 设备共享。因为 1 脚 CS 片选信号将直接接地为低电平。
8.1w5500初始化
W5500_conf.c 主要配置 W5500 的 MAC、IP 地址,W5500 基本的数据读写过程,复位设置函数等。
Socket.c 函数主要介绍了 W5500 的 SOCKET 相关配置函数,比如 SOCKET 的打开、关闭,以及接收数据、发送数据等等。
Utility.c 函数主要介绍了基本的延时函数,还有数据格式转化函数。main()函数代码:
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.128\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]=128; Write_Bytes(SIPR, array, 4);//设置W5500的IP地址 }
STM32+W5500的web服务
main()函数:
int main(void) { Systick_Init(72);//系统时钟初始化 GPIO_Configuration(); //GPIO configuration USART1_Init(); //串口初始化:115200@8-n-1 printf("W5500 EVB initialization over.\r\n"); Reset_W5500(); WIZ_SPI_Init();//W5500相关引脚配置 printf("W5500 initialized!\r\n"); if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)) { DefaultSet();//出厂值 } else { get_config();//read config data from flash } printf("Firmware ver%d.%d\r\n",ConfigMsg.sw_ver[0],ConfigMsg.sw_ver[1]); if(ConfigMsg.debug==0) ConfigMsg.debug=1; set_network();//配置网络信息 printf("Network is ready.\r\n"); while(1) { if(ConfigMsg.JTXD_Control == 0) do_http();//开启http服务 else JTXD_do_http(); if(reboot_flag) NVIC_SystemReset();//发起系统复位请求复位单片机 // reboot(); } }
GPIO初始化函数:
void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO , ENABLE); // Port A output GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_2 |GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_ResetBits(GPIOA, GPIO_Pin_0); // GPIO_ResetBits(GPIOA, GPIO_Pin_1); // GPIO_SetBits(GPIOA, GPIO_Pin_2); // led off // GPIO_SetBits(GPIOA, GPIO_Pin_3); // led off // Port B output; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_9); // Port C input // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//控制flash GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_7); }
W5500相关配置
void WIZ_SPI_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO , ENABLE); // Port B output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_12); /* Configure SPIy pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /* SPI Config -------------------------------------------------------------*/ 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_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); }
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 processed disconnect(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 processed disconnect(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以太网模块使用
2022-01-15 22:17:18* 实验平台:NiRen_TwoHeart系统板(或用户STM32开发板) + NiRen_W5500以太网(TCP/IP)模块 * 硬件连接: PC5 -> W5500_RST * PC4 -> W5500_INT * PA4 -> W5500_SCS * PA5 -> W5500_SCK * PA6 -> W5500_MISO * PA7 ->...写完标题发现好像也没什么可写的.
主要是硬件的东西从来没这么顺利过,总结一下
1.买了之后送的文档,挺详细的,即便如此接线没有说 3.3v 和gnd要接.他们可能认为这是常识猪都知道, 但确实有人不知道比如搞软件的我,但我的直觉让我接上
2.有问题的时候硬件相关会很不容易找,比如我的板子开关接触不良了,但我没贴个标签在上面,所以烧录好程序后一直没电,是通过吧仿真器插在usb 这样才提供了稳定的电压
3.keil v5 是我的ide ,但示例程序是v4的,并不兼容 表现为cpu没有在我的列表里,编译好之后烧录报错,只好在v5的工程,把代码弄过去,工程是对应我的板子的.这样才烧录成功了.
4.netAssist.exe 网络调试助手 很好用, http://www.cmsoft.cn贴下代码吧
/*************************************************************************************** * 工程名 :泥人W5500模块-客户端模式例程 * 描述 :W5500的端口0工作在客户端模式,主动与泥人提供的《TCP&UDP测试工具》上创建的服务端连接, * 并且以500ms的时间间隔定时给服务端发送字符串"\r\nWelcome To NiRenElec!\r\n",同时将接 * 收到服务端发来的数据回发给服务端。 * 实验平台:NiRen_TwoHeart系统板(或用户STM32开发板) + NiRen_W5500以太网(TCP/IP)模块 * 硬件连接: PC5 -> W5500_RST * PC4 -> W5500_INT * PA4 -> W5500_SCS * PA5 -> W5500_SCK * PA6 -> W5500_MISO * PA7 -> W5500_MOSI * 库版本 :ST_v3.5 * 作者 :泥人通信模块开发团队 * 博客 :http://nirenelec.blog.163.com * 淘宝 :http://nirenelec.taobao.com ***************************************************************************************/ /*例程网络参数*/ //网关:192.168.0.1 //掩码: 255.255.255.0 //物理地址:0C 29 AB 7C 00 01 //本机IP地址:192.168.0.199 //端口0的端口号:5000 //端口0的目的IP地址:192.168.0.101 //端口0的目的端口号:6000 //配合 NetAssist.exe 作为调试工具| #include "stm32f10x.h" #include "W5500.h" #include <string.h> void RCC_Configuration(void); //设置系统时钟为72MHZ(这个可以根据需要改) void NVIC_Configuration(void); //STM32中断向量表配配置 void Timer2_Init_Config(void); //Timer2初始化配置 void System_Initialization(void); //STM32系统初始化函数(初始化STM32时钟及外设) void Delay(unsigned int d); //延时函数(ms) unsigned int Timer2_Counter=0; //Timer2定时器计数变量(ms) unsigned int W5500_Send_Delay_Counter=0; //W5500发送延时计数变量(ms) /******************************************************************************* * 函数名 : W5500_Initialization * 描述 : W5500初始货配置 * 输入 : 无 * 输出 : 无 * 返回值 : 无 * 说明 : 无 *******************************************************************************/ void W5500_Initialization(void) { W5500_Init(); //初始化W5500寄存器函数 Detect_Gateway(); //检查网关服务器 Socket_Init(0); //指定Socket(0~7)初始化,初始化端口0 } /******************************************************************************* * 函数名 : Load_Net_Parameters * 描述 : 装载网络参数 * 输入 : 无 * 输出 : 无 * 返回值 : 无 * 说明 : 网关、掩码、物理地址、本机IP地址、端口号、目的IP地址、目的端口号、端口工作模式 *******************************************************************************/ void Load_Net_Parameters(void) { Gateway_IP[0] = 192;//加载网关参数 Gateway_IP[1] = 168; Gateway_IP[2] = 0; Gateway_IP[3] = 1; Sub_Mask[0]=255;//加载子网掩码 Sub_Mask[1]=255; Sub_Mask[2]=255; Sub_Mask[3]=0; Phy_Addr[0]=0x0c;//加载物理地址 Phy_Addr[1]=0x29; Phy_Addr[2]=0xab; Phy_Addr[3]=0x7c; Phy_Addr[4]=0x00; Phy_Addr[5]=0x01; IP_Addr[0]=192;//加载本机IP地址 IP_Addr[1]=168; IP_Addr[2]=0; IP_Addr[3]=199; S0_Port[0] = 0x13;//加载端口0的端口号5000 S0_Port[1] = 0x88; S0_DIP[0]=192;//加载端口0的目的IP地址 S0_DIP[1]=168; S0_DIP[2]=0; S0_DIP[3]=101; S0_DPort[0] = 0x17;//加载端口0的目的端口号6000 S0_DPort[1] = 0x70; S0_Mode=TCP_CLIENT;//加载端口0的工作模式,TCP客户端模式 } /******************************************************************************* * 函数名 : W5500_Socket_Set * 描述 : W5500端口初始化配置 * 输入 : 无 * 输出 : 无 * 返回值 : 无 * 说明 : 分别设置4个端口,根据端口工作模式,将端口置于TCP服务器、TCP客户端或UDP模式. * 从端口状态字节Socket_State可以判断端口的工作情况 *******************************************************************************/ void W5500_Socket_Set(void) { if(S0_State==0)//端口0初始化配置 { if(S0_Mode==TCP_SERVER)//TCP服务器模式 { if(Socket_Listen(0)==TRUE) S0_State=S_INIT; else S0_State=0; } else if(S0_Mode==TCP_CLIENT)//TCP客户端模式 { if(Socket_Connect(0)==TRUE) S0_State=S_INIT; else S0_State=0; } else//UDP模式 { if(Socket_UDP(0)==TRUE) S0_State=S_INIT|S_CONN; else S0_State=0; } } } /******************************************************************************* * 函数名 : Process_Socket_Data * 描述 : W5500接收并发送接收到的数据 * 输入 : s:端口号 * 输出 : 无 * 返回值 : 无 * 说明 : 本过程先调用S_rx_process()从W5500的端口接收数据缓冲区读取数据, * 然后将读取的数据从Rx_Buffer拷贝到Temp_Buffer缓冲区进行处理。 * 处理完毕,将数据从Temp_Buffer拷贝到Tx_Buffer缓冲区。调用S_tx_process() * 发送数据。 *******************************************************************************/ void Process_Socket_Data(SOCKET s) { unsigned short size; size=Read_SOCK_Data_Buffer(s, Rx_Buffer); memcpy(Tx_Buffer, Rx_Buffer, size); Write_SOCK_Data_Buffer(s, Tx_Buffer, size); } /******************************************************************************* * 函数名 : main * 描述 : 主函数,用户程序从main函数开始运行 * 输入 : 无 * 输出 : 无 * 返回值 : int:返回值为一个16位整形数 * 说明 : 无 *******************************************************************************/ int main(void) { System_Initialization(); //STM32系统初始化函数(初始化STM32时钟及外设) Load_Net_Parameters(); //装载网络参数 W5500_Hardware_Reset(); //硬件复位W5500 W5500_Initialization(); //W5500初始货配置 while (1) { W5500_Socket_Set();//W5500端口初始化配置 if(W5500_Interrupt)//处理W5500中断 { W5500_Interrupt_Process();//W5500中断处理程序框架 } if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到数据 { S0_Data&=~S_RECEIVE; Process_Socket_Data(0);//W5500接收并发送接收到的数据 } else if(W5500_Send_Delay_Counter >= 8)//定时发送字符串 { if(S0_State == (S_INIT|S_CONN)) { S0_Data&=~S_TRANSMITOK; memcpy(Tx_Buffer, "\r\nWelcome To NiRenElec!\r\n", 23); Write_SOCK_Data_Buffer(0, Tx_Buffer, 23);//指定Socket(0~7)发送数据处理,端口0发送23字节数据 } W5500_Send_Delay_Counter=0; } } } /******************************************************************************* * 函数名 : RCC_Configuration * 描述 : 设置系统时钟为72MHZ(这个可以根据需要改) * 输入 : 无 * 输出 : 无 * 返回值 : 无 * 说明 : STM32F107x和STM32F105x系列MCU与STM32F103x系列MCU时钟配置有所不同 *******************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //外部高速时钟(HSE)的工作状态变量 RCC_DeInit(); //将所有与时钟相关的寄存器设置为默认值 RCC_HSEConfig(RCC_HSE_ON); //启动外部高速时钟HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟(HSE)稳定 if(SUCCESS == HSEStartUpStatus) //如果外部高速时钟已经稳定 { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Flash设置 /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟等于系统时钟(1分频)/72MHZ RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟和HCLK时钟相等/72MHz(最大为72MHz) RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟是HCLK时钟的2分频/36MHz(最大为36MHz) #ifndef STM32F10X_CL //如果使用的不是STM32F107x或STM32F105x系列MCU,PLL以下配置 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz #else //如果使用的是STM32F107x或STM32F105x系列MCU,PLL以下配置 /***** 配置PLLx *****/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ RCC_PREDIV2Config(RCC_PREDIV2_Div5); RCC_PLL2Config(RCC_PLL2Mul_8); RCC_PLL2Cmd(ENABLE); //使能PLL2 while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET);//等待PLL2稳定 /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */ RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5); RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); #endif RCC_PLLCmd(ENABLE); //使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟的时钟源为PLL while(RCC_GetSYSCLKSource() != 0x08); //检查系统的时钟源是否是PLL RCC_ClockSecuritySystemCmd(ENABLE); //使能系统安全时钟 /* Enable peripheral clocks --------------------------------------------------*/ /* Enable I2C1 and I2C1 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Enable GPIOA GPIOB SPI1 and USART1 clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); } } /******************************************************************************* * 函数名 : NVIC_Configuration * 描述 : STM32中断向量表配配置 * 输入 : 无 * 输出 : 无 * 返回值 : 无 * 说明 : 设置KEY1(PC11)的中断优先组 *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; //定义NVIC初始化结构体 /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断优先级组为1,优先组(可设0~4位) NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //设置中断向量号 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢先优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC NVIC_Init(&NVIC_InitStructure); W5500_NVIC_Configuration(); //W5500 接收引脚中断优先级设置 } /******************************************************************************* * 函数名 : Timer2_Init_Config * 描述 : Timer2初始化配置 * 输入 : 无 * 输出 : 无 * 返回 : 无 * 说明 : 无 *******************************************************************************/ void Timer2_Init_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能Timer2时钟 TIM_TimeBaseStructure.TIM_Period = 9; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到10为1ms) TIM_TimeBaseStructure.TIM_Prescaler = 7199; //设置用来作为TIMx时钟频率除数的预分频值(10KHz的计数频率) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = TIM_CKD_DIV1 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE ); //使能TIM2指定的中断 TIM_Cmd(TIM2, ENABLE); //使能TIMx外设 } /******************************************************************************* * 函数名 : TIM2_IRQHandler * 描述 : 定时器2中断断服务函数 * 输入 : 无 * 输出 : 无 * 返回 : 无 * 说明 : 无 *******************************************************************************/ void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); Timer2_Counter++; W5500_Send_Delay_Counter++; } } /******************************************************************************* * 函数名 : System_Initialization * 描述 : STM32系统初始化函数(初始化STM32时钟及外设) * 输入 : 无 * 输出 : 无 * 返回 : 无 * 说明 : 无 *******************************************************************************/ void System_Initialization(void) { RCC_Configuration(); //设置系统时钟为72MHZ(这个可以根据需要改) NVIC_Configuration(); //STM32中断向量表配配置 SPI_Configuration(); //W5500 SPI初始化配置(STM32 SPI1) Timer2_Init_Config(); //Timer2初始化配置 W5500_GPIO_Configuration(); //W5500 GPIO初始化配置 } /******************************************************************************* * 函数名 : Delay * 描述 : 延时函数(ms) * 输入 : d:延时系数,单位为毫秒 * 输出 : 无 * 返回 : 无 * 说明 : 延时是利用Timer2定时器产生的1毫秒的计数来实现的 *******************************************************************************/ void Delay(unsigned int d) { Timer2_Counter=0; while(Timer2_Counter < d); }
需注意的是
1.设备要在一个子网内,同个网关
2.设好服务端的ip和端口. 这个代码是客户端, 不需要在意客户端的IP端口对了,顺便看下效果, 同是8ms发送一次到服务端
这是windows发送,且无线wifi发送:
这是上面的代码,stm32发送,且有线发送:
摊手撇嘴.jpg
对实时性有要求那就必须使用stm32, 当然还有其他方案,比如linux系统安装RT(realtime)模块 -
W5500以太网原理图.pdf
2020-03-11 16:51:56使用的主控芯片是STM32F103,W5500模块以太网参考电路原理图(全),给硬件设计师们一个参考,可以照我这个直接画的。 -
W5500以太网模块与Arduion Uno组成一个以太网单元并与电脑端进行UPD双向通信.doc
2021-08-16 20:18:34用VB.NET写的代码,与W5500以太网模块与Arduino Uno搭建的通信单元,实现电脑端与单片机通信单元之间的UPD双向通信。通过此例可以发挥的你想像力,让电脑端成为你的控制端。 -
2块W5500以太网模块相互通信失败
2017-08-06 01:49:05两块W5500以太网模块,一块TCP服务端,一块TCP客户端,单独与PC通信都可以,两种用交叉网线连接通信失败,已经改了MAC地址不一样,两者的IP和端口也符合要求,Debug时发现接收方不能接收 -
W5500以太网主控器设计及详细操作步骤-电路方案
2021-04-21 03:12:29W5500以太网主控器以W5500为核心,集成ATmega32u4和W5500以太网芯片的主控板,能够满足一般IOT项目的应用要求。其大小与Leonardo尺寸相等,板载POE供电电源、外接电源稳压电路、SD卡电路以及Leonardo主控单元电路,... -
物联网项目实战开发之基于STM32的W5500以太网模块服务端通讯代码程序(stm32中断方式)
2022-05-06 15:17:081、STM32单片机当做TCP服务端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主... -
物联网项目实战开发之基于STM32的W5500以太网模块客户端通讯代码程序(stm32中断方式)
2022-05-06 15:13:511、STM32单片机当做TCP客户端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主... -
物联网项目实战开发之基于STM32的W5500以太网模块服务端通讯代码程序(stm32查询方式)
2022-05-06 14:58:581、STM32单片机当做TCP服务端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主... -
物联网项目实战开发之基于STM32的W5500以太网模块客户端通讯代码程序(stm32查询方式)
2022-05-06 14:52:001、STM32单片机当做TCP客户端,单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主... -
物联网项目实战开发之基于STM32的W5500以太网模块UDP通讯代码程序(stm32中断方式)
2022-05-06 15:20:001、STM32单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机,进行UDP通讯。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主入从出 ... -
物联网项目实战开发之基于STM32的W5500以太网模块UDP通讯代码程序(stm32查询方式)
2022-05-06 15:10:571、STM32单片机通过SPI口跟W5500进行通讯。W5500通过网线接电脑或者交换机进行UDP通讯。 2、接线如下: PA4 SPI 片选 SCS 引脚 PA5 SPI 时钟 SCLK 引脚 PA7 SPI MOSI 主出从入 MOSI 引脚 PA6 SPI MISO 主入从出 MISO... -
W5500模块原理图 pcb 原理图库和pcb封装.zip
2020-04-30 00:28:04w5500模块原理图pcb,ALTIUM 09版本。布局可参考,已经应用在项目中,可直接打板,值得拥有 -
介绍一个高性能16串口转以太网模块(FPGA+W5500)
2020-08-07 02:33:51这个方案采用的是FPGA+W5500。串口部分利用串口数据收发硬件加速器,充分利用Buff及FiFO资源,从而极大程度上的提高了16串口的数据调度能力。与此同时,网络部分采用ToE技术的W5500,从而极大程度上的降低了系统中断... -
野火W5500网络扩展模块(教程+调试助手+原理图) -电路方案
2021-04-22 14:53:28W5500网络扩展板集成了一个硬件TCP/IP协议协芯片W5500以及一个含有网络变压器...其中,W5500是一款全硬件TCP/IP嵌入式以太网控制器,以嵌入式系统提供了更加简易的互联网连接方案。 附件包含以下资料 总的资料截图 代码 -
W5500以太网芯片数据手册以及参考原理图.zip
2019-09-01 10:21:59W5500以太网芯片数据手册、参考原理图、W5500硬件设计布线规范等 -
ESP32和ESP8266使用W5100和W5500以太网模块
2020-08-15 17:26:30ESP8266使用W5100以太网模块概述程序连线结果 概述 实验项目,希望用一个以太网模块来实现以太网通讯,没有使用WiFi网络,而是用连线的以太网。 采用一个ESP8266模块做主处理器,采用Arduino IDE做开发环境。首先...概述
实验项目,希望用一个以太网模块来实现以太网通讯,没有使用WiFi网络,而是用连线的以太网。
采用一个ESP8266模块做主处理器,采用Arduino IDE做开发环境。首先选择了一个W5500模块连接以太网。结果通过SPI连接W5500,不成功。程序跑不起来。也没有添加其他的库,感觉现在的Arduino不是很友好,下载程序非常慢。就上某宝又购买了一个W5100模块。(因为看Ethernet.h和Ethernet.cpp发现库与W5100模块兼容。这次实验,一切正常,在这里分享一下使用情况。程序
/* A simple server that answer the ping message. Using an ESP8266 . */ /* Circuit: * Ethernet shield attached to pins : * D6: GPIO12 - MISO * D7: GPIO13 - MOSI * D8: GPIO15 - CS * D5: GPIO14 - SCLK */ #include <SPI.h> #include <Ethernet.h> #define MACADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xED IPAddress ip(192,168,6,29); IPAddress gateway(192, 168, 6, 1); IPAddress subnet(255, 255, 255, 0); // telnet defaults to port 23 EthernetServer server(23); #define RST 4 //W5100 RST void setup() { pinMode(BUILTIN_LED, OUTPUT); pinMode(RST, OUTPUT); digitalWrite(RST,HIGH); //Reset this module delay(200); digitalWrite(RST,LOW); delay(200); digitalWrite(RST,HIGH); delay(200); Serial.begin(115200); Serial.println(); byte mac[] = { MACADDRESS }; Ethernet.begin(mac, ip, gateway, subnet); // print your local IP address: Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); server.begin(); } void loop() { }
连线
模块和ESP8266连线不要发生错误一次成功W5100 ESP8266 +5V NSS SS MO MOSI GND GND RST GPIO4 SCK SCLK MI MISO 结果
实验成功,可以使用以太网和ESP8266通讯了。经验
使用W5500不知道为啥总是死机。没有任何反应。看门狗都不起作用。用ESP32和W5500作了试验,ESP32无法作主机,原因是采用的库是C:\安装Arduino IDE\libraries\Ethernet目录下的头文件问题,不能使用EthernetServer myServer(23); 定义变量。编译不能通过。还有一个经验是当不清楚SPI的接线时可以用打印的方法获取SPI的端口。
这几天又试验了ESP32使用W5500的情况,ESP32可以作client,和server进行通讯,但不知道为啥还是不能作server。后记
最近有网友讨论ESP8266和W5500的板子通讯的事,实验了一下。可以用ESP8266连接W5500实现以太网有线通讯,只要在初始化程序中增加Ethernet.init(5);这个命令选择GPIO5作为片选信号。还要注意:
- 不能使用默认的GPIO15作为片选CS信号,如果用GPIO15的话会出现死机现象。可能和我们的板子GPIO15连接的一个10KΩ的接地电阻有关。
- 片选信号选择其他的可以通讯并实现TCP等的传输。
- 在初始化中添加Ethernet.Inti(5); 就可以,这个CS可以任意选
ESP32+W5500
关于ESP32+W5500的server不能运行解决了,可以使用ESP32和W5500实现有线以太网通讯。关键是库函数有问题,在编译时需要使用Server.h库。我的库的地址是在机器上的如下位置:
把这个头文件中改成如下形式就可以编译并使用W5500通讯了。class Server: public Print { public: //virtual void begin(uint16_t port=0) =0; modified by CAI at 2021-12-13 virtual void begin() = 0; };
-
外设驱动库开发笔记28:W5500以太网控制器
2021-05-01 19:37:56在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的单芯片全硬件TCP/IP协议栈,能够方便的实现网络连接应用。 1.1、硬件描述 W5500作为一款全硬件TCP/IP嵌入式以太网... -
STM32上移植MQTT协议使用W5500以太网芯片连接阿里云
2021-01-20 11:08:42STM32上移植MQTT协议使用W5500以太网芯片连接阿里云前言正题核心代码结论 前言 有机会做这次项目很开心,学到了很多东西,但刚开始的时候是真的从零开始,网上找的资料都大相径庭,很多代码都有问题,而且把别人做的... -
基于FPGA与W5500的以太网接口设计.pdf
2021-07-13 10:43:02基于FPGA与W5500的以太网接口设计.pdf