1.W5500簡介
W5500 是一款全硬件 TCP/IP 嵌入式以太網(wǎng)控制器,為嵌入式系統(tǒng)提供了更加簡易的互聯(lián)網(wǎng)連接方案。 W5500 集成了 TCP/IP 協(xié)議棧, 10/100M 以太網(wǎng)數(shù)據(jù)鏈路層(MAC)及物理層(PHY) ,使得用戶使用單芯片就能夠在他們的應(yīng)用中拓展網(wǎng)絡(luò)連接。
久經(jīng)市場考驗的 WIZnet 全硬件 TCP/IP 協(xié)議棧支TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 協(xié)議。 W5500 內(nèi)嵌 32K 字節(jié)片上緩存以供以太網(wǎng)包處理。如果你使用 W5500,你只需要一些簡單的 Socket 編程就能實現(xiàn)以太網(wǎng)應(yīng)用。這將會比其他嵌入式以太網(wǎng)方案更加快捷、簡便。用戶可以同時使用 8 個硬件 Socket 獨立通訊。
W5500 提供了 SPI(外設(shè)串行接口)從而能夠更加容易與外設(shè) MCU 整合。而且,W5500 的使用了新的高效 SPI 協(xié)議支持 80MHz 速率,從而能夠更好的實現(xiàn)高速網(wǎng)絡(luò)通訊。為了減少系統(tǒng)能耗, W5500 提供了網(wǎng)絡(luò)喚醒模式(WOL)及掉電模式供客戶選擇使用。
2.W5500特性
支持硬件 TCP/IP 協(xié)議: TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
- 支持 8 個獨立端口(Socket)同時通訊
- 支持掉電模式
- 支持網(wǎng)絡(luò)喚醒
- 支持高速串行外設(shè)接口(SPI 模式 0, 3)
- 內(nèi)部 32K 字節(jié)收發(fā)緩存
- 內(nèi)嵌 10BaseT/100BaseTX 以太網(wǎng)物理層( PHY)
- 支持自動協(xié)商(10/100-Based 全雙工/半雙工)
- 不支持 IP 分片
- 3.3V 工作電壓, I/O 信號口 5V 耐壓;
- LED 狀態(tài)顯示(全雙工/半雙工,網(wǎng)絡(luò)連接,網(wǎng)絡(luò)速度,活動狀態(tài))
- 48 引腳 LQFP 無鉛封裝(7x7mm, 0.5mm 間距)
3.應(yīng)用場合
- 家庭網(wǎng)絡(luò)設(shè)備: 機頂盒、個人錄像機、數(shù)碼媒體適配器
- 串行轉(zhuǎn)以太網(wǎng): 門禁控制、 LED 顯示屏、無線 AP 繼電器等
- 并行轉(zhuǎn)以太網(wǎng): POS/微型打印機、復(fù)印機
- USB 轉(zhuǎn)以太網(wǎng): 存儲設(shè)備、網(wǎng)絡(luò)打印機
- GPIO 轉(zhuǎn)以太網(wǎng): 家庭網(wǎng)絡(luò)傳感器
- 安全系統(tǒng): 數(shù)字錄像機、網(wǎng)絡(luò)攝像機、信息亭
- 工廠和樓宇自動化控制系統(tǒng)
- 醫(yī)療監(jiān)測設(shè)備
- 嵌入式服務(wù)器
W5500模塊圖
4.接線方式
W5500模塊 | STM32核心板 |
片選CS | PB12 |
時鐘SCLK | PB13 |
主機輸入MISO | PB14 |
主機輸出MOSI | PB15 |
INT | PB0 |
RST | PB1 |
5.SPI底層驅(qū)動編寫
CONFIG_MSG ConfigMsg; /*配置結(jié)構(gòu)體*/
/*定義MAC地址,如果多塊W5500網(wǎng)絡(luò)適配板在同一現(xiàn)場工作,請使用不同的MAC地址*/
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};
/*定義默認(rèn)IP信息*/
uint8 local_ip[4] ={192,168,1,88}; /*定義W5500默認(rèn)IP地址*/
uint8 subnet[4] ={255,255,255,0}; /*定義W5500默認(rèn)子網(wǎng)掩碼*/
uint8 gateway[4] ={192,168,1,1}; /*定義W5500默認(rèn)網(wǎng)關(guān)*/
uint8 dns_server[4]={114,114,114,114}; /*定義W5500默認(rèn)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; /*毫秒計數(shù)*/
uint32 dhcp_time = 0; /*DHCP運行計數(shù)*/
vu8 ntptimer = 0; /*NPT秒計數(shù)*/
/*硬件配置*/
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;
}
/*模塊復(fù)位*/
void W5500_reset(void)
{
W5500_RST=0;
Delay_Us(2);
W5500_RST=1;
Delay_Ms(1000);
Delay_Ms(600);
}
/*SPI讀寫一個字節(jié)*/
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底層收發(fā)一個字節(jié)*/
static u8 IINCHIP_SpiSendData(u8 dat)
{
return(SPI_WR_Byte(dat));
}
/*向指定地址寫入一字節(jié)數(shù)據(jù)*/
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;
}
/*從地址讀取讀取一字節(jié)數(shù)據(jù)*/
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指定地址寫入指定長度數(shù)據(jù)
形參:addrbsb -- 寫入的地址
buf -- 要寫入的數(shù)據(jù)
len -- 寫入的長度
返回值:寫入的數(shù)據(jù)長度
*/
u16 wiz_write_buf(u32 addrbsb,u8* buf,u16 len)
{
u16 idx = 0;
if(len == 0) printf("êy?Y3¤?è?a0\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;
}
/*
從指定地址讀取指定長度數(shù)據(jù)
形參:addrbsb -- 讀取的地址
buf -- 讀取的數(shù)據(jù)保存地址
len -- 讀取的長度
返回值:讀取的數(shù)據(jù)長度
*/
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);
}
/*中斷處理函數(shù)*/
void timer3_isr(void)
{
ms++;
if(ms>=1000)
{
ms=0;
dhcp_time++; /*DHCP定時+1S*/
#ifndef __NTP_H__
ntptimer++; /*NTP重試時間+1s*/
#endif
}
}
/*配置W5500網(wǎng)卡信息*/
void set_w5500_ip(void)
{
/*復(fù)制定義的配置信息到配置結(jié)構(gòu)體*/
memcpy(ConfigMsg.mac, mac, 6);//MAC地址
memcpy(ConfigMsg.lip,local_ip,4);//IP
memcpy(ConfigMsg.sub,subnet,4);//子網(wǎng)掩碼
memcpy(ConfigMsg.gw,gateway,4);//網(wǎng)關(guān)
memcpy(ConfigMsg.dns,dns_server,4);//DNS
if(ip_from == IP_FROM_DHCP)/*動態(tài)獲取IP*/
{
if(dhcp_ok==1)/*動態(tài)獲取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相應(yīng)寄存器*/
setSUBR(ConfigMsg.sub);
setGAR(ConfigMsg.gw);
setSIPR(ConfigMsg.lip);
/*判斷數(shù)據(jù)是否寫入成功*/
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 子網(wǎng)掩碼 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]);
getGAR(gateway);
printf(" W5500 網(wǎng)關(guān) : %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初始化,動態(tài)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模擬時序,動態(tài)分配IP VER1.0 \r\n");
W5500_GPIO_Init();/*w5500_GPIO初始化*/
W5500_reset();//硬件復(fù)位w5500
set_w5500_mac();/*配置MAC地址*/
socket_buf_init(txsize, rxsize); /*初始化8個Socket的發(fā)送接收緩存大小*/
printf("網(wǎng)絡(luò)初始化完成\r\n");
while(1)
{
do_dhcp();/*DHCP測試程序*/
}
}
W5500底層寄存器配置文件w5500.c;socket編程相關(guān)函數(shù)文件socket.c、w5500延時函數(shù)、數(shù)據(jù)格式轉(zhuǎn)換文件utility.c;動態(tài)分配IP函數(shù)接口文件dhcp.c這些文件移植可參考示例代碼或參考官方示例工程。
6.效果展示
審核編輯:符乾江
-
IP
+關(guān)注
關(guān)注
5文章
1658瀏覽量
149334 -
SPI
+關(guān)注
關(guān)注
17文章
1701瀏覽量
91333 -
動態(tài)分配
+關(guān)注
關(guān)注
0文章
5瀏覽量
9727
發(fā)布評論請先 登錄
相關(guān)推薦
評論