STM32使用HAL库驱动W5500

2023-05-16

dba6ec103d6537e2453151b3302e55cb.jpeg

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

硬件设计

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

6513cbb662ad603ab0be6eafce8f1612.png

芯片采样SPI接口与单片机连接,再加上INT和RST引脚,共占用6个IO,其中INT引脚可以不用,RST一般需要连接。

网口可以使用带网络变压器的接口,或者网络变压器和接口独立的,都可以,这里使用的HR911105A是带网络变压器的。、

软件设计

W5500官方提供了一个完整的驱动库,可以使用户不必太关心底层寄存器的配置,使用起来非常方便。驱动库下载地址:

https://github.com/Wiznet/ioLibrary_Driver

接下来,使用STM32CubeMx软件初始化配置,主要是SPI配置如下:

94700c558a6332637d2f60c101a259b4.png

配置完成后,生成代码。然后将官方的驱动库添加到工程中。

下载完成后,可以看到,驱动库中包含了W5100、W5200等多个芯片的驱动:da13948c274b34a62ca4669c11196f27.png

我们只需将W5500文件夹下的.c文件以及socket.c和wizchip_conf.c文件添加到工程中即可。如下:cc048eb6f50b1cb69427d50503c63311.png

打开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;
    }
}

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

0372f440656bce5f941c0b4e0e207ee9.png

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

总结

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

推荐阅读:

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32使用HAL库驱动W5500 的相关文章

  • vs2010 webapi开发http请求以及website中如何实现http请求

    一 vs2010 webapi开发 第一步 xff1a 创建 第二步 xff1a 离线安装NuGet 1 复制链接到浏览器打开 xff1a http visualstudiogallery msdn microsoft com 27077b
  • 字节和bit的大小端简介

    C语言的位域虽然很多人强烈建议不要使用 xff0c 但现有系统里还广泛存在位域的使用 xff0c 所以还是很有必要理清楚的 对big endian和little endian的区别 xff0c 很多人认为是对多字节数据类型而言 其实 xff
  • C++ 数字与char*的转换

    目录 1 数字转char 1 1 sprintf1 2 itoa1 3 ltoa ultoa 2 char 转数字2 1 atoi2 2 atol2 3 atof2 4 strtol2 5 strtoul2 6 strtod 1 数字转ch
  • 【C语言】printf输出16进制: %x %02x %#x

    x即按十六进制输出 xff0c 英文字母小写 xff0c 右对齐 02X有以下变化 xff1a 英文字母变大写 xff0c 如果输出字符不足两位的 xff0c 输出两位宽度 xff0c 右对齐 xff0c 空的一位补0 超过两位的 xff0
  • 【c语言】结构体初始化4中方法

    今天在6轴传感器的驱动代码源文件中看到结构体没见过的写法 xff1a typedef struct uint8 t xlda 1 uint8 t gda 1 uint8 t tda 1 uint8 t not used 01 5 lsm6d
  • 【debug】stm32 指针奇数地址问题导致HardFault

    很久很久没有记录过debug了 xff0c 今天有空就正好记录一下 嵌入式开发 xff0c stm32F407的MCU的开发板 遇到如下问题 xff1a 变量的地址竟然为奇数 xff01 xff01 xff01 导致程序运行到写入该地址的数
  • 【Autosar】学习总结-BSW层

    一 简介 AUTOSAR AUTomotive Open Systems ARchitecture xff0c 汽车开放系统架构 1 优势 xff1a 有利于提高软件复用度 xff0c 尤其是跨平台的复用度 xff1b 便于软件的交换与更新
  • 【PWM】从stm32到pwm到OLED屏幕调光到晚上不要玩手机

    一 前言 最近做项目 xff0c 配置了单片机中PWM波形输出 xff0c 配置单片机中的一个引脚输出PWM波 xff0c 示波器查看这个波形 xff0c 做了实践操作 xff0c 有一些感想 xff0c 将一些了解过的知识和常识结合 xf
  • 算法提高 高精度加法

    1051 算法提高 高精度加法 时间限制 1 Sec 内存限制 256 MB 提交 5 解决 2 提交 状态 讨论版 题目描述 在C C 43 43 语言中 xff0c 整型所能表示的范围一般为 231到231 xff08 大约21亿 xf
  • 【Autosar】学习总结-MCAL

    一 简介 MCAL xff1a 微控制器抽象层 xff1b 位于BSW层中的最下层 xff1b MCAL细分 xff0c 可将驱动分为 xff1a 微控制器驱动 存储器驱动 通信驱动 IO驱动 xff1a 二 MCAL的配置 xff08 E
  • 【2022】年度总结

    一 月报 xff1a 1 一月 二月 初入新公司 xff0c 还在试用期 xff1b 进的外包安卓手机升级项目 xff0c 是一个短期的项目 xff0c 3 4个月左右 xff1b 第一次了解到外包项目原来是这种模式 xff1a 建立黄区
  • 【笔试总结 网络】IP地址分类 划分子网 子网掩码 (相关例题分析)

    xff08 最近做了很多春招公司笔试卷子 xff0c 发现很多是学过的东西 xff0c 看着很熟悉 xff0c 就是不会 很多学过的概念模棱两可 xff0c 这在笔试中很吃亏 说不会吧会点 xff0c 说会吧 xff0c 做不出来 就比如关
  • 网页登录时密码如何传输?

    今天突发奇想想看下一般网站登录时密码是如何传输的 首先是QQMail xff0c gmail xff0c 各大网上银行等对于我非常重要的登录网站 xff1a https https的安全性自然是很高 其次是通常的腾讯微博以及其他腾讯常用的网
  • C/C++中简单数据结构的对齐

    这里只讨论简单的数据结构 xff0c 从MSDN上的例子开始 struct x char a 1 byte int b 4 bytes short c 2 bytes char d 1 byte 在没有对齐的情况下 xff0c x 中的所有
  • yolo数据增强以及批量修改图片和xml名

    记录下打完标签对数据集进行扩增 xff0c 数据增强后的图片及标签名字进行修改 xff0c 重点在代码只需更改文件名就可使用 无论数据增强还是修改名称 xff0c 标签框位置都会跟着改变 xff01 xff01 xff01 前人之鉴 xff
  • 利用select实现服务器和客户端的随时收发

    服务器代码实现 xff1a include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt inclu
  • 采集温度数据,用串口传输到上位机

    这里写目录标题 一 实验要求二 I2C总线通信协议 xff08 一 xff09 概念 xff08 二 xff09 I2C总线特征 xff08 三 xff09 I2C总线协议 xff08 四 xff09 I2C的两种方式 硬件I2C和软件I2
  • rflysim基于simulink控制3.4:硬件在环仿真-e0-1实验

    一 实验1 xff1a Simulink代码自动烧录 要求 xff1a 将设计好的simulink模型 xff0c 生成固件烧录到Pixhawk中 步骤 xff1a 1 设计控制器 例程参考 xff1a e0 2 PSPOfficialEx
  • 如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该 指针在函数体内被意外修改...

    如果参数是指针 xff0c 且仅作输入用 xff0c 则应在类型前加 const xff0c 以防止该 指针在函数体内被意外修改 1 include lt iostream gt 2 3 run this program using the
  • 【ROS进阶】一文搞懂ROS话题通信机制与消息队列

    文章目录 一 话题通信机制解析1 话题通信机制简介2 消息队列分析3 使用技巧 二 实验验证 xff08 一 xff09 subscriber队列长度对数据传输影响 xff08 二 xff09 数据传输时间延迟 三 总结 一 话题通信机制解

