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提供了SPI(串行外部接口)作为外设主机接口,共有 SCSn, SCLK, MOSI,MISO 4 路信号,且作为 SPI 从机工作。根据SCSn引脚的选择,WW5500的数据数据长度可以设置为可变长度和固定长度。如下图接线方式为可变数据长度。

在VDM模式下, SPI数据帧的长度被外设主机控制的SCSn所定义。这就意味着数据段长度根据 SCSn 的控制,可以是一个随机值(从 1 字节到 N 字节任何长度均可)。在VDM模式下, M[1:0]位必须为‘00’。
- 固定数据段长度接线如下:

在外设主机不能控制 SCSn 时,可以使用固定数据长度模式。
此时, SCSn 必须连接到低电平(保持接地)。与此同时, SPI 接口不能与其他 SPI 设备共享。在可变数据长度模式(VDM)中,数据段长度由 SCSn 控制。
4.1 SPI数据帧
W5500 的 SPI 数据帧包括了 16 位地址段的偏移地址, 8 位控制段和 N 字节数据段。
8 位控制段可以通过修改区域选择位 (BSB[4:0]),读/写访问模式位(RWB)以及 SPI工作模式位(OM[1:0])来重新定义。区域选择位选择了归属于偏移地址的区域。

W5500支持数据的连续读/写。其流程为数据从(2/4/N字节连续数据的) 偏移地址的基址开始传输,偏移地址会(自增寻址) 加 1 传输接下来的数据。
- 地址段
地址段为 W5500 的寄存器或 TX/RX 缓存区指定了 16 位的偏移地址。这 16 位偏移地址的值来自于从最高标志位到最低标志位的顺序传输。SPI 数据帧的数据段(2/4/N 字节)通过偏移地址自增(每传输 1 字节偏移地址加 1 )支持连续数据读/写。
- 控制段
控制段指定了地址段设定的偏移区域的归属,读/写访问模式以及 SPI 工作模式。



- 数据段
在 SPI 工作模式位 OM[1:0]设定了控制端之后,数据段被设定为 2 种长度类型: 1 种为可变的 N 字节长度(可变数据长度模式) ,另以一种为确定的 1/2/4 字节长度(固定数据长度模式)。高位先发。
4.2 寄存器
- GAR (网关 IP 地址寄存器) [R/W] [0x0001 – 0x0004] [0x00]
该寄存器用来设置默认网关地址。例如:192.168.0.1

- SUBR (子网掩码寄存器) [R/W] [0x0005 – 0x0008] [0x00]
该寄存器用来设置子网掩码地址。例如:255.255.255.0

- SHAR (源 MAC 地址寄存器) [R/W] [0x0009 – 0x000E] [0x00]
该寄存器用来设置源 MAC 地址。例如:00.08.DC.01.02.03

- SIPR (源 IP 地址寄存器) [R/W] [0x000F – 0x0012] [0x00]
该寄存器用来设置源 IP 地址。例如:192.168.0.2

5.W5500驱动编写
硬件开发平台:STM32F103C8T6
驱动协议:SPI
开发环境:KEIL5
5.1 接线方式
W5500模块 |
STM32核心板 |
片选CS |
PB12 |
时钟SCLK |
PB13 |
主机输入MISO |
PB14 |
主机输出MOSI |
PB15 |
INT |
PB0 |
RST |
PB1 |
5.2 SPI底层驱动编写
w5500_config.c文件
CONFIG_MSG ConfigMsg;
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};
uint8 local_ip[4] ={192,168,1,88};
uint8 subnet[4] ={255,255,255,0};
uint8 gateway[4] ={192,168,1,1};
uint8 dns_server[4]={114,114,114,114};
uint16 local_port=5000;
uint8 remote_ip[4]={192,168,1,102};
uint16 remote_port=5000;
uint8 ip_from=IP_FROM_DHCP;
uint8 dhcp_ok = 0;
uint32 ms = 0;
uint32 dhcp_time = 0;
vu8 ntptimer = 0;
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);
}
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;
}
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;
}
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;
}
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;
}
void dhcp_timer_init(void)
{
TIMx_Init(TIM3,72,1000);
TIM3->CR1|=1<<0;
}
void ntp_timer_init(void)
{
TIMx_Init(TIM3,72,1000);
}
void timer3_isr(void)
{
ms++;
if(ms>=1000)
{
ms=0;
dhcp_time++;
#ifndef __NTP_H__
ntptimer++;
#endif
}
}
void set_w5500_ip(void)
{
memcpy(ConfigMsg.mac, mac, 6);
memcpy(ConfigMsg.lip,local_ip,4);
memcpy(ConfigMsg.sub,subnet,4);
memcpy(ConfigMsg.gw,gateway,4);
memcpy(ConfigMsg.dns,dns_server,4);
if(ip_from == IP_FROM_DHCP)
{
if(dhcp_ok==1)
{
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);
}
}
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]);
}
void set_w5500_mac(void)
{
memcpy(ConfigMsg.mac, mac, 6);
setSHAR(ConfigMsg.mac);
memcpy(DHCP_GET.mac, mac, 6);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
W5500底层寄存器配置文件w5500.c;socket编程相关函数文件socket.c、w5500延时函数、数据格式转换文件utility.c;动态分配IP函数接口文件dhcp.c这些文件移植可参考示例代码或参考官方示例工程。

