Wiznet W5500以太网控制器应用笔记

引用数据手册的芯片介绍:“W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500 集成了TCP/IP 协议栈,10/100M 以太网数据链路层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。”

很多人都接触过ENC28J60这款网卡芯片,相比较而言W5500拥有自带的TCP/IP协议栈,而ENC28J60芯片只有PHY和MAC层,需要移植LwIP、uIP等网络协议栈才能连入网络,W5500自带的TCP/IP协议栈使得嵌入式处理器不用处理繁杂的网络协议栈事物,专注于应用程序的开发。但是W5500的协议种类支持不是很多,支持硬件 TCP/IP 协议:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE,应用层的协议都需要自己实现,这倒无妨,实现应用层的协议比实现传输层、网络层简单多了,只是应用层的协议种类实在是太多了。

下面介绍一下W5500芯片的一些操作笔记。

1、W5500的SPI工作模式有固定长度和可变长度两种模式。这两种模式的区分是在SPI master发送的SPI帧的控制段(见3)中规定的。

2、W5500的SPI支持SPI模式0和3,数据在SCLK的上升沿锁存,在下降沿输出。模式0和3的不同是非活动状态下SCLK的极性不同。

3、W5500的SPI通讯帧分为三段:地址段、控制端、数据段。
地址段表示的是16位偏移地址。
控制段指定了地址段中偏移地址的作用区域,读写访问方式以及SPI的工作模式(可变长度和固定长度)。
数据段的数据长度是根据控制段中数据长度来的,可以是可变长度也可以是固定长度(1/2/4字节)。
在可变数据长度模式下,SCSn控制SPI帧的开始和停止:
SCSn信号拉低(高电平到低电平),即代表W5500的SPI帧开始(地址段);
SCSn信号拉高(低电平到高电平),即代表W5500的SPI帧结束(数据段的随机N字节数据结尾)。

4、W5500的SPI数据帧包括了16位地址段的偏移地址,8位控制段和N字节的数据段,如下所示:
| 16bits Address | 8bits Control | N*8bits Data|
Control字段中高5位为区域选择位,用于指定16位偏移地址的作用域,如下表:
00000  选择通用寄存器
00001  选择Socket 0寄存器
00010  选择Socket 0发送缓存
00011  选择Socket 0接收缓存
00100  保留位
00101  选择Socket 1寄存器
00110  选择Socket 1发送缓存
00111  选择Socket 1接收缓存
01000  保留位
01001  选择Socket 2寄存器
01010  选择Socket 2发送缓存
01011  选择Socket 2接收缓存
01100  保留位
01101  选择Socket 3寄存器
01110  选择Socket 3发送缓存
01111  选择Socket 3接收缓存
10000  保留位
10001  选择Socket 4寄存器
10010  选择Socket 4发送缓存
10011  选择Socket 4接收缓存
10100  保留位
10101  选择Socket 5寄存器
10110  选择Socket 5发送缓存
10111  选择Socket 5接收缓存
11000  保留位
11001  选择Socket 6寄存器
11010  选择Socket 6发送缓存
11011  选择Socket 6接收缓存
11100  保留位
11101  选择Socket 7寄存器
11110  选择Socket 7发送缓存
11111  选择Socket 7接收缓存
第2位为读写控制位,0表示读,1表示写。低两位为工作模式位,00表示可变长度模式,01/10/11都表示固定长度模式,分别表示1/2/4字节的固定数据长度。

5、建议使用可变数据长度的模式,一则SPI可以多个设备共享,二来数据长度可变可以批量传输。

6、W5500有1个通用寄存器区,8个Socket寄存器区,以及对应每个Socket的收发缓存区。每一个Socket的收发缓存区都映射到32KB的物理内存中,接收缓存16KB,发送缓存16KB,每个Socket可以分配不同大小的收发缓存区,初始化每个Socket分配收发各2KB缓存。

7、通用寄存器区用于配置W5500的基本信息,例如IP地址和MAC地址。设置SPI帧的区域选择位选择到通用寄存器区即可访问通用寄存器区。

