02_W5500网络初始化

目录

1.如何与W5500通信?

2.SPI数据帧:

3.W5500寄存器:

 通用寄存器: 

Socket 寄存器区:

4.代码分析:

5.测试:


1.如何与W5500通信?

02_W5500网络初始化_第1张图片

        我们在W5500介绍中可以看到W5500支持SPI通信协议,如果对SPI通信协议还不太了解,请转SPI协议详解(图文并茂+超详细) - 知乎 (zhihu.com)

2.SPI数据帧:

W5500 SPI 数据帧包括了 16 位地址段的偏移地址, 8 位控制段和 N 字节数据段。 如图所示。
8 位控制段可以通过修改区域选择位 (BSB[4:0]) ,读 / 写访问模式位 (RWB) 以及 SPI工作模式位(OM[1:0]) 来重新定义。 区域选择位选择了归属于偏移地址的区域。
02_W5500网络初始化_第2张图片

3.W5500寄存器:

        W5500 有 1 个通用寄存器 8 个 Socket 寄存器区 ,以及对应每个 Socket 的收 / 发缓存区。
每个区域均通过 SPI 数据帧的区域选择位( BSB[4:0] )来选取。

 通用寄存器: 

02_W5500网络初始化_第3张图片

  MR (模式寄存器 - Mode Register)
GAR (网关 IP 地址寄存器 )
SUBR (子网掩码寄存器)
SHAR (源 MAC 地址寄存器 )
SIPR (源 IP 地址寄存器 )
INTLEVEL (低电平中断定时器寄存器)
IR (中断寄存器)
IMR (中断屏蔽寄存器)
SIR (Socket 中断寄存器)
SIMR (Socket 中断屏蔽寄存器)
RTR (重试时间值寄存器)
RCR (重试计数寄存器)
PTIMER (PPP 连接控制协议请求定时寄存器)
PMAGIC (PPP 连接控制协议幻数寄存器)
PHAR (PPPoE 模式下目标 MAC 寄存器 )
PSID (PPPoE 模式下会话 ID 寄存器 )
PMRU (PPPoE 模式下最大接收单元)
UIPR (无法抵达 IP 地址寄存器 )
UPORTR (无法抵达端口寄存器)
PHYCFGR (W5500 PHY 配置寄存器) 
VERSIONR (W5500 芯片版本寄存器 )

Socket 寄存器区:

02_W5500网络初始化_第4张图片

S n   _MR (Socket n 模式寄存器 )
S n _CR (Socket n 配置寄存器 )
S n _IR (Socket n 中断寄存器 )
S n _SR (Socket n 状态寄存器 )
S n _PORT (Socket n 源端口寄存器 )
S n _DHAR (Socket n 目的 MAC 地址寄存器 )
S n _DIPR (Socket 目标 IP 地址寄存器 )
S n _DPORT (Socket n 目标端口寄存器 )
S n _MSSR (Socket n-th 最大分段寄存器 )
S n _TOS (Socket IP 服务类型寄存器 )
S n _TTL (Socket IP 生存时间寄存器 )
S n _RXBUF_SIZE (Socket n 接收缓存大小寄存器 - Socket n RX Buffer Size Register)
S n _TXBUF_SIZE (Socket n 发送缓存大小寄存器 )
S n _TX_FSR (Socket n 空闲发送缓存寄存器 )
Sn_TX_RD (Socket n 发送读指针寄存器 )
S n _TX_WR (Socket n 发送写指针寄存器 )
Sn_RX_RSR (Socket n 空闲接收缓存寄存器 )
S n _RX_RD (Socket n 接收读指针寄存器 )
Sn_RX_WR (Socket n 接收写指针寄存器 )
Sn_IMR (Socket n 中断屏蔽寄存器 )
Sn_FRAG (Socket n 分段寄存器 )
Sn_KPALVTR (Socket 在线时间寄存器 )

4.代码分析:

例程:stm32+w5500:源代码获取:W5500EVB参考例程_TCP Server|TCP Client|UDP|HTTP|DHCP

主函数功能:系统时钟、SPI、USART、w5500配置信息初始化

