芯片采样SPI接口与单片机连接,加上INT和RST引脚,总共占用6个IO。可以使用INT引脚,但一般需要连接RST。
网络端口可以使用带有网络变压器的接口,或者网络变压器和接口可以是独立的。这里使用的HR911105A带有网络变压器。
软件设计
W5500官方提供了完整的驱动库,让用户不用过多担心底层寄存器的配置,使用起来非常方便。驱动库下载地址:
https://github.com/Wiznet/ioLibrary_Driver
首先使用STM32CubeMx软件进行初始化配置,主要SPI配置如下
配置完成后,生成代码。然后将官方驱动库添加到项目中。
下载完成后可以看到驱动库中包含了W5100、W5200等芯片的驱动:
我们只需要将W5500文件夹中的.c文件以及socket.c和wizchip_conf.c文件添加到项目中即可。如下:
打开wizchip_conf.c文件,可以看到里面定义了一些SPI片选和读写函数,但是内容是空的,这些需要我们自己实现。我们直接在文件中添加如下程序来实现芯片的复位和参数初始化功能。
wiz_NetInfo gWIZNETINFO={ .mac={0x78,0x83,0x68,0x88,0x56,0x72},ip={192, 168, 0,72},sn={255,255,255,0},gw={192, 168 ,0,1},dns={180,76,76,76},dhcp=NETINFO_DHCP};//W5500复位void W5500_RESET(void){ W5500_REST_L;//HAL_Delay(50); W5500_REST_H;//HAL_Delay( 50);}//初始化芯片参数void ChipParametersConfiguration(void){ uint8_t tmp; uint8_t memsize[2][8]={{2,2,2,2,2,2,2,2},{2,2 ,2,2,2,2,2,2}}; if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize)==-1) { while(1); } do{ if(ctlwizchip(CW_GET_PHYLINK, (void* )tmp)==-1) { while(1); } }while(tmp==PHY_LINK_OFF);}//初始化网络参数mac ip等void NetworkParameterConfiguration(void) //初始化WIZCHIP中要用到的网络信息{ uint8_t tmpstr[6]; ctlnetwork(CN_SET_NETINFO, (void*)gWIZNETINFO); ctlnetwork(CN_GET_NETINFO, (void*)gWIZNETINFO); ctlwizchip(CW_GET_ID,(void*)tmpstr);}//W5500初始化void W5500_ChipInit(void){ W5500_RESET(); reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册关键函数reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); //注册SPI片选函数reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册SPI读写函数ChipParametersConfiguration();//初始化芯片NetworkParameterConfiguration();//初始化网络参数配置MAC IP等}其中W5500_ChipInit初始化函数中注册的SPI相关函数定义如下:
void SPI_WriteByte(uint8_t TxData){ uint8_t 数据; HAL_SPI_TransmitReceive(hspi1,TxData,data,1,100);}uint8_t SPI_ReadByte(void){ uint8_t data[2]={0xFF,0xFF}; HAL_SPI_TransmitReceive(hspi1,数据,数据+1, 1,100); return data[1];}void SPI_CrisEnter(void){ __set_PRIMASK(1);}void SPI_CrisExit(void){ __set_PRIMASK(0);}void SPI_CS_Select(void){ W5500_CS_L;}void SPI_CS_Deselect(void){ W5500_CS_H ;} 之后添加完成,调用W5500_ChipInit();直接在main函数中完成初始化。初始化完成后,即可实现通过TCP、UDP等方式的通信。以TCP客户端程序为例,如下。程序比较简单,就不做详细分析了。
无效do_tcpc(void){ uint16_t Len; Net_Status=getSn_SR(0); switch(Net_Status) /*获取套接字的状态*/{ case SOCK_CLOSED: /*套接字已关闭*/socket(0,Sn_MR_TCP,8123,Sn_MR_ND);休息; case SOCK_INIT: /*socket 处于初始化状态*/connect(0,Parameters.ServerIP,Parameters.ServerPort);/*socket 连接到服务器*/break; case SOCK_ESTABLISHED: /*socket 处于连接建立状态*/if(getSn_IR(0 ) Sn_IR_CON) { setSn_IR(0, Sn_IR_CON); /*清除接收中断标志*/} Len=getSn_RX_RSR(0); /*获取接收到的数据长度*/if(Len0) //接收到的数据{ recv(0 ,RevBuf,Len); /*从服务器接收数据*/send(0,RevBuf,Len); //返回服务器}break; case SOCK_CLOSE_WAIT: /*socket 等待关闭*/close(0);休息;另外,官网还有很多其他的应用例程可供参考,非常实用:
链接:https://www.w5500.com/code.html
标签:
用户评论
刚刚开始学STM32和W5500,这篇文章太及时了!HAL库的使用方法真的很详细。
有12位网友表示赞同!
HAL库确实比直接操作寄存器方便多了,W5500的驱动也很有帮助。
有6位网友表示赞同!
这篇文章让我对STM32和W5500的配合有了更深的理解,感谢分享!
有8位网友表示赞同!
用HAL库驱动W5500,稳定性是不是更好?我已经迫不及待想试试了。
有15位网友表示赞同!
HAL库的API设计得真好,学起来不费力,这篇教程也写得很好。
有18位网友表示赞同!
之前一直觉得STM32和W5500有点难上手,现在看了这个教程,感觉容易多了。
有5位网友表示赞同!
HAL库的驱动代码简洁易懂,对初学者来说是个福音。
有10位网友表示赞同!
我之前遇到过HAL库和W5500通信不稳定的问题,这篇文章可能帮到我。
有17位网友表示赞同!
用STM32和W5500做项目,HAL库真的能让开发更高效。
有16位网友表示赞同!
这篇文章让我对HAL库有了新的认识,感觉之前的开发方式太原始了。
有8位网友表示赞同!
HAL库驱动W5500,安全性也有保障吧?毕竟HAL库是官方认证的。
有15位网友表示赞同!
看了这个教程,我对STM32的硬件编程更有信心了。
有19位网友表示赞同!
W5500在HAL库下的配置过程有点复杂,希望能有更详细的教程。
有11位网友表示赞同!
HAL库的驱动代码是不是可以复用到其他项目中?
有17位网友表示赞同!
STM32和W5500的结合,HAL库的使用真是如虎添翼。
有5位网友表示赞同!
HAL库的驱动代码规范,对团队协作很有帮助。
有10位网友表示赞同!
我之前遇到过HAL库和W5500通信不稳定的问题,这篇文章可能帮到我。
有16位网友表示赞同!
用STM32和W5500做项目,HAL库真的能让开发更高效。
有13位网友表示赞同!
HAL库的API设计得真好,学起来不费力,这篇教程也写得很好。
有13位网友表示赞同!