8、W5500拥有8个独立的Socket作为通讯信道,每个Socket有独立的寄存器区,同样在SPI帧的控制段中进行区域选择以访问哥哥Socket的寄存器区。Socket的各个寄存器名及缩写表如下:
Socket n Mode							(Sn_MR)
Socket n Command						(Sn_CR)
Socket n Interrupt						(Sn_IR)
Socket n Status							(Sn_SR)
Socket n Source Port					(Sn_PORT0) (Sn_PORT1)
Socket n Destination Hardware Address	(Sn_DHAR0)
										(Sn_DHAR1)
										(Sn_DHAR2)
										(Sn_DHAR3)
										(Sn_DHAR4)
										(Sn_DHAR5)
Socket n Destination IP Address			(Sn_DIPR0)
										(Sn_DIPR1)
										(Sn_DIPR2)
										(Sn_DIPR3)
Socket n Destination Port				(Sn_DPORT0) (Sn_DPORT1)
Socket n Maximum Segment Size			(Sn_MSSR0) (Sn_MSSR1)
Socket n IP TOS							(Sn_TOS) 
Socket n IP TTL							(Sn_TTL)
Socket n Receive Buffer Size			(Sn_RXBUF_SIZE)
Socket n Transmit Buffer Size			(Sn_TXBUF_SIZE) 
Socket n TX Free Size					(Sn_TX_FSR0)(Sn_TX_FSR1) 
Socket n TX Read Pointer				(Sn_TX_RD0) (Sn_TX_RD1)
Socket n TX Write Pointer				(Sn_TX_WR0) (Sn_TX_WR1)
Socket n RX Received Size				(Sn_RX_RSR0) (Sn_RX_RSR1)
Socket n RX Read Pointer				(Sn_RX_RD0) (Sn_RX_RD1)
Socket n RX Write Pointer				(Sn_RX_WR1)
Socket n Interrupt Mask					(Sn_IMR)
Socket n Fragment Offset in IP header	(Sn_FRAG0)(Sn_FRAG1)
Keep alive timer						(Sn_KPALVTR) 

9、配置每个Socket的收发缓存区的大小的时候不要使收缓存或者发缓存的总和超过16KB。每个Socket的收发缓存区都有独立的16位的寻址空间,0x0000到0xFFFF,这16位的地址会自动映射到16KB的物理内存中去。

10、

在W5500内部的寄存器中,多字节数据按照大端模式存放,例如Socket的源端口号寄存器假如当前端口为5000(0x1388),那么在地址0x0004和0x0005中存放的是0x13和0x88。

配置芯片的时候先设置通用寄存器Common Registers,这一块的寄存器主要配置网关、子网掩码、IP地址、中断屏蔽、PHY属性等。然后配置某个Socket的寄存器区域,Socket寄存器区域包含了该Socket的工作模式(TCP、UDP等)、源端口号、目标IP地址、目标端口号等,设置好这些参数之后操作配置寄存器Sn_CR用于打开Socket并连接到目标主机,通过获取状态寄存器Sn_SR可以得知当前Socket的状态如关闭、同步、连接等。

以Socket的TCP模式为例,在发送数据的时候需要按照下面的过程:

int writeSnTxBuff(u8 Sn,u8 *buff,int len)
{
	int tx_freesize;
	tx_freesize = spi_read_short(Sn_TX_FSR0(Sn));//获取当前发送缓冲区有效数据长度
	if(tx_freesize < len)
		return 1;
		
	u32 addr = spi_read_short(Sn_TX_WR0(Sn));//获取当前Socket的发送缓冲区写指针
	spi_write_frame(0x000010 | (Sn << 5) | (addr << 8),buff,len);//写入数据到发送缓冲区
	spi_write_short(Sn_TX_WR0(Sn),addr + len);//更新发送缓冲区写指针
	spi_write_byte(Sn_CR(Sn),Sn_CR_SEND);//执行发送命令
	
	return 0;
}

接受数据的时候按照下面的过程:

int readSnRxBuff(u8 Sn,u8 *buff)
{
	int rxsize = spi_read_short(Sn_RX_RSR0(Sn));//获取当前接受缓冲区有效数据长度
	if(rxsize)
	{
		u32 addr = spi_read_short(Sn_RX_RD0(Sn));//获取当前Socket接受缓冲区读指针
		spi_read_frame(0x000018| (Sn << 5) | (addr << 8),buff,rxsize);//读取接受缓冲区数据
		spi_write_short(Sn_RX_RD0(Sn),addr + rxsize);//更新读取缓冲区读指针
		spi_write_byte(Sn_CR(Sn),Sn_CR_RECV);//执行读取命令(使读指针有效)
	}
	return rxsize;
}

下面给一些基础的操作函数:

void spi_write_byte(u32 addr,u8 data)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_WRITE | CTRL_FDM1);
	
	SPIx_ReadWriteByte(data);
	
	CHIP_DESELECT();
}

void spi_write_short(u32 addr,u16 data)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_WRITE | CTRL_FDM2);
	
	SPIx_ReadWriteByte((u8)(data >> 8));
	SPIx_ReadWriteByte((u8)(data));
	
	CHIP_DESELECT();
}

void spi_write_word(u32 addr,u32 data)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_WRITE | CTRL_FDM4);
	
	SPIx_ReadWriteByte((u8)(data >> 24));
	SPIx_ReadWriteByte((u8)(data >> 16));
	SPIx_ReadWriteByte((u8)(data >> 8));
	SPIx_ReadWriteByte((u8)(data));
	
	CHIP_DESELECT();
}

void spi_write_frame(u32 addr,u8 *buff,u8 len)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_WRITE | CTRL_VDM);
	
	int i;
	for(i=0;i<len;i++)
	{
		SPIx_ReadWriteByte(buff[i]);
	}
	
	CHIP_DESELECT();
}

u8 spi_read_byte(u32 addr)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_READ | CTRL_FDM1);
	
	u8 data = SPIx_ReadWriteByte(0x00);
	
	CHIP_DESELECT();
	return data;
}

u16 spi_read_short(u32 addr)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_READ | CTRL_FDM2);
	
	u16 data;
	data = SPIx_ReadWriteByte(0x00) << 8;
	data |= SPIx_ReadWriteByte(0x00);
	
	CHIP_DESELECT();
	return data;
}

u32 spi_read_word(u32 addr)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_READ | CTRL_FDM4);
	
	u32 data;
	data = SPIx_ReadWriteByte(0x00) << 24;
	data |= SPIx_ReadWriteByte(0x00) << 16;
	data |= SPIx_ReadWriteByte(0x00) << 8;
	data |= SPIx_ReadWriteByte(0x00);
	
	CHIP_DESELECT();
	return data;
}

void spi_read_frame(u32 addr,u8 *buff,int len)
{
	CHIP_SELECT();
	
	SPIx_ReadWriteByte((u8)(addr >> 16));
	SPIx_ReadWriteByte((u8)(addr >> 8));
	
	SPIx_ReadWriteByte((u8)addr | CTRL_READ | CTRL_VDM);
	
	int i;
	for(i=0;i<len;i++)
	{
		buff[i] = SPIx_ReadWriteByte(0x00);
	}
	
	CHIP_DESELECT();
}

上述函数中的addr参数都是按照W5500的通讯格式来设置的,最低字节为控制字段,1、2字节为地址偏移,下面是一些常用寄存器地址的宏定义(参考例程):

