一. W5500介绍
W5500是一款全硬件TCP/IP嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500集成了TCP/IP协议栈,10/100M以太网数据链路层(MAC)以及物理层(PHY),使得用户使用单芯片就能够在他们的应用中扩展网络连接。
Features:
-
支持硬件TCP/IP协议栈:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
-
支持8个独立端口(socket)同时通讯
-
支持掉电模式
-
支持网络唤醒
-
支持高速串行外设接口(SPI模式0,3)
-
内部32k字节收发缓存,内嵌10BaseT/100BaseTX以太网物理层
-
支持自动协商(10/100-Base全双工/半双工)
-
不支持IP分片
-
3.3V工作电压,I/O信号口5V耐压
-
LED状态显示(全双工/半双工, 网络连接, 网络速度, 活动状态)
W5500芯片系统结构框图
Screen Shot 2020-08-29 at 1.26.23 PM.png从上图可以看出W5500作为一款以太网通信芯片,它可以方便的扩展出主控芯片的以太网通信接口。W5500提供了SPI接口用于与主控芯片进行数据通讯,W5500的内部主要可以分为以下模块:
-
SPI接口控制器
-
寄存器管理器
-
TCP/IP协议栈核(从上到下包括传输层,网络层和数据链路层)
-
MII(介质无关接口)管理器
-
以太网物理层
-
内存管理器
-
32k的发送和接收缓存
二. W5500与主控芯片的数据交互
W5500提供了SPI接口用于实现与主控芯片的数据交互。
W5500与主机的连接方式及SPI工作模式
-
SPI协议根据时钟信号空闲电平定义(高电平or低电平)以及数据锁存边沿方向(上升沿or下降沿)定义了SPI的4种工作模式(工作模式0,1,2,3)。在W5500中只支持工作模式0和3,在这两种模式下数据总是在SCLK信号的上升沿被锁存,在SCLK信号的下降沿被输出。
Screen Shot 2020-08-29 at 4.11.16 PM.png -
根据W5500与主控芯片的连接方式不同,W5500的SPI可以工作在两种模式下:
-
变数据长度模式(VDM)
Screen Shot 2020-08-29 at 4.10.28 PM.png -
定数据长度模式(FDM)
Screen Shot 2020-08-29 at 4.10.50 PM.png
W5500的SPI数据帧格式
Screen Shot 2020-08-29 at 4.11.37 PM.png-
偏移地址域(16bits):MSB到LSB传输,支持连续读写模式,该模式下偏移地址自动加1。
-
控制字域(8bits):
-
包括块选择位(4bits):选择W5500内存中的不同块,包括普通寄存器和8个socket寄存器及相应的发送/接收寄存器。
-
读写控制位:0为读, 1 为写。
-
模式选择位:配置W5500的SPI工作模式,配置定义如下表
OM[0:1]值 模式 00 可变数据长度模式,Nbytes数据域 01 固定数据长度模式,N=1 10 固定数据长度模式,N=2 11 固定数据长度模式,N=4
-
-
数据域(N*8bits):MSB到LSB传输的数据
W5500的内存分布结构
Screen Shot 2020-08-29 at 4.12.48 PM.pngW5500的内部存储包括:
-
1个普通寄存器block:这里配置了W5500的一些基本信息,如网络配置(IP,MAC地址,Socket中断配置等等)
-
8个Socket寄存器block:这里配置了每个Socket对应的信息,如Socket的模式,命令,状态,中断信息等。
-
8个Socket对应的接收缓冲寄存器block(共16k):初始时每个Socket分配为2k的缓存,用户可以自己重新通过修改相应的配置寄存器进行修改,但是要保证分配给8个Socket的缓冲大小之和不能超过16k,否则会报错。
-
8个Socket对应的发送缓冲寄存器block(共16k):同3
三. W5500官方库移植
W5500官方库介绍:
wiznet公司为了方便芯片使用者进行软件开发,提供了相应的芯片底层驱动库,在这个库中实现了:
-
对W5500的硬件抽象,用户只需要将主控芯片的SPI驱动函数注册到W5500中即可以实现主控芯片和W5500之间的数据交互。
-
实现了TCP/IP协议的接口,官方库中实现了BSD风格的Socket接口可供用户直接调用。
-
提供了一些应用层协议开发的接口实现,如FTP, HTTP,MQTT等。
官方库使用github托管,链接地址为:
[wiznet/ioLibrary] Https://github.com/Wiznet/ioLibrary_Driver
W5500官方库移植方法
-
下载或clone官方库到本地,选择需要的文件添加到自己的工程当中,官方库的文件架构如下:
w5500_ioLibrary.jpeg
Ethernet文件夹下包含的是以太网相关协议的实现,一般都是必须的(选择相应的芯片类型添加),而internet文件夹下则是一些应用层协议的实现,可以根据自己的需要进行添加。
-
根据实际使用的芯片和硬件架构修改wizchip_conf.h头文件中的定义,如:
-
根据实际使用的芯片修改芯片型号定义(WIZCHIP宏),默认为W5100S,使用W5500芯片时只需要改为:
#define _WIZCHIP_ W5500
-
找到W5500对应的宏定义配置处,修改W5500与主控芯片的通信配置信息,对于W5500来说只有SPI这一种接口,这里只需要根据自己的需求选择SPI的两种工作模式:VDM和FDM,例如治理选择VDM模式:
#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_VDM
-
在wizchip_conf.h文件中有对W5500芯片的封装,该文件中提供了很多函数注册的接口,用于实现用户定义的SPI驱动函数接口和W5500官方库的硬件抽象接口之间的连接。因此只需要按照官方库中的定义实现相关的SPI驱动函数,然后再调用官方库中提供的注册函数将这些驱动函数进行注册,就能够打通主控芯片与W5500芯片之间的数据交互,实现驱动移植。
-
新建两个SPI驱动的接口文件,例如:w5500_interface.h和w5500_interface.c。然后在文件中实现以下底层的驱动函数:
void CS_Select(void); //片选使能 void CS_deSelect(void); //片选清使能 void SPI_Write_Byte(uint8_t byte); //写单子节 uint8_t SPI_Read_Byte(void); //读单子节 /* 丛发模式读数据 */ void SPI_Read_Burst(uint8_t *buff, uint16_t len); /* 丛发模式写数据 */ void SPI_Write_Burst(uint8_t *buff, uint16_t len);
-
编写W5500的初始化函数:
void w5500_init(void);
在该函数中调用官方库提供的注册函数,将步骤4中实现的底层SPI驱动函数进行注册。
-
网友评论