這篇文檔將會介紹如何使用W7100A中實現MACRAW。MACRAW是一個低於IP層的乙太網MAC通信,它能夠靈活使用目的主機的上層協定。W7100A是全硬體的TCP/IP協定棧晶片,它不僅包括OSI的4層,還包括4層之外的應用層。因此,W7100A能夠簡單且穩定地應用於嵌入式互聯網中。
      在第一章簡單介紹下MACRAW模式,第二章介紹MACRAW SOCKET,第三章則是ARP(位址解析通訊協定)。希望對大家有所幫助。
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
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相似的互联网协议。具体的详细信息,请参考官网。
<图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)
| 
/*向指定的目的端发送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.3  接收(RECEIVE)
| /* 检测接收到的数据*/ //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 (地址解析协议)
| 
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实现
| 
#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回复。
| 函数名 | 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函数
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.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应用的执行结果
本篇文檔介紹完畢,明天繼續新的內容,多謝關注!


 
没有评论:
发表评论