随机推荐

  • stm32串口DMA方式发送数据

    该文档介绍stm32 uart1通过DMA方式发送和接收数据 xff0c 代码示例基于ucos ii操作系统 该文档参考https wenku baidu com view d44ef1380975f46526d3e1b5 html 中内容
  • opencv立体标定函数 stereoCalibrate()

    立体标定函数 nbsp stereoCalibrate nbsp nbsp stereoCalibrate nbsp 是用来标定一个立体摄像头的 也就是同时标定两个摄像头 标定的结果除了能够求出两个摄像头的内外参数矩阵 跟能够得出两个摄像头
  • postman好用的插件有哪些,给出实例和插件下载地址、使用方法

    postman好用的插件有哪些 xff0c 给出实例和插件下载地址 使用方法 Postman 是一个常用的高级 API测试工具 xff0c 也可以用来测试 Web 应用程序 它提供了许多内置的功能和工具 xff0c 同时还支持通过插件拓展其
  • STM32 HAL库实现多串口使用printf输出

    include lt stdlib h gt include lt stdio h gt include lt stdarg h gt 描述 xff1a HAL库实现多串口使用printf输出 参数 xff1a huart xff1a 对应
  • FIFO与DMA

    FIFO存储器是一个先入先出的双口缓冲器 xff0c 即第一个进入其内的数据第一个被移出 xff0c 其中一个存储器的输入口 xff0c 另一个口是存储器的输出口 主要有三个方面的作用 xff1a 1 xff09 对连续的数据流进行缓存 x
  • 两种常用压控电流源设计

    电流源是一种非常常用的电路 xff0c 如工业中4 20mA输出 xff0c LED恒流驱动 xff0c 以及一些传感器可能也需要恒流驱动等 本篇文章介绍两种常见的压控电流源电路的设计 废话不多说 xff0c 直接看图 xff1a 电路很简
  • 峰峰值-峰值-平均值-有效值之间有什么关系?

    首先 xff0c 这几个值一般针对交流信号说的 实际应用中 xff0c AD采集交流信号后 xff0c 可能需要各个值之间相互转换比较等 xff0c 就需要这几个值之间有什么关系 先说说这几个值的定义 峰峰值Vpp xff08 Peak t
  • 几种电平转换电路

    在电路设计时 xff0c 有时会遇到电压域不匹配的问题 xff0c 如芯片为1 8V供电 xff0c 而MCU为3 3V供电 这时候就需要进行电平转换才能通讯 今天就来介绍几种常用的电平转换电路 二 三极管单向电平转换 一些通讯模块 xff
  • STM32的串口硬件流控(RS232/RS485)

    流控的概念源于 RS232 这个标准 xff0c 在 RS232 标准里面包含了串口 流控的定义 RS232 中的 RS 是Recommend Standard 的缩写 xff0c 即 推荐标准 之意 xff0c 它并不像 IEEE 128
  • 头文件中写类的实现出现函数重复定义的问题

    先来做一个实验 xff0c 你在一个头文件中定义一个类 xff0c 然后把内中的一个函数的实现写在这个头文件当中 A test h ifndefine A TEST define A TEST class A void test void
  • 步进电机驱动代码

    步进电机简而言之就是能够通过输入脉冲的个数 xff0c 确定旋转的角位移 xff0c 一般用他来控制小车轮子的偏移角度等 步进电机由驱动芯片ULN2003驱动 xff0c 利用ULN2003与MCU引脚相连 xff0c 可以驱动步进电机 主
  • 全速下载百度云

    用CMD命令下载百度云的资源 听起来类似Linux或者我们在电影里常见的黑客下载数据 需要准备工具 xff1a Windows系统 xff08 我用的是Windows10 xff09 xff0c CMD命令行 xff0c BaiduPCS
  • 几种常用电流互感器采样电路

    我们知道 xff0c 采样电流信号最简单的方法就是通过采样电阻将电流信号转换为电压信号 xff0c 然后再进行放大 采样即可 直流信号一般都可以这样处理 xff0c 但是对于电流互感器出来的交流信号 xff0c 不能直接输入到单极性的AD进
  • 调试程序时怎样查看变量波形?看这里

    我们在调试单片机程序时 xff0c 经常会需要查看某个变量或数组的值 xff0c 一般情况下 xff0c 可以通过 Add xxx to Watch 来查看 xff0c 或直接查看内存 但有时候 xff0c 比如ADC采样时 xff0c 单
  • 几种常用的产生负电源的方法

    电源电路是电路设计的重要环节 xff0c 一般情况下 xff0c 单电源能实现功能的用单电源就行 xff0c 可选的方案很多 xff0c DC DC LDO等芯片很多 有时候 xff0c 单电源无法满足需求时 xff0c 就必须用到负电源
  • 盘点一些国产“有特点”的单片机

    自从芯片涨价潮以来 xff0c 国产芯片 xff0c 尤其是单片机类芯片犹如雨后春笋般发展起来 xff0c 其中也不乏一些优秀的产品 今天来盘点一下一些有特点的单片机 这里所说的单片机 xff0c 是指通用型的MCU xff0c 像ESP3
  • 不会写Bootloader?看这里,现成的

    前段时间要写一个BootLoader程序 xff0c 想起来好像在STM32的HAL库里面看到过相关的Demo xff0c 打算参考一下 打开相关的目录看了一下 xff0c 确实是有相关文件 xff1a 但是没找到工程文件 没办法 xff0
  • 一个IO挂多个按键怎么实现?

    有时候做设计时 xff0c 我们会遇到外部按键比较多 xff0c IO口不够用的情况 这时大部分人会考虑通过其它芯片扩展IO xff0c 或者直接换一个IO口足够的MCU 其实 xff0c 还有个方法可以实现一个IO上挂多个按键 即采用AD
  • SWM32系列教程8--SPI及其应用

    SPI接口是非常常用的一种数字外设 xff0c SWM32S单片机有2个SPI接口 xff0c 其特点如下 xff1a 全双工串行同步收发可编程时钟极性和相位支持 MASTER 模式和 SLAVE 模式MASTER 模式下最高传输速度支持主
  • STM32使用HAL库驱动W5500

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