0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有线网卡驱动和动态分配IP的详细说明

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-05-31 17:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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模块图

poYBAGKV4YCAPQeYAAXS4rkfy70626.png

4.接线方式

W5500模块 STM32核心板
片选CS PB12
时钟SCLK PB13
主机输入MISO PB14
主机输出MOSI PB15
INT PB0
RST PB1

5.SPI底层驱动编写

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|=1<<3;
  GPIOB->CRH&=0x0000FFFF;
  GPIOB->CRH|=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<8;i++)
  {
    W5500_SCLK=0;
    if(byte&0x80)W5500_MOSI=1;
    else W5500_MOSI=0;
    W5500_SCLK=1;
    byte<<=1;
    
    data_rx<<=1;
    if(W5500_MISO)data_rx|=0x01;
  }
  W5500_SCLK=0;
  return data_rx;
}
/*W5500底层收发一个字节*/
static u8 IINCHIP_SpiSendData(u8 dat)
{
   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 < len; idx++)
   {
     IINCHIP_SpiSendData(buf[idx]);
   }
   W5500_CS=1;                          
   return len;   
}
/*
从指定地址读取指定长度数据
形参:addrbsb  -- 读取的地址
	 buf  -- 读取的数据保存地址
	 len  -- 读取的长度
返回值:读取的数据长度 
*/
u16 wiz_read_buf(u32 addrbsb, u8* buf,u16 len)
{
  u16 idx = 0;
  W5500_CS=0;
  IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
  IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
  IINCHIP_SpiSendData( (addrbsb & 0x000000F8)); 
  for(idx = 0; idx < len; idx++)                   
  {
    buf[idx] = IINCHIP_SpiSendData(0x00);
  }  
  W5500_CS=1;
  return len;
}
/*DHCP用到定时器初始化*/
void dhcp_timer_init(void)
{
  TIMx_Init(TIM3,72,1000);
  TIM3->CR1|=1<<0;
}
/*ntp用到定时器出事化*/
void ntp_timer_init(void)
{
  TIMx_Init(TIM3,72,1000);												
}
/*中断处理函数*/
void timer3_isr(void)
{
  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);
}

W5500初始化,动态IP分配

#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这些文件移植可参考示例代码或参考官方示例工程。

