一. W5500介紹
W5500是一款全硬件TCP/IP嵌入式以太網(wǎng)控制器,為嵌入式系統(tǒng)提供了更加簡(jiǎn)易的互聯(lián)網(wǎng)連接方案。W5500集成了TCP/IP協(xié)議棧,10/100M以太網(wǎng)數(shù)據(jù)鏈路層(MAC)以及物理層(PHY),使得用戶使用單芯片就能夠在他們的應(yīng)用中擴(kuò)展網(wǎng)絡(luò)連接。
Features:
支持硬件TCP/IP協(xié)議棧:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
支持8個(gè)獨(dú)立端口(socket)同時(shí)通訊
支持掉電模式
支持網(wǎng)絡(luò)喚醒
支持高速串行外設(shè)接口(SPI模式0,3)
內(nèi)部32k字節(jié)收發(fā)緩存,內(nèi)嵌10BaseT/100BaseTX以太網(wǎng)物理層
支持自動(dòng)協(xié)商(10/100-Base全雙工/半雙工)
不支持IP分片
3.3V工作電壓,I/O信號(hào)口5V耐壓
LED狀態(tài)顯示(全雙工/半雙工, 網(wǎng)絡(luò)連接, 網(wǎng)絡(luò)速度, 活動(dòng)狀態(tài))
W5500芯片系統(tǒng)結(jié)構(gòu)框圖

從上圖可以看出W5500作為一款以太網(wǎng)通信芯片,它可以方便的擴(kuò)展出主控芯片的以太網(wǎng)通信接口。W5500提供了SPI接口用于與主控芯片進(jìn)行數(shù)據(jù)通訊,W5500的內(nèi)部主要可以分為以下模塊:
SPI接口控制器
寄存器管理器
TCP/IP協(xié)議棧核(從上到下包括傳輸層,網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層)
MII(介質(zhì)無關(guān)接口)管理器
以太網(wǎng)物理層
內(nèi)存管理器
32k的發(fā)送和接收緩存
二. W5500與主控芯片的數(shù)據(jù)交互
W5500提供了SPI接口用于實(shí)現(xiàn)與主控芯片的數(shù)據(jù)交互。
W5500與主機(jī)的連接方式及SPI工作模式
-
SPI協(xié)議根據(jù)時(shí)鐘信號(hào)空閑電平定義(高電平or低電平)以及數(shù)據(jù)鎖存邊沿方向(上升沿or下降沿)定義了SPI的4種工作模式(工作模式0,1,2,3)。在W5500中只支持工作模式0和3,在這兩種模式下數(shù)據(jù)總是在SCLK信號(hào)的上升沿被鎖存,在SCLK信號(hào)的下降沿被輸出。
Screen Shot 2020-08-29 at 4.11.16 PM.png 根據(jù)W5500與主控芯片的連接方式不同,W5500的SPI可以工作在兩種模式下:
-
變數(shù)據(jù)長度模式(VDM)
Screen Shot 2020-08-29 at 4.10.28 PM.png -
定數(shù)據(jù)長度模式(FDM)
Screen Shot 2020-08-29 at 4.10.50 PM.png
W5500的SPI數(shù)據(jù)幀格式

偏移地址域(16bits):MSB到LSB傳輸,支持連續(xù)讀寫模式,該模式下偏移地址自動(dòng)加1。
-
控制字域(8bits):
包括塊選擇位(4bits):選擇W5500內(nèi)存中的不同塊,包括普通寄存器和8個(gè)socket寄存器及相應(yīng)的發(fā)送/接收寄存器。
讀寫控制位:0為讀, 1 為寫。
-
模式選擇位:配置W5500的SPI工作模式,配置定義如下表
OM[0:1]值 模式 00 可變數(shù)據(jù)長度模式,Nbytes數(shù)據(jù)域 01 固定數(shù)據(jù)長度模式,N=1 10 固定數(shù)據(jù)長度模式,N=2 11 固定數(shù)據(jù)長度模式,N=4
數(shù)據(jù)域(N*8bits):MSB到LSB傳輸?shù)臄?shù)據(jù)
W5500的內(nèi)存分布結(jié)構(gòu)