#define MR                          (0x000000)
/**brief Gateway IP Register address*/
#define GAR0                        (0x000100)
#define GAR1                        (0x000200)
#define GAR2                        (0x000300)
#define GAR3                        (0x000400)
/**brief Subnet mask Register address*/
#define SUBR0                       (0x000500)
#define SUBR1                       (0x000600)
#define SUBR2                       (0x000700)
#define SUBR3                       (0x000800)
/**brief Source MAC Register address*/
#define SHAR0                       (0x000900)
#define SHAR1                       (0x000A00)
#define SHAR2                       (0x000B00)
#define SHAR3                       (0x000C00)
#define SHAR4                       (0x000D00)
#define SHAR5                       (0x000E00)
/**@brief Source IP Register address*/
#define SIPR0                       (0x000F00)
#define SIPR1                       (0x001000)
#define SIPR2                       (0x001100)
#define SIPR3                       (0x001200)
/**@brief set Interrupt low level timer register address*/
#define INTLEVEL0                   (0x001300)
#define INTLEVEL1                   (0x001400)
/**@brief Interrupt Register*/
#define IR                          (0x001500)
/**@brief Interrupt mask register*/
#define IMR                         (0x001600)
/**@brief Socket Interrupt Register*/
#define SIR                         (0x001700) 
/**@brief Socket Interrupt Mask Register*/
#define SIMR                        (0x001800)
/**@brief Timeout register address( 1 is 100us )*/
#define RTR0                        (0x001900)
#define RTR1                        (0x001A00)
/**@brief Retry count reigster*/
#define WIZ_RCR                     (0x001B00)
/**@briefPPP LCP Request Timer register  in PPPoE mode*/
#define PTIMER                      (0x001C00)
/**@brief PPP LCP Magic number register  in PPPoE mode*/
#define PMAGIC                      (0x001D00)
/**@brief PPP Destination MAC Register address*/
#define PDHAR0                      (0x001E00)
#define PDHAR1                      (0x001F00)
#define PDHAR2                      (0x002000)
#define PDHAR3                      (0x002100)
#define PDHAR4                      (0x002200)
#define PDHAR5                      (0x002300)
/**
 @brief PPP Session Identification Register
 */
#define PSID0                       (0x002400)
#define PSID1                       (0x002500)
/**@brief PPP Maximum Segment Size(MSS) register*/
#define PMR0                        (0x002600)
#define PMR1                        (0x002700)
/**@brief Unreachable IP register address in UDP mode*/
#define UIPR0                       (0x002800)
#define UIPR1                       (0x002900)
#define UIPR2                       (0x002A00)
#define UIPR3                       (0x002B00)
/**@brief Unreachable Port register address in UDP mode*/
#define UPORT0                      (0x002C00)
#define UPORT1                      (0x002D00)
/**@brief PHY Configuration Register*/
#define PHYCFGR                     (0x002E00)
/**@brief chip version register address*/
#define VERSIONR                    (0x003900)


#define Sn_TxB(ch)					(0x000008 + (ch<<5))
#define Sn_RxB(ch)					(0x000008 + (ch<<5))

/**@brief socket Mode register*/
#define Sn_MR(ch)                   (0x000008 + (ch<<5))
/**@brief channel Sn_CR register*/
#define Sn_CR(ch)                   (0x000108 + (ch<<5))
/**@brief channel interrupt register*/
#define Sn_IR(ch)                   (0x000208 + (ch<<5))
/**@brief channel status register*/
#define Sn_SR(ch)                   (0x000308 + (ch<<5))
/**@brief source port register*/
#define Sn_PORT0(ch)                (0x000408 + (ch<<5))
#define Sn_PORT1(ch)                (0x000508 + (ch<<5))
/**@brief Peer MAC register address*/
#define Sn_DHAR0(ch)                (0x000608 + (ch<<5))
#define Sn_DHAR1(ch)                (0x000708 + (ch<<5))
#define Sn_DHAR2(ch)                (0x000808 + (ch<<5))
#define Sn_DHAR3(ch)                (0x000908 + (ch<<5))
#define Sn_DHAR4(ch)                (0x000A08 + (ch<<5))
#define Sn_DHAR5(ch)                (0x000B08 + (ch<<5))
/**@brief Peer IP register address*/
#define Sn_DIPR0(ch)                (0x000C08 + (ch<<5))
#define Sn_DIPR1(ch)                (0x000D08 + (ch<<5))
#define Sn_DIPR2(ch)                (0x000E08 + (ch<<5))
#define Sn_DIPR3(ch)                (0x000F08 + (ch<<5))
/**@brief Peer port register address*/
#define Sn_DPORT0(ch)               (0x001008 + (ch<<5))
#define Sn_DPORT1(ch)               (0x001108 + (ch<<5))
/**@brief Maximum Segment Size(Sn_MSSR0) register address*/
#define Sn_MSSR0(ch)                (0x001208 + (ch<<5))
#define Sn_MSSR1(ch)                (0x001308 + (ch<<5))

