目录
1.如何与W5500通信?
2.SPI数据帧:
3.W5500寄存器:
通用寄存器:
Socket 寄存器区:
4.代码分析:
5.测试:
1.如何与W5500通信?
我们在W5500介绍中可以看到W5500支持SPI通信协议,如果对SPI通信协议还不太了解,请转SPI协议详解(图文并茂+超详细) - 知乎 (zhihu.com)
2.SPI数据帧:
3.W5500寄存器:
通用寄存器:
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即可,如下图:
表示已经成功连接网络。
01_W5500简介 <--------上一篇 下一篇--------->03_W5500TCP_Client