W5500 芯片是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,为单片机提供了更加简单、快速、稳定、安全的以太网接入方案。采用标准4线SPI接口,理论速率上可以达到 80MHz。

硬件设计

原理图如下,需要注意的是R12~R17几个电阻是模式选择,根据实际需求选择焊接哪些。

芯片采样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)  //Intialize the network information to be used in 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 data;HAL_SPI_TransmitReceive(&hspi1,&TxData,&data,1,100);
}uint8_t SPI_ReadByte(void)
{     uint8_t data[2]={0xFF,0xFF};HAL_SPI_TransmitReceive(&hspi1,data,data+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();即可完成初始化。初始化完成后,可以实现TCP、UDP等的通讯,以TCP客户端程序为例,程序如下。程序比较简单,就不做详细分析了。

void do_tcpc(void)
{uint16_t Len;Net_Status = getSn_SR(0);switch(Net_Status)                  /*获取socket的状态*/{case SOCK_CLOSED:                   /*socket处于关闭状态*/socket(0,Sn_MR_TCP,8123,Sn_MR_ND);break;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(Len>0)  //接收到数据{recv(0,RevBuf,Len);     /*接收来自Server的数据*/send(0,RevBuf,Len);    //返回给服务器}break;case SOCK_CLOSE_WAIT:        /*socket处于等待关闭状态*/close(0);break;}
}

另外,官网还有很多其它应用的例程可供参考,非常实用:

链接:https://www.w5500.com/code.html

总结

对于大多数内部没有以太网控制器的单片机来说,W5500是个很不错的选择。即使是带有以太网控制器的单片机,如STM32F407系列,也需要外部的PHY芯片才行,而且占用IO多,还需要移植软件协议栈,软件上更复杂一些。

推荐阅读:

一个IO挂多个按键怎么实现?

不会写Bootloader?看这里,现成的!

GD32使用ST的HAL库和GD官方库的一些体会

几种RS485隔离通讯的方案介绍

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

STM32使用HAL库驱动W5500相关推荐

  1. STM32使用HAL库驱动SDRAM

    1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...

  2. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  3. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  4. STM32用HAL库移植LORA(SX1276)的2.1版本驱动教程

    网上多数是STM32标准库LORA驱动2.0.0的例程,在此小编移植STM32的HAL库2.1.0版本LORA驱动,,但是有丢包现象需要调节参数,用的模块是安信可Ra-01 SX1278 LoRa,如 ...

  5. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  6. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  8. 【STM32】HAL库 ——DAC

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  9. STM32的HAL库及其使用

    随着时代的逐步发展,联网.USB.文件系统.加密算法.RTOS.GUI等第三方组件变得越来越重要,简陋的标准库已经很难满足当代单片机开发需求了. 事实上,单片机开发在走PC.手机等以CPU为核心的产品 ...

  10. STM32的HAL库分析及使用

    STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...

最新文章

  1. Apache工具类ToStringBuilder用法简介
  2. MAC 默认python3
  3. Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
  4. 【转】C++ 存储类
  5. Project Life Cycle
  6. 话说 Oracle ACE 这回事儿
  7. Android 修改字体,跳不过的 Typeface
  8. Flash Player离线安装包下载指南
  9. php新浪博客模板,supersite php模板
  10. 投影技术的分类与应用
  11. Flux、Mono、Reactor 实战(史上最全)
  12. svg元素 标签增加、移除class名
  13. 大数据分布式数据库系统介绍
  14. 二层交换机VLAN基础配置
  15. php重载求圆锥体积,编写一函数文件,实现求一个圆锥体的体积。
  16. 参考文献名称怎么复制_[Zotero+Word]Zotero+Word2016参考文献中英文混排,解决et al和等的问题...
  17. 罗德里格斯公式 理解、推导
  18. 面对一切,我们要坦然
  19. 冲量在线要做数据流通基础设施服务商
  20. 剑灵力士卡刀ahk_剑灵召唤一键卡刀代码使用图文教程

热门文章

  1. ArrayList LinkedList
  2. 树莓派linux虚拟键盘,树莓派raspbian安装matchbox-keyboard虚拟键盘
  3. 2021 年最佳开源软件榜单出炉
  4. zigbee协议栈学习(0)
  5. 在 Linux 下建立 FTP 搜索引擎
  6. matlab程序设计课件,《MATLAB程序设计》PPT课件.ppt
  7. 计算机导论高清课件教程,计算机导论-PPT课件
  8. 大话数据结构 - 串
  9. 清华大学2008年硕士生招生参考书目录
  10. Python的张量运算