#define Sn_PROTO(ch)                (0x001408 + (ch<<5))
/** @brief IP Type of Service(TOS) Register */
#define Sn_TOS(ch)                  (0x001508 + (ch<<5))
/**@brief IP Time to live(TTL) Register */
#define Sn_TTL(ch)                  (0x001608 + (ch<<5))
/**@brief Receive memory size reigster*/
#define Sn_RXMEM_SIZE(ch)           (0x001E08 + (ch<<5))
/**@brief Transmit memory size reigster*/
#define Sn_TXMEM_SIZE(ch)           (0x001F08 + (ch<<5))
/**@brief Transmit free memory size register*/
#define Sn_TX_FSR0(ch)              (0x002008 + (ch<<5))
#define Sn_TX_FSR1(ch)              (0x002108 + (ch<<5))
/**@brief Transmit memory read pointer register address*/
#define Sn_TX_RD0(ch)               (0x002208 + (ch<<5))
#define Sn_TX_RD1(ch)               (0x002308 + (ch<<5))
/**@brief Transmit memory write pointer register address*/
#define Sn_TX_WR0(ch)               (0x002408 + (ch<<5))
#define Sn_TX_WR1(ch)               (0x002508 + (ch<<5))
/**@brief Received data size register*/
#define Sn_RX_RSR0(ch)              (0x002608 + (ch<<5))
#define Sn_RX_RSR1(ch)              (0x002708 + (ch<<5))
/**@brief Read point of Receive memory*/
#define Sn_RX_RD0(ch)               (0x002808 + (ch<<5))
#define Sn_RX_RD1(ch)               (0x002908 + (ch<<5))
/**@brief Write point of Receive memory*/
#define Sn_RX_WR0(ch)               (0x002A08 + (ch<<5))
#define Sn_RX_WR1(ch)               (0x002B08 + (ch<<5))
/**@brief socket interrupt mask register*/
#define Sn_IMR(ch)                  (0x002C08 + (ch<<5))
/**@brief frag field value in IP header register*/
#define Sn_FRAG(ch)                 (0x002D08 + (ch<<5))
/**@brief Keep Timer register*/
#define Sn_KPALVTR(ch)              (0x002F08 + (ch<<5))

/* MODE register values */
#define MR_RST                       0x80 		/**< reset */
#define MR_WOL                       0x20 		/**< Wake on Lan */
#define MR_PB                        0x10 		/**< ping block */
#define MR_PPPOE                     0x08 		/**< enable pppoe */
#define MR_UDP_FARP                  0x02 		/**< enbale FORCE ARP */
/* IR register values */
#define IR_CONFLICT                  0x80 		/**< check ip confict */
#define IR_UNREACH                   0x40 		/**< get the destination unreachable message in UDP sending */
#define IR_PPPoE                     0x20 		/**< get the PPPoE close message */
#define IR_MAGIC                     0x10 		/**< get the magic packet interrupt */

/* Sn_MR values */
#define Sn_MR_CLOSE                  0x00     /**< unused socket */
#define Sn_MR_TCP                    0x01     /**< TCP */
#define Sn_MR_UDP                    0x02     /**< UDP */
#define Sn_MR_IPRAW                  0x03     /**< IP LAYER RAW SOCK */
#define Sn_MR_MACRAW                 0x04     /**< MAC LAYER RAW SOCK */
#define Sn_MR_PPPOE                  0x05     /**< PPPoE */
#define Sn_MR_UCASTB                 0x10     /**< Unicast Block in UDP Multicating*/
#define Sn_MR_ND                     0x20     /**< No Delayed Ack(TCP) flag */
#define Sn_MR_MC                     0x20     /**< Multicast IGMP (UDP) flag */
#define Sn_MR_BCASTB                 0x40     /**< Broadcast blcok in UDP Multicating */
#define Sn_MR_MULTI                  0x80     /**< support UDP Multicating */

 /* Sn_MR values on MACRAW MODE */
