0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

有線網(wǎng)卡驅(qū)動(dòng)和動(dòng)態(tài)分配IP的詳細(xì)說明

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-05-31 17:40 ? 次閱讀

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)市場考驗(yàn)的 WIZnet 全硬件 TCP/IP 協(xié)議棧支TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 協(xié)議。 W5500 內(nèi)嵌 32K 字節(jié)片上緩存以供以太網(wǎng)包處理。如果你使用 W5500,你只需要一些簡單的 Socket 編程就能實(shí)現(xiàn)以太網(wǎng)應(yīng)用。這將會(huì)比其他嵌入式以太網(wǎng)方案更加快捷、簡便。用戶可以同時(shí)使用 8 個(gè)硬件 Socket 獨(dú)立通訊。
W5500 提供了 SPI(外設(shè)串行接口)從而能夠更加容易與外設(shè) MCU 整合。而且,W5500 的使用了新的高效 SPI 協(xié)議支持 80MHz 速率,從而能夠更好的實(shí)現(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 個(gè)獨(dú)立端口(Socket)同時(shí)通訊
  • 支持掉電模式
  • 支持網(wǎng)絡(luò)喚醒
  • 支持高速串行外設(shè)接口(SPI 模式 0, 3)
  • 內(nèi)部 32K 字節(jié)收發(fā)緩存
  • 內(nèi)嵌 10BaseT/100BaseTX 以太網(wǎng)物理層( PHY)
  • 支持自動(dòng)協(xié)商(10/100-Based 全雙工/半雙工)
  • 不支持 IP 分片
  • 3.3V 工作電壓, I/O 信號(hào)口 5V 耐壓;
  • LED 狀態(tài)顯示(全雙工/半雙工,網(wǎng)絡(luò)連接,網(wǎng)絡(luò)速度,活動(dòng)狀態(tài))
  • 48 引腳 LQFP 無鉛封裝(7x7mm, 0.5mm 間距)

3.應(yīng)用場合

  • 家庭網(wǎng)絡(luò)設(shè)備: 機(jī)頂盒、個(gè)人錄像機(jī)、數(shù)碼媒體適配器
  • 串行轉(zhuǎn)以太網(wǎng): 門禁控制、 LED 顯示屏、無線 AP 繼電器等
  • 并行轉(zhuǎn)以太網(wǎng): POS/微型打印機(jī)、復(fù)印機(jī)
  • USB 轉(zhuǎn)以太網(wǎng): 存儲(chǔ)設(shè)備、網(wǎng)絡(luò)打印機(jī)
  • GPIO 轉(zhuǎn)以太網(wǎng): 家庭網(wǎng)絡(luò)傳感器
  • 安全系統(tǒng): 數(shù)字錄像機(jī)、網(wǎng)絡(luò)攝像機(jī)、信息
  • 工廠和樓宇自動(dòng)化控制系統(tǒng)
  • 醫(yī)療監(jiān)測設(shè)備
  • 嵌入式服務(wù)器

W5500模塊圖

poYBAGKV4YCAPQeYAAXS4rkfy70626.png

4.接線方式

W5500模塊 STM32核心板
片選CS PB12
時(shí)鐘SCLK PB13
主機(jī)輸入MISO PB14
主機(jī)輸出MOSI PB15
INT PB0
RST PB1

5.SPI底層驅(qū)動(dòng)編寫

CONFIG_MSG  ConfigMsg;																	/*配置結(jié)構(gòu)體*/
/*定義MAC地址,如果多塊W5500網(wǎng)絡(luò)適配板在同一現(xiàn)場工作,請(qǐng)使用不同的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;	                       					/*定義本地端口*/

/*定義遠(yuǎn)端IP信息*/
uint8  remote_ip[4]={192,168,1,102};										/*遠(yuǎn)端IP地址*/
uint16 remote_port=5000;																/*遠(yuǎn)端端口號(hào)*/

/*IP配置方法選擇,請(qǐng)自行選擇*/
uint8	ip_from=IP_FROM_DHCP;				

uint8   dhcp_ok   = 0;																	/*dhcp成功獲取IP*/
uint32	ms        = 0;																	/*毫秒計(jì)數(shù)*/
uint32	dhcp_time = 0;																	/*DHCP運(yùn)行計(jì)數(shù)*/
vu8	    ntptimer  = 0;																	/*NPT秒計(jì)數(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讀寫一個(gè)字節(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ā)一個(gè)字節(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用到定時(shí)器初始化*/
void dhcp_timer_init(void)
{
  TIMx_Init(TIM3,72,1000);
  TIM3->CR1|=1<<0;
}
/*ntp用到定時(shí)器出事化*/
void ntp_timer_init(void)
{
  TIMx_Init(TIM3,72,1000);												
}
/*中斷處理函數(shù)*/
void timer3_isr(void)
{
  ms++;	
  if(ms>=1000)
  {  
    ms=0;
    dhcp_time++;	/*DHCP定時(shí)+1S*/
    #ifndef	__NTP_H__
	  ntptimer++;	/*NTP重試時(shí)間+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)/*動(dòng)態(tài)獲取IP*/
  {
    if(dhcp_ok==1)/*動(dòng)態(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初始化,動(dòng)態(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模擬時(shí)序,動(dòng)態(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個(gè)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ù)、數(shù)據(jù)格式轉(zhuǎn)換文件utility.c;動(dòng)態(tài)分配IP函數(shù)接口文件dhcp.c這些文件移植可參考示例代碼或參考官方示例工程。

6.效果展示

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

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • IP
    IP
    +關(guān)注

    關(guān)注

    5

    文章

    1586

    瀏覽量

    149168
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1685

    瀏覽量

    91094
  • 動(dòng)態(tài)分配
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    9721
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    住宅動(dòng)態(tài)IP解析:優(yōu)勢、應(yīng)用場景與未來趨勢

    住宅動(dòng)態(tài)IP是指由互聯(lián)網(wǎng)服務(wù)提供商(ISP)分配給家庭用戶的、能夠隨時(shí)間自動(dòng)更換的IP地址。
    的頭像 發(fā)表于 10-21 08:07 ?96次閱讀

    安全暢游世界:動(dòng)態(tài)分配海外住宅IP,保護(hù)隱私與加速網(wǎng)絡(luò)訪問

    在數(shù)字化時(shí)代,互聯(lián)網(wǎng)已成為人們獲取信息、交流思想、開展業(yè)務(wù)的重要平臺(tái)。然而,隨著網(wǎng)絡(luò)環(huán)境的日益復(fù)雜,網(wǎng)絡(luò)安全與隱私保護(hù)問題日益凸顯。動(dòng)態(tài)分配海外住宅IP作為一種先進(jìn)的網(wǎng)絡(luò)工具,為用戶提供了在全球范圍內(nèi)安全暢游的可能性。
    的頭像 發(fā)表于 09-26 08:13 ?171次閱讀

    有線網(wǎng)卡和無線網(wǎng)卡分別指的是什么

    有線網(wǎng)卡和無線網(wǎng)卡是計(jì)算機(jī)或網(wǎng)絡(luò)設(shè)備中用于連接網(wǎng)絡(luò)的兩種不同類型的網(wǎng)絡(luò)接口卡。它們的主要區(qū)別在于傳輸媒介和連接方式。
    的頭像 發(fā)表于 05-28 15:28 ?2775次閱讀

    3KW工業(yè)變頻器電路設(shè)計(jì)方案詳細(xì)說明

    3KW工業(yè)變頻器電路設(shè)計(jì)方案詳細(xì)說明
    的頭像 發(fā)表于 03-19 08:33 ?811次閱讀
    3KW工業(yè)變頻器電路設(shè)計(jì)方案<b class='flag-5'>詳細(xì)說明</b>

    Intel近日發(fā)布新版Wi-Fi 7無線網(wǎng)卡驅(qū)動(dòng) 依然和AMD系統(tǒng)不對(duì)付

    Intel近日發(fā)布了新版Wi-Fi 7無線網(wǎng)卡驅(qū)動(dòng),增加新功能,修復(fù)已知Bug,但遺憾的是,依然和AMD系統(tǒng)不對(duì)付。
    的頭像 發(fā)表于 03-04 15:29 ?916次閱讀

    線網(wǎng)卡驅(qū)動(dòng)怎么安裝 無線網(wǎng)卡怎么連接臺(tái)式電腦

    如今,隨著科技的不斷發(fā)展,無線網(wǎng)絡(luò)已經(jīng)成為了我們生活中不可或缺的一部分。對(duì)于臺(tái)式電腦用戶而言,如果沒有內(nèi)置無線網(wǎng)卡,就需要通過安裝外置無線網(wǎng)卡來連接無線網(wǎng)絡(luò)。本文將
    的頭像 發(fā)表于 01-19 09:54 ?2846次閱讀

    什么是無線網(wǎng)卡?它是如何工作的?如何安裝無線網(wǎng)卡?

    什么是無線網(wǎng)卡?它是如何工作的?如何安裝無線網(wǎng)卡? 無線網(wǎng)卡(無線適配器)是一種設(shè)備,用于使計(jì)算機(jī)或其他設(shè)備能夠連接到無線局域網(wǎng)(WLAN)。在沒有無線網(wǎng)卡的情況下,設(shè)備只能通過
    的頭像 發(fā)表于 12-15 09:58 ?1431次閱讀

    線網(wǎng)卡槽位有哪些種類及其優(yōu)勢介紹

    線網(wǎng)卡槽位有哪些種類及其優(yōu)勢介紹 無線網(wǎng)卡是一種用于連接電腦或其他設(shè)備與無線網(wǎng)絡(luò)的硬件設(shè)備。它通常插入到計(jì)算機(jī)內(nèi)部的擴(kuò)展槽位上,以提供無線連接功能?,F(xiàn)在市場上有多種類型的無線網(wǎng)卡槽位
    的頭像 發(fā)表于 12-15 09:58 ?1138次閱讀

    選擇無線網(wǎng)卡的原則和方法

    選擇無線網(wǎng)卡的原則和方法 無線網(wǎng)卡是一種用于連接電腦或其他設(shè)備與無線網(wǎng)絡(luò)的設(shè)備,它可以通過Wi-Fi信號(hào)接收和發(fā)送數(shù)據(jù)。隨著無線網(wǎng)絡(luò)的廣泛應(yīng)用,選擇一款合適的無
    的頭像 發(fā)表于 12-11 11:38 ?1077次閱讀

    線網(wǎng)IP靜態(tài)好還是DHCP好

    靜態(tài)IP動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP)是兩種不同的IP地址分配方法。每種方法都有其優(yōu)點(diǎn)和適用場景,選擇哪種方法取決于您的具體需求和網(wǎng)絡(luò)環(huán)境。下面將
    的頭像 發(fā)表于 11-27 15:03 ?1.6w次閱讀

    網(wǎng)絡(luò)靜態(tài)ip動(dòng)態(tài)區(qū)別

    網(wǎng)絡(luò)靜態(tài)IP動(dòng)態(tài)IP是指在網(wǎng)絡(luò)中分配給設(shè)備的唯一標(biāo)識(shí)符,下面將詳細(xì)探討網(wǎng)絡(luò)靜態(tài)IP
    的頭像 發(fā)表于 11-27 14:46 ?1227次閱讀

    靜態(tài)IP動(dòng)態(tài)IP的區(qū)別

    靜態(tài)IP動(dòng)態(tài)IP是計(jì)算機(jī)網(wǎng)絡(luò)中常用的兩種IP地址分配方式,它們?cè)?b class='flag-5'>分配方式、使用范圍、安全性和適
    的頭像 發(fā)表于 11-27 14:44 ?3227次閱讀

    linux安裝網(wǎng)卡驅(qū)動(dòng)教程

    在Linux系統(tǒng)中安裝網(wǎng)卡驅(qū)動(dòng)是一個(gè)比較基礎(chǔ)的操作,下面我將為你詳細(xì)講解如何安裝網(wǎng)卡驅(qū)動(dòng)。 第一步,檢查
    的頭像 發(fā)表于 11-17 11:11 ?3724次閱讀

    linux修改網(wǎng)卡ip配置文件

    、子網(wǎng)掩碼、網(wǎng)關(guān)等參數(shù)。本文將詳細(xì)介紹如何修改Linux的網(wǎng)卡ip配置文件。 首先,在Linux中,網(wǎng)絡(luò)接口的配置文件一般位于/etc/sysconfig/network-scripts/目錄下,文件名類似為ifcfg-ethX
    的頭像 發(fā)表于 11-17 10:51 ?2012次閱讀

    如何修改網(wǎng)絡(luò)配置(動(dòng)態(tài)_靜態(tài)IP)

    | 接口絲印 | 設(shè)備名 | 說明 | | ---------- | -------- | ------------------------ | | NET1| eth1| 百兆網(wǎng)卡,位于核心板上
    發(fā)表于 11-09 15:40