int main(void)
{
	/***** MCU时钟初始化 *****/							  
	Systick_Init(72);				
	
	/***** GPIO、SPI初始化 *****/
	GPIO_Configuration();			
	WIZ_SPI_Init();					
	
	/***** 串口初始化 *****/
	USART1_Init(); 					
  	
	/***** 硬重启W5500 *****/
	Reset_W5500();
	
	/***** W5500的IP信息初始化 *****/
	set_default(); 
	set_network();						
		
	printf("W5500 Init Complete!\r\n");
    printf("Start Ping Test!\r\n");

	while(1)
	{}
}

我们主要分析set_network()函数:

set_network()函数主要的做的事:配置Mac地址、子网掩码、默认网关、IP地址,进行socket的rx和tx的缓冲区配置等。

void set_network(void)
{
    setSHAR(ConfigMsg.mac);/*配置Mac地址*/
    setSUBR(ConfigMsg.sub);/*配置子网掩码*/
    setGAR(ConfigMsg.gw);/*配置默认网关*/
    setSIPR(ConfigMsg.lip);/*配置Ip地址*/

    sysinit(txsize, rxsize); /*初始化8个socket*/

    setRTR(2000);/*设置溢出时间值*/
    setRCR(3);/*设置最大重新发送次数*/

    getSIPR (lip);
    printf(" IP : %d.%d.%d.%d\r\n", lip[0], lip[1], lip[2], lip[3]);
    getSUBR(sub);
    printf(" SN : %d.%d.%d.%d\r\n", sub[0], sub[1], sub[2], sub[3]);
    getGAR(gw);
    printf(" GW : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]);
}

我们只对setSHAR(ConfigMsg.mac) 这个函数进行分析,其他函数类似,都是通过spi协议向w5500寄存器写入/读出配置信息。

setSHAR函数原型:

void setSHAR(uint8 * addr  )/**< a pointer to a 6 -byte array responsible to set the MAC address. */
{
  wiz_write_buf(SHAR0, addr, 6);  
}

进入wiz_write_buf函数:

函数功能:将buf中的6字节数据依次写入SHAR0-SHAR5中,写入之前先要按照SPI数据帧格式发送寄存器地址以及读写方向

uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len)	// W5500将通过SPI获取的数据写入相关寄存器,并返回写入的数据长度
{
   uint16 idx = 0;																			// idx定义为正在写入的第几个数
   if(len == 0) printf("Unexpected2 length 0\r\n");			// 写入数据为空;len表示写入数据的长度
   IINCHIP_CSoff();                              				// CS=0, SPI数据帧开始
   IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);		// 地址段,提供16位偏移地址(0000 0000 0000 0000)
   IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);		// 控制段,共8位(0000 0000 高5位BSB位为00000表示通用寄存器)
   IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);    // 控制段+4(0000 0100 RWB位置1表示写入,OM位为00表示SPI工作模式为VDM)
   for(idx = 0; idx < len; idx++)                				// 数据段,写入数据值
   {
     IINCHIP_SpiSendData(buf[idx]);											// MCU通过SPI发送数据
   }
   IINCHIP_CSon();                               				// CS=1, SPI数据帧结束
   return len;  																				// 返回写入的数据长度值
}

5.测试:

我们在代码中配置好Mac地址、子网掩码、默认网关、IP地址就接入网络了,就可以使用电脑端的命令行中ping我们的w5500模块。

在测试之前需要检查我们给w5500配置的IP地址是否和我们电脑的以太网接口IP在一个网段内

我配置的w5500的IP等地址如下:

uint8 mac[6] = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11};
uint8 lip[4] = {192, 168, 10, 5};
uint8 sub[4] = {255, 255, 255, 0};
uint8 gw[4] = {192, 168, 10, 1};
uint8 dns[4] = {8, 8, 8, 8};

电脑以太网IP:

02_W5500网络初始化_第5张图片

让它们在一个网段内即可。然后ping 192.168.10.5即可,如下图:

02_W5500网络初始化_第6张图片

 表示已经成功连接网络。

01_W5500简介 <--------上一篇                                                                                                            下一篇--------->03_W5500TCP_Client

你可能感兴趣的:(W5500,网络)