#define Sn_MR_MIP6N                  0x10     /**< IPv6 packet Block */
#define Sn_MR_MMB                    0x20     /**< IPv4 Multicasting Block */
//#define Sn_MR_BCASTB               0x40     /**< Broadcast blcok */
#define Sn_MR_MFEN                   0x80     /**< support MAC filter enable */

/* Sn_CR values */
#define Sn_CR_OPEN                   0x01     /**< initialize or open socket */
#define Sn_CR_LISTEN                 0x02     /**< wait connection request in tcp mode(Server mode) */
#define Sn_CR_CONNECT                0x04     /**< send connection request in tcp mode(Client mode) */
#define Sn_CR_DISCON                 0x08     /**< send closing reqeuset in tcp mode */
#define Sn_CR_CLOSE                  0x10     /**< close socket */
#define Sn_CR_SEND                   0x20     /**< update txbuf pointer, send data */
#define Sn_CR_SEND_MAC               0x21     /**< send data with MAC address, so without ARP process */
#define Sn_CR_SEND_KEEP              0x22     /**<  send keep alive message */
#define Sn_CR_RECV                   0x40     /**< update rxbuf pointer, recv data */

#ifdef __DEF_IINCHIP_PPP__
   #define Sn_CR_PCON                0x23      
   #define Sn_CR_PDISCON             0x24      
   #define Sn_CR_PCR                 0x25      
   #define Sn_CR_PCN                 0x26     
   #define Sn_CR_PCJ                 0x27     
#endif

/* Sn_IR values */
#ifdef __DEF_IINCHIP_PPP__
   #define Sn_IR_PRECV               0x80     
   #define Sn_IR_PFAIL               0x40     
   #define Sn_IR_PNEXT               0x20     
#endif

#define Sn_IR_SEND_OK                0x10     /**< complete sending */
#define Sn_IR_TIMEOUT                0x08     /**< assert timeout */
#define Sn_IR_RECV                   0x04     /**< receiving data */
#define Sn_IR_DISCON                 0x02     /**< closed socket */
#define Sn_IR_CON                    0x01     /**< established connection */

/* Sn_SR values */
#define SOCK_CLOSED                  0x00     /**< closed */
#define SOCK_INIT                    0x13     /**< init state */
#define SOCK_LISTEN                  0x14     /**< listen state */
#define SOCK_SYNSENT                 0x15     /**< connection state */
#define SOCK_SYNRECV                 0x16     /**< connection state */
#define SOCK_ESTABLISHED             0x17     /**< success to connect */
#define SOCK_FIN_WAIT                0x18     /**< closing state */
#define SOCK_CLOSING                 0x1A     /**< closing state */
#define SOCK_TIME_WAIT               0x1B     /**< closing state */
#define SOCK_CLOSE_WAIT              0x1C     /**< closing state */
#define SOCK_LAST_ACK                0x1D     /**< closing state */
#define SOCK_UDP                     0x22     /**< udp socket */
#define SOCK_IPRAW                   0x32     /**< ip raw mode socket */
#define SOCK_MACRAW                  0x42     /**< mac raw mode socket */
#define SOCK_PPPOE                   0x5F     /**< pppoe socket */

/* IP PROTOCOL */
#define IPPROTO_IP                   0        /**< Dummy for IP */
#define IPPROTO_ICMP                 1        /**< Control message protocol */
#define IPPROTO_IGMP                 2        /**< Internet group management protocol */
#define IPPROTO_GGP                  3        /**< Gateway^2 (deprecated) */
#define IPPROTO_TCP                  6        /**< TCP */
#define IPPROTO_PUP                  12       /**< PUP */
#define IPPROTO_UDP                  17       /**< UDP */
#define IPPROTO_IDP                  22       /**< XNS idp */
#define IPPROTO_ND                   77       /**< UNOFFICIAL net disk protocol */
#define IPPROTO_RAW                  255      /**< Raw IP packet */

/**
 @brief Keep Timer register
 */
#define Sn_KPALVTR(ch)              (0x002F08 + (ch<<5))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值