W7100A單片機的MACRAW模式及簡單的ARP應用

這篇文檔將會介紹如何使用W7100A中實現MACRAWMACRAW是一個低於IP層的以太網MAC通信,它能夠靈活使用目的主機的上層協議。W7100A是全硬件的TCP/IP協議棧芯片,它不僅包括OSI的4層,還包括4層之外的應用層。因此,W7100A能夠簡單且穩定地應用於嵌入式互聯網中。

 

在第一章簡單介紹下MACRAW模式,第二章介紹MACRAW SOCKET,第三章則是ARP(地址解析協議)。希望對大家有所幫助。

 

 

1. 簡介

MACRAW是一個低於IP層的以太網MAC通信,它能夠靈活使用目的主機的上層協議。圖1顯示了通過協議棧的數據封裝形式。W7100A是全硬件的TCP/IP協議棧芯片,它不僅包括OSI的4層,還包括4層之外的應用層。因此,W7100A能夠簡單且穩定地應用於嵌入式互聯網中。如果在鏈路層需要進行數據處理,可以使用MACRAW模式下的軟件TCP/IP協議來完成。

MACRAW模式支持鏈路層的地址解析協議(ARP)。在W7100A中,ARP請求和回復都已經通過硬件邏輯進行了處理。儘管如此,它仍然可以在MACRAW模式下打開SOCKET0 (第0個  socket)(MACRAW模式下只能使用SOCKET0)。利用該SOCKET0,用戶便能夠處理軟件TCP/IP協議棧指定的協議,例如ARP等。本文主要介紹W7100A單片機的MACRAW模式以及簡單的

ARP應用。

 

<圖1>通過協議棧的數據封裝形式

2.  MACRAW SOCKET

MACRAW模式下的通信只支持SOCKET0,但是此時SOCKET1~7也能同時工作於硬件

TCP/IP協議棧下。SOCKET0作為NIC(網絡接口控制器)使用,這樣便可實現軟件TCP/IP協議棧。這就是W7100A單片機的混合TCP/IP協議棧:支持硬件TCP/IP和軟件TCP/IP協議棧。對於普通的數據傳輸,軟件TCP/IP能夠通過MACRAW模式進行處理。MACRAW模式下的SOCKET0能夠處理除了SOCKET1~7需要使用的協議之外的其它所有協議。由於MACRAW是處理純以太網數據包的通信方法,這就要求工程師具備軟件TCP/IP協議棧的知識背景。

圖2顯示了MACRAW的數據格式。MACRAW數據由兩個字節的PACKET-INF0以及數據包組成。PACKET-INFO包含數據包的字節大小,而數據包又包括6字節的目的MAC地址、6字節的源MAC地址、2字節的類型(Type)以及46~1500字節的有效載荷(payload)。其中有效載荷

(payload)具有和ARP或者IP相似的互聯網協議。具體的詳細信息,請參考:

http://www.iana.org/assignments/ethernet-numbers.

<圖2>MACRAW的數據格式

2.1  打開(OPEN)

將SOCKET號設置為‘0’之後,在MACRAW模式下通過調用socket()函數打開SOCKET,之後等待直到Sn_SR寄存器的值變成SOCK_MACRAW(0x42)。Sn_SR再次調用getSn_SR()函數來查看其狀態。當Sn_SR的狀態變成SOCK_MACRAW時,表示SOCKET打開(OPEN)過程完成。

/*設置協議號  */

s = 0; // 只可使用SOCKET0.

/*打開MACRAW模式下的SOCKET0*/

socket(s,Sn_MR_MACRAW,port,mode);

while(getSn_SR(s)  != SOCK_MACRAW);

例2.1打開(OPEN)Socket

2.2   發送(SEND)

通過sento()函數將data_buf發送到目的地址(add)。如果主機發送的數據長度小於60字節,在實際發送以太網數據包時會利用內部的“0填充”將數據填充到60字節。

/*向指定的目的端發送Ping請求*/

//max_size_tx_buf的值必須小於TX緩存器的最大存儲空間

*  data_buf[max_size_tx_buf] = (uint8 *)0x7000;//設定數據緩存器的位置

sendto(s,(uint8  *)&data_buf,sizeof(data_buf),addr,port)

例2.2發送(SEND) 數據

2.3  接收(RECEIVE)

通過recvfrom()函數接收發送給目的地址(add)的data_buf。SOCKET仍然是在MACRAW模式下打開的,並且使用指定的端口。

/* 檢測接收到的數據*/

//rlen表示RX緩存器中接收到的數據大小

//rlen的值必須小於RX緩存器的最大存儲空間

if ( (rlen =  getSn_RX_RSR(s) ) > 0)

/* 接收到的數據 */

//len包括PACKET-INFO以及DATA數據包的長度