W5500的內(nèi)部存儲(chǔ)包括:
1個(gè)普通寄存器block:這里配置了W5500的一些基本信息,如網(wǎng)絡(luò)配置(IP,MAC地址,Socket中斷配置等等)
8個(gè)Socket寄存器block:這里配置了每個(gè)Socket對(duì)應(yīng)的信息,如Socket的模式,命令,狀態(tài),中斷信息等。
8個(gè)Socket對(duì)應(yīng)的接收緩沖寄存器block(共16k):初始時(shí)每個(gè)Socket分配為2k的緩存,用戶可以自己重新通過修改相應(yīng)的配置寄存器進(jìn)行修改,但是要保證分配給8個(gè)Socket的緩沖大小之和不能超過16k,否則會(huì)報(bào)錯(cuò)。
8個(gè)Socket對(duì)應(yīng)的發(fā)送緩沖寄存器block(共16k):同3
三. W5500官方庫移植
W5500官方庫介紹:
wiznet公司為了方便芯片使用者進(jìn)行軟件開發(fā),提供了相應(yīng)的芯片底層驅(qū)動(dòng)庫,在這個(gè)庫中實(shí)現(xiàn)了:
對(duì)W5500的硬件抽象,用戶只需要將主控芯片的SPI驅(qū)動(dòng)函數(shù)注冊(cè)到W5500中即可以實(shí)現(xiàn)主控芯片和W5500之間的數(shù)據(jù)交互。
實(shí)現(xiàn)了TCP/IP協(xié)議的接口,官方庫中實(shí)現(xiàn)了BSD風(fēng)格的Socket接口可供用戶直接調(diào)用。
提供了一些應(yīng)用層協(xié)議開發(fā)的接口實(shí)現(xiàn),如FTP, HTTP,MQTT等。
官方庫使用github托管,鏈接地址為:
[wiznet/ioLibrary] Https://github.com/Wiznet/ioLibrary_Driver
W5500官方庫移植方法
-
下載或clone官方庫到本地,選擇需要的文件添加到自己的工程當(dāng)中,官方庫的文件架構(gòu)如下:
w5500_ioLibrary.jpeg
Ethernet文件夾下包含的是以太網(wǎng)相關(guān)協(xié)議的實(shí)現(xiàn),一般都是必須的(選擇相應(yīng)的芯片類型添加),而internet文件夾下則是一些應(yīng)用層協(xié)議的實(shí)現(xiàn),可以根據(jù)自己的需要進(jìn)行添加。
-
根據(jù)實(shí)際使用的芯片和硬件架構(gòu)修改wizchip_conf.h頭文件中的定義,如:
-
根據(jù)實(shí)際使用的芯片修改芯片型號(hào)定義(WIZCHIP宏),默認(rèn)為W5100S,使用W5500芯片時(shí)只需要改為:
#define _WIZCHIP_ W5500 -
找到W5500對(duì)應(yīng)的宏定義配置處,修改W5500與主控芯片的通信配置信息,對(duì)于W5500來說只有SPI這一種接口,這里只需要根據(jù)自己的需求選擇SPI的兩種工作模式:VDM和FDM,例如治理選擇VDM模式:
#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_VDM 在wizchip_conf.h文件中有對(duì)W5500芯片的封裝,該文件中提供了很多函數(shù)注冊(cè)的接口,用于實(shí)現(xiàn)用戶定義的SPI驅(qū)動(dòng)函數(shù)接口和W5500官方庫的硬件抽象接口之間的連接。因此只需要按照官方庫中的定義實(shí)現(xiàn)相關(guān)的SPI驅(qū)動(dòng)函數(shù),然后再調(diào)用官方庫中提供的注冊(cè)函數(shù)將這些驅(qū)動(dòng)函數(shù)進(jìn)行注冊(cè),就能夠打通主控芯片與W5500芯片之間的數(shù)據(jù)交互,實(shí)現(xiàn)驅(qū)動(dòng)移植。
-
新建兩個(gè)SPI驅(qū)動(dòng)的接口文件,例如:w5500_interface.h和w5500_interface.c。然后在文件中實(shí)現(xiàn)以下底層的驅(qū)動(dòng)函數(shù):
void CS_Select(void); //片選使能 void CS_deSelect(void); //片選清使能 void SPI_Write_Byte(uint8_t byte); //寫單子節(jié) uint8_t SPI_Read_Byte(void); //讀單子節(jié) /* 叢發(fā)模式讀數(shù)據(jù) */ void SPI_Read_Burst(uint8_t *buff, uint16_t len); /* 叢發(fā)模式寫數(shù)據(jù) */ void SPI_Write_Burst(uint8_t *buff, uint16_t len); -
編寫W5500的初始化函數(shù):
void w5500_init(void);在該函數(shù)中調(diào)用官方庫提供的注冊(cè)函數(shù),將步驟4中實(shí)現(xiàn)的底層SPI驅(qū)動(dòng)函數(shù)進(jìn)行注冊(cè)。
-



