STM32驱动W5500动态分配IP

您所在的位置:网站首页 路由器获取验证码超时 STM32驱动W5500动态分配IP

STM32驱动W5500动态分配IP

2024-05-26 17:19| 来源: 网络整理| 查看: 265

TM32驱动W5500动态分配IP 1.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)及掉电模式供客户选择使用。

2.W5500特性

支持硬件 TCP/IP 协议: TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE

支持 8 个独立端口(Socket)同时通讯支持掉电模式支持网络唤醒支持高速串行外设接口(SPI 模式 0, 3)内部 32K 字节收发缓存内嵌 10BaseT/100BaseTX 以太网物理层( PHY)支持自动协商(10/100-Based 全双工/半双工)不支持 IP 分片3.3V 工作电压, I/O 信号口 5V 耐压;LED 状态显示(全双工/半双工,网络连接,网络速度,活动状态)48 引脚 LQFP 无铅封装(7x7mm, 0.5mm 间距) 3.应用场合 家庭网络设备: 机顶盒、个人录像机、数码媒体适配器串行转以太网: 门禁控制、 LED 显示屏、无线 AP 继电器等并行转以太网: POS/微型打印机、复印机USB 转以太网: 存储设备、网络打印机GPIO 转以太网: 家庭网络传感器安全系统: 数字录像机、网络摄像机、信息亭工厂和楼宇自动化控制系统医疗监测设备嵌入式服务器

  购买连接:W5500 在这里插入图片描述

4.w5500驱动编写

硬件开发平台:STM32F103C8T6 驱动协议:SPI 开发环境:KEIL5

5.接线方式 W5500模块STM32核心板片选CSPB12时钟SCLKPB13主机输入MISOPB14主机输出MOSIPB15INTPB0RSTPB1 6.SPI底层驱动编写

 w5500_config.c文件

CONFIG_MSG ConfigMsg; /*配置结构体*/ /*定义MAC地址,如果多块W5500网络适配板在同一现场工作,请使用不同的MAC地址*/ uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11}; /*定义默认IP信息*/ uint8 local_ip[4] ={192,168,1,88}; /*定义W5500默认IP地址*/ uint8 subnet[4] ={255,255,255,0}; /*定义W5500默认子网掩码*/ uint8 gateway[4] ={192,168,1,1}; /*定义W5500默认网关*/ uint8 dns_server[4]={114,114,114,114}; /*定义W5500默认DNS*/ uint16 local_port=5000; /*定义本地端口*/ /*定义远端IP信息*/ uint8 remote_ip[4]={192,168,1,102}; /*远端IP地址*/ uint16 remote_port=5000; /*远端端口号*/ /*IP配置方法选择,请自行选择*/ uint8 ip_from=IP_FROM_DHCP; uint8 dhcp_ok = 0; /*dhcp成功获取IP*/ uint32 ms = 0; /*毫秒计数*/ uint32 dhcp_time = 0; /*DHCP运行计数*/ vu8 ntptimer = 0; /*NPT秒计数*/ /*硬件配置*/ void W5500_GPIO_Init(void) { RCC->APB2ENR|=1CRH|=0x38330000; GPIOB->CRL&=0xFFFFFF00; GPIOB->CRL|=0x00000038; W5500_CS=1; W5500_RST=1; } /*模块复位*/ void W5500_reset(void) { W5500_RST=0; Delay_Us(2); W5500_RST=1; Delay_Ms(1000); Delay_Ms(600); } /*SPI读写一个字节*/ u8 SPI_WR_Byte(u8 byte) { u8 data_rx=0; u8 i=0; for(i=0;i return(SPI_WR_Byte(dat)); } /*向指定地址写入一字节数据*/ void IINCHIP_WRITE( u32 addrbsb, u8 data) { W5500_CS=0; IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); IINCHIP_SpiSendData(data); W5500_CS=1; } /*从地址读取读取一字节数据*/ u8 IINCHIP_READ(u32 addrbsb) { u8 data = 0; W5500_CS=0; IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ; data = IINCHIP_SpiSendData(0x00); W5500_CS=1; return data; } /* 向W5500指定地址写入指定长度数据 形参:addrbsb -- 写入的地址 buf -- 要写入的数据 len -- 写入的长度 返回值:写入的数据长度 */ u16 wiz_write_buf(u32 addrbsb,u8* buf,u16 len) { u16 idx = 0; if(len == 0) printf("Êý¾Ý³¤¶ÈΪ0\r\n"); W5500_CS=0; IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); for(idx = 0; idx u16 idx = 0; W5500_CS=0; IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); IINCHIP_SpiSendData( (addrbsb & 0x000000F8)); for(idx = 0; idx TIMx_Init(TIM3,72,1000); TIM3->CR1|=1 ms++; if(ms>=1000) { ms=0; dhcp_time++; /*DHCP定时+1S*/ #ifndef __NTP_H__ ntptimer++; /*NTP重试时间+1s*/ #endif } } /*配置W5500网卡信息*/ void set_w5500_ip(void) { /*复制定义的配置信息到配置结构体*/ memcpy(ConfigMsg.mac, mac, 6);//MAC地址 memcpy(ConfigMsg.lip,local_ip,4);//IP memcpy(ConfigMsg.sub,subnet,4);//子网掩码 memcpy(ConfigMsg.gw,gateway,4);//网关 memcpy(ConfigMsg.dns,dns_server,4);//DNS if(ip_from == IP_FROM_DHCP)/*动态获取IP*/ { if(dhcp_ok==1)/*动态获取IP成功*/ { printf(" IP from DHCP\r\n"); memcpy(ConfigMsg.lip,DHCP_GET.lip, 4); memcpy(ConfigMsg.sub,DHCP_GET.sub, 4); memcpy(ConfigMsg.gw,DHCP_GET.gw, 4); memcpy(ConfigMsg.dns,DHCP_GET.dns,4); } } /*将IP配置信息写入W5500相应寄存器*/ setSUBR(ConfigMsg.sub); setGAR(ConfigMsg.gw); setSIPR(ConfigMsg.lip); /*判断数据是否写入成功*/ getSIPR (local_ip); printf(" W5500 IP地址 : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]); getSUBR(subnet); printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]); getGAR(gateway); printf(" W5500 网关 : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]); } //配置W5500的MAC地址 void set_w5500_mac(void) { memcpy(ConfigMsg.mac, mac, 6); setSHAR(ConfigMsg.mac); memcpy(DHCP_GET.mac, mac, 6); }

 main.c文件

#include "stm32f10x.h" #include "usart.h" #include "timer.h" #include "w5500_config.h" #include "socket.h" #include "w5500.h" #include "dhcp.h" int main() { USART1_Init(115200); printf("W5500 SPI模拟时序,动态分配IP VER1.0 \r\n"); W5500_GPIO_Init();/*w5500_GPIO初始化*/ W5500_reset();//硬件复位w5500 set_w5500_mac();/*配置MAC地址*/ socket_buf_init(txsize, rxsize); /*初始化8个Socket的发送接收缓存大小*/ printf("网络初始化完成\r\n"); while(1) { do_dhcp();/*DHCP测试程序*/ } }

  W5500底层寄存器配置文件w5500.c;socket编程相关函数文件socket.c、w5500延时函数、数据格式转换文件utility.c;动态分配IP函数接口文件dhcp.c这些文件移植可参考示例代码或参考官方示例工程。

7.效果展示

在这里插入图片描述在这里插入图片描述 示例代码:https://download.csdn.net/download/weixin_44453694/81887650



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3