len = (recvfrom(s, (uint8 *)data_buf,rlen,addr,&port);

例2.3接收(RECEIVE) 數據

2.4  關閉(CLOSE)

如果不再使用IPRAW SOCKETn,通過調用close()函數來關閉SOCKETn。

3.  ARP (地址解析協議)

    ARP是查找存在於網絡中的節點地址,同時將數據從源節點發送給目的節點的過程,發送的這些數據含有目標以太網的地址。目的節點接收到的信息可以使源節點唯一地識別請求的網絡系統,進而提供需要的地址。當源節點接收到來自目的端的響應時,表示地址解析過程完成,該響應包含請求的地址。為了減少ARP請求的次數,以太網地址會保存在NIC中一段時間。需要注意的是,W7100A只能保存一個以太網地址,所以在每次建立連接時都需要ARP發送請求。表4顯示了ARP信息格式。

Byte

Byte

Byte

Byte

Hardware (H) Type

Protocol (P) Type

H Length

P Length

Operation

Sender H Address ( Octets 0-3 )

Sender H Address ( Octets 4-5 )

Sender IP ( Octets 0-1 )

Sender IP ( Octets 2-3 )

Target H Address ( Octets 0-1 )

Target H Address ( Octets 2-5 )

Target IP Address ( Octets 0-3 )

表3.1 ARP信息格式

3.1  ARP實現

W7100A的ARP過程是通過硬件邏輯方式執行的。在W7100A初始化完成後,ARP自動執行。如果ARP應用是由軟件棧設計或者需要其他鏈路層的協議時,W7100A用戶必須直接處理RAW數據。需要注意的是,如果SOCKET0是在MACRAW模式下創建的,那麼硬件化的ARP邏輯操作就不能執行。為了能夠更簡單的定義ARP信息,見表3.1.1所示的ARPMSG結構定義。

#define  ARP_TYPE         0x0806

#define  ARP_TYPE_HI           0x08

#define  ARP_TYPE_LO     0x06

#define  ETHER_TYPE     0x0001

#define  PRO_TYPE        0x0800

#define  HW_SIZE               6

#define  PRO_SIZE          4

#define ARP_REQUEST          0x0001

#define  ARP_REPLY       0x0002

 

typedefstruct  _ARPMSG

{

uint8   dst_mac[6];   //  ff.ff.ff.ff.ff.ff

uint8   src_mac[6];  

uint16 msg_type;   // ARP (0x0806)

uint16 hw_type;      // Ethernet (0x0001)

uint16 pro_type;      // IP (0x0800)

uint8   hw_size;       // 6

uint8   pro_size;      // 4

uint16 opcode; //要求(request) (0x0001), 回復(reply)(0x0002)

uint8   sender_mac[6];   

uint8   sender_ip[4];            

uint8   tgt_mac[6];   //  00.00.00.00.00.00

uint8   tgt_ip[4];

uint8   trailer[18];    // 全部是0

}ARPMSG;

表3.1.1ARP信息結構

ARP應用程序可以設計成與W7100A驅動程序的Socket API中與UDP相關的應用程序接口(API)。表3.1.2為Socket API函數。

API 函數名

定義

socket

在MACRAW模式下打開socket

sendto

向目的端發送Ping請求

recvfrom

接收來自目的端的Ping回復

close

關閉Socket

表3.1.2Socket API函數

通過設定目標IP地址、端口號等等,可以實現ARP應用接收來自指定目的端的ARP回復。

void arp(SOCKETs, uint16 Port, uint8 SrcIp, uint8 SrcMac, uint8 TgtIp)

函數名 Arp
參數 S           – socket號

port        –發送/接收端口號

SrcIP      -源(發送端)IP地址

SrcMac    -源 (發送端) MAC地址

TgtIp      -目標IP地址

表3.1.3ARP函數

void send_request(SOCKET s, uint16 port, uint8 *SrcIp,uint8 *SrcMac, uint8 *TgtIp)

函數名 send_request
參數 s– socket號

port       –發送/接收端口號

SrcIP      – 源(發送端)IP地址

SrcMac    – 源(發送端) MAC地址

TgtIp      – 目標IP地址

表3.1.4send_request函數

 

void send_reply(SOCKET s, uint16 port, uint8 *SrcMac)

函數名 send_reply
參數 S           – 端口號

Port        –發送/接收端口號

SrcMac      -源(發送端) MAC地址

表3.1.5send_reply函數

圖3.1.1-2所示為簡單的ARP應用流程圖。ARP的請求和回復都是通過3.1節中所提到的函數來執行並且完成的。

o    調用ARP函數

要執行ARP函數,需要知道目標IP地址、源IP地址以及源MAC地址等參數。在設置ARP應用參數和網絡配置完成後,才可以執行ARP函數。ARP函數先在MACRAW模式下創建SOCKET0,然後根據第n-1個SOCKET狀態寄存器(Sn_SR)的狀態執行命令。例3.1.2所示為ARP函數的執行過程。

/* arp.c */

switch(getSn_SR(s))

{

case  SOCK_CLOSED:

close(s);                        // 關閉SOCEKT

socket(s,Sn_MR_MACRAW,aPort,0);//在MACRAW模式下打開SOCKET

break;

 

case  SOCK_MACRAW:

send_request () ;//處理ARP請求

recv_reply();//處理ARP回復

break;

default:           

break;

}

例3.1.2處理ARP函數

  ARP請求的處理過程

ARP請求處理進程是創建並且向目的端發送數據包的過程。Ping請求的處理過程如例3.1.3所示。當在設定數據包時,需要定義MAC地址、類型、目的(目標)端的有效載荷(Payload)、源端(發送端)的有效載荷(Payload)。在數據包的校驗和(checksum)計算完成之後,才能夠利用sendto()函數將ARP信息發送到廣播地址。

/* arp.c */

uint32 tip =  0xFFFFFFFF;

uint16 i =0;

for( i=0;  i<6 ; i++) {

pARPMSG.dst_mac[i]  = 0xFF;//BROADCAST_MAC[i];

pARPMSG.src_mac[i]  = SrcMac[i];//BROADCAST_MAC[i];

pARPMSG.sender_mac[i]  = SrcMac[i];//SOURCE_MAC[i];

pARPMSG.tgt_mac[i]  = 0;

}

pARPMSG.msg_type = htons(ARP_TYPE);

pARPMSG.hw_type   = htons(ETHER_TYPE);

pARPMSG.pro_type  = htons(PRO_TYPE);   // IP   (0x0800)

pARPMSG.hw_size   =  HW_SIZE;          // 6

pARPMSG.pro_size   = PRO_SIZE;          // 4

pARPMSG.opcode    =  htons(ARP_REQUEST); //要求(request) (0x0001), 回復(reply)(0x0002)

for( i=0;  i<4 ; i++) {

pARPMSG.sender_ip[i]  = SrcIp[i];//SOURCE_IP[i];

pARPMSG.tgt_ip[i]  = TgtIp[i];//TAGET_IP[i];

}

sendto(s,(uint8*)&pARPMSG,sizeof(pARPMSG),(uint8  *)&tip,port)

例3.1.3ARP請求的處理過程

   ARP回復的處理過程

例3.1.4所示為ARP回復的處理過程,該過程是通過在MACRAW模式下創建好的SOCKET0調用RECEVFROM()函數來接收RAW數據。如果接收的RAW數據類型和OPCODE分別為

ARP_TYPE(0x0806)和ARP Reply(0x02),將會顯示ARP信息。

 

/* arp.c */

/*接收來自對端的數據*/

len  = recvfrom(s,(uint8 *)data_buf,rlen,mac_destip,&mac_destport);

/*檢測TYPE 0x0806 */

if(  data_buf[12]==ARP_TYPE_HI && data_buf[13]==ARP_TYPE_LO ){

/*檢測ARP REPLY */

if(  ((aARPMSG->opcode) == ARP_REPLY  ) {

 

}else{     

未知信息

}

}

例 3.1.4ARP請求的處理過程

 

 

3.2  APR應用演示

在下載完成ARP應用的二進制文件後,按照下面的順序來確認iMCUW7100API中的數據包能夠實現ARP。(詳細的信息,請參考iMCUW7100 ISP用戶指南和iMCUW7100調試程序用戶指南)

 

1.    確認測試環境

o   利用UTP線直接連接PC測試機和iMCUW7100API

o   利用串口線直接連接PC測試機和iMCUW7100API

o   將5V電源適配器連接到PC測試機

2.    按照下面的流程確認PC測試機的網絡信息

o   源IP地址 : 192.168.0.2(取決於用戶的PC測試機)

o    網關IP地址 : 192.168.0.1

o    子網掩碼:255.255.255.0

3.在執行完串行終端機程序(超級終端機)後,如下進行性能設置:

          屬性

配置值

Bits Per second (波特率) 15200 bps (Max 230400bps)
數據位 8 Bits
停止位 1 Bits
串行校驗 None
流量控制 None

表3.2設置串行終端機程序

4. 打開iMCUW7100API的電源開關

– 在上電後確認iMCUW7100API的電源指示燈LED(D13)

 

圖3.2所示的為ARP應用的執行結果。結果顯示了W7100A(本地主機)的網絡信息以及來自目的端主機的ARP回復。

==============================================

       W7100   Net Config Information       

==============================================

MAC ADDRESS IP : 00.08.dc.00.00.00

SUBNET MASK  :  255.255.255.000

G/W IP ADDRESS : 192.168.001.001

LOCAL IP ADDRESS : 192.168.001.002

 

——-ARP_TEST_START——–

Destination IP  :  192.168.1.3

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

Who has 192.168.1.3 ?    Tell 192.168.1.2 ?

192.168.1.3  is  at  00.19.66.58.D1.C7

——-ARP_TEST_END——–

<圖3.2>ARP應用的執行結果

本篇文檔介紹完畢,明天繼續新的內容,多謝關注! 

想了解更多,請登錄我們的網站:http://www.iwiznet.cn/

官方博客:blog.iwiznet.cn
公共郵箱:[email protected]