Wiznet makers

ronpang

Published July 31, 2024 ©

125 UCC

10 WCC

32 VAR

0 Contests

1 Followers

0 Following

Original Link

02_W5500 Network Initialization

02_W5500 Network Initialization

COMPONENTS Hardware components

WIZnet - W5500

x 1


PROJECT DESCRIPTION

目录

1.如何与W5500通信?

2.SPI数据帧:

3.W5500寄存器:

通用寄存器:

Socket 寄存器区:

4.代码分析:

5.测试:

1.如何与W5500通信?


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

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

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


 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 寄存器区:


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:

 

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

 

表示已经成功连接网络。
————————————————

                           版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                       
原文链接:https://blog.csdn.net/weixin_46364710/article/details/134778584

Documents
Comments Write