6.效果展示

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASVRf6Zi_5rC0,size_20,color_FFFFFF,t_70,g_se,x_16#pic_centerpoYBAGKV4mKAH1tmAAGchgToQNM793.png

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IP
    IP
    +关注

    关注

    5

    文章

    1880

    浏览量

    156663
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1897

    浏览量

    102081
  • 动态分配
    +关注

    关注

    0

    文章

    5

    浏览量

    9859
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    云平台资源动态分配:技术原理与系统架构全解析

    一、引言在数字化业务高速发展的当下,云计算已成为算力承载的核心底座。传统静态资源分配模式采用固定配额配置,无法适配业务流量的实时波动,极易出现高峰资源不足、低峰资源闲置的问题。云平台资源动态分配技术
    的头像 发表于 04-13 16:01 62次阅读
    云平台资源<b class='flag-5'>动态分配</b>:技术原理与系统架构全解析

    海外静态IP和海外动态IP有哪些区别?怎么选择?

    这个问题其实对于需要做跨境、电商、社媒运营的人问的比较多,所以本篇内容为大家来详细介绍下,具体如下: 一、什么是静态IP动态IP? 1、静态IP
    的头像 发表于 04-13 12:36 63次阅读
    海外静态<b class='flag-5'>IP</b>和海外<b class='flag-5'>动态</b><b class='flag-5'>IP</b>有哪些区别?怎么选择?

    基于“结温变化率梯度”的构网型储能变流器PCS瞬态过载能力动态分配

    基于“结温变化率梯度”的构网型储能变流器PCS瞬态过载能力动态分配与多维压榨技术研究 引言与产业研发动态背景 在构建以新能源为主体的新型电力系统进程中,传统同步发电机(Synchronous
    的头像 发表于 04-09 07:07 157次阅读
    基于“结温变化率梯度”的构网型储能变流器PCS瞬态过载能力<b class='flag-5'>动态分配</b>

    keil中c语言的动态分配内存

    于处理器的指令集中,效率很高,但是分配的内存容量有限。另外,当函数运行结束时,栈区的空间会被自动释放。 (3)内存映射段。该部分内存主要用于文件映射、动态库以及匿名映射。 (4)堆区。动态内存
    发表于 01-21 06:04

    嵌入式系统中,动态分配内存可能发生的问题是什么?

    尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。 那么嵌入式系统中,动态分配内存可能发生的问题是什么? 这 里,我期望应试者能提到内存碎片,碎片收集
    发表于 12-22 09:42

    USB 扩展网卡全方位指南:从选购到使用

    在无线网络普及的当下,有线网络凭借更稳定的传输速率和更低的延迟,仍是游戏、直播、大型文件传输等场景的首选。而USB扩展网卡(又称USB千兆网卡、USB转以太网适配器),则成为解决设备缺
    的头像 发表于 10-24 15:37 1837次阅读
    USB 扩展<b class='flag-5'>网卡</b>全方位指南:从选购到使用

    工业路由器支持哪些有线网

    接口连接有线网络,提供高速稳定的数据传输。 应用场景 :工厂自动化、智能交通、能源监控等需要高带宽和可靠连接的场景。 TCP/IP协议栈 TCP(传输控制协议) :确保数据可靠传输,适用于对准确性要求高的场景(如工业控制系统)。 IP
    的头像 发表于 10-23 09:47 628次阅读

    V2G+动态分配:安科瑞有序充电方案如何实现电网、运营商、用户三赢?

    分析国内外有序充电技术发展现状,设计了包含边缘计算网关、智能排队算法和功率动态分配策略的有序充电管控终端架构,并详细阐述了其工作原理和实现方法。系统采用分层控制策略,实现台区内充电负荷与供电能力的自动平衡。实
    的头像 发表于 08-15 16:55 1983次阅读
    V2G+<b class='flag-5'>动态分配</b>:安科瑞有序充电方案如何实现电网、运营商、用户三赢?

    单片机实例项目:DM9000有线以太网卡开发资料

    单片机实例项目:DM9000有线以太网卡开发资料,推荐下载!
    发表于 06-03 20:55

    贴片三极管上的印字与真实名称的对照表详细说明

      本文档的主要内容详细介绍的是贴片三极管上的印字与真实名称的对照表详细说明
    发表于 05-28 09:05 110次下载

    动态IP技术演进:从网络基石到智能连接时代的创新引擎

    在万物互联的智能时代,IP地址早已突破"网络身份证"的单一属性,成为支撑数字化变革的核心基础设施。动态IP技术作为网络资源分配的底层逻辑,正经历着从工具性功能向智能化服务的深刻转型。本
    的头像 发表于 05-20 16:16 829次阅读

    瑞芯微rv1106开发资料 rv1106数据手册 rv1106详细说明书免费下载

    瑞芯微rv1106开发资料 rv1106数据手册 rv1106详细说明书免费下载
    的头像 发表于 05-19 11:16 7075次阅读
    瑞芯微rv1106开发资料 rv1106数据手册 rv1106<b class='flag-5'>详细说明</b>书免费下载

    IP6825引脚详细说明与使用技巧

    英集芯IP6825是一款5W无线充电发射端控制SoC芯片,采用QFN-16-EP封装,有16个引脚。芯片内集成全桥驱动电路、功率MOS管和电压/电流双路ASK通信解调模块,降低外围电路复杂度。
    的头像 发表于 05-18 09:02 1169次阅读
    <b class='flag-5'>IP</b>6825引脚<b class='flag-5'>详细说明</b>与使用技巧

    动态IP时代下设备的技术适配与安全进化

    在万物互联的数字浪潮中,IP地址作为网络世界的"门牌号",其分配方式正经历深刻变革。动态IP技术凭借资源利用率高、管理成本低等优势,已成为家庭宽带、物联网设备的主流配置方案。然而
    的头像 发表于 05-11 09:59 667次阅读

    调试变频器详细说明

    调试变频器是一个复杂但至关重要的过程,它涉及多个参数的设定和调整,以确保变频器能够正常运行并满足特定应用需求。以下是对变频器调试的详细说明。 一、准备工作 1. 选择合适的电机功率:根据实际需求选择
    的头像 发表于 04-25 15:32 2517次阅读