传感器模块编程实践(二)W5500 SPI转以太网模块简介及驱动源码

文章目录

    • 一.概要
    • 二.W5500芯片介绍
      • W5500通讯协议介绍
    • 三.W5500模块介绍
    • 四.W5500模块原理图
    • 五.W5500以太网模通讯实验
    • 六.CubeMX工程源代码下载
    • 七.小结

一.概要

我们介绍过单片机的以太网系统一般是由:单片机+MAC+PHY+RJ45。有些单片机比如STM32F407VET6芯片内部自带MAC,STM32F407VET6+PHY(LAN8720)+RJ45就能组成以太网系统,但比如常见的STM32F103C8T6单片机是不带MAC控制器,需要组成以太网系统,就不能采用STM32F407的方式。

STM32F103C8T6+W5500芯片(SPI转以太网)+RJ45就能很好组成以太网系统。W5500 是一款全硬件 TCP/IP嵌入式以太网控制器,集成PHY和MAC带硬件TCP/IP协议栈,为嵌入式系统提供了更加简易的互联网连接方案, 使用硬件逻辑门电路实现, TCP/IP 协议栈的传输层及网络层(如:TCP,UDP,ICMP,IPV4ARP, IGMP.PPPoE 等协议),并集成了数据链路层,物理层,以及 32K字节片上 RAM 作为数据收发缓存。使得单片机只需承担TCP/P 应用层控制信息的处理任务。从而大大节省了单片机对于数据复制、协议处理和中断处理等方面的工作量,提升了系统利用率及可靠性。
W5500模块集成了个硬件 TCP/IP 协议栈芯片 W5500 以及1个含有网络变压器的 RJ45(HR911105A)。
本文介绍了 W5500芯片以及W5500模块,并通过STM32F103C8T6单片机驱动W5500模块实现TCP/IP数据通讯。

在这里插入图片描述

二.W5500芯片介绍

W5500芯片是WIZnet公司出品的全硬件 TCP/IP 协议栈支持 TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 协议。W5500 内嵌 32K 字节片上缓存以供以太网包处理。如果你使用 W5500, 你只需要一些简单的 Socket 编程就能实现以太网应用。这将会比其他嵌入式以太网方案 更加快捷、简便。用户可以同时使用 8 个硬件 Socket 独立通讯。
W5500 提供了 SPI(串行外部接口)作为外设主机接口,共有 SCSn, SCLK, MOSI, MISO 4 路信
号,且作为 SPI 从机工作。 W5500 的使用了新的高效 SPI 协议支持 80MHz 速率,从而能够更好的实现高速网络通讯。 为了减少系统能耗,W5500 提供了网络唤醒模式(WOL)及掉电模式供客户选择使用。

在这里插入图片描述

W5500特点:

支持硬件 TCP/IP 协议:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
支持 8 个独立端口(Socket)同时通讯
支持掉电模式
支持网络唤醒
支持高速串行外设接口(SPI 模式 0,3)
内部 32K 字节收发缓存
内嵌 10BaseT/100BaseTX 以太网物理层(PHY)
支持自动协商(10/100-Based 全双工/半双工)
不支持 IP 分片
3.3V 工作电压,I/O 信号口 5V 耐压;
LED 状态显示(全双工/半双工,网络连接,网络速度,活动状态)
48 引脚 LQFP 无铅封装(7x7mm, 0.5mm 间距)

基于W5500芯片组成的基本以太网设备
在这里插入图片描述

W5500通讯协议介绍

W5500与单片机采用SPI数据格式进行通讯
W5500的SPI帧分为 3 段:地址段,控制段,数据段,如下图所示。

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

地址段
地址段为 W5500 的寄存器或 TX/RX 缓存区指定了 16 位的偏移地址。 这 16 位偏移地址的值来自
于从最高标志位到最低标志位的顺序传输。 SPI 数据帧的数据段(2/4/N 字节)通过偏移地址自增(每传输 1 字节偏移地址加 1) 支持连续数据读/写。

控制段
控制段指定了地址段设定的偏移区域的归属,读/写访问模式以及 SPI 工作模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在 VDM 模式下(可变数据长度模式 Variable Data Length Mode),SPI 数据帧的长度被外设主机控制的 SCSn 所定义。这就意味着数据 段长度根据 SCSn 的控制,可以是一个随机值(从 1 字节到 N 字节任何长度均可),在 VDM 模式下,OM[1:0]位必须为‘00’。

数据段
在 SPI 工作模式位 OM[1:0]设定了控制端之后,数据段被设定为 2 种长度类型:1 种为可变的 N 字
节长度(可变数据长度模式),另以一种为确定的 1/2/4 字节长度(固定数 据长度模式)。 此时,1 字节数据从最大标志位到最小标志位,通过 MOSI 或者 MISO 信号传输。

VDM 模式下SPI写时序

SPI 的MODE0和MODE3唯一不同的就是在非活动状态下, SCLK 信号的极性,我们一般都采用空闲下是低电平,就是STM32 SPI协议中CPOL为0,CPHA为0,所以默认采用MODE0方式。
在这里插入图片描述

VDM 模式下SPI读时序
在这里插入图片描述

三.W5500模块介绍

W5500模块集成了个W5500芯片以及1个含有网络变压器的 RJ45(HR911105A)。
W5500模块可以使用杜邦线与STM32F103C8T6开发板连接,其中W5500模块引脚丝印可在模块正面看到。

在这里插入图片描述

在这里插入图片描述

STM32单片机板子与W5500模块通过7根杜邦线相连
板子GND----模块GND
板子5V-------模块5V
板子PB12—模块SCS
板子PB13—模块SCLK
板子PB14—模块MISO
板子PB15—模块MOSI
板子PA8-----模块RST

四.W5500模块原理图

在这里插入图片描述

五.W5500以太网模通讯实验

硬件准备:

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口,开发板通过杜邦线接W5500模块,W5500模块通过网线接电脑网口。

在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述

PA8,PB12配置成GPIO输出
在这里插入图片描述

SPI2引脚配置以及速度配置
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

在这里插入图片描述

配置IP地址等信息,确保板子的IP地址,电脑IP地址在同一网关内
在这里插入图片描述

两个GPIO控制引脚进行相应配置
在这里插入图片描述

SPI读写函数调用换成HAL库
在这里插入图片描述

调用W5500初始化,以及数据收发函数,实现数据通讯
在这里插入图片描述

主要代码

uint8_t  remote_ip[4]={192,168,1,15};									/*远端IP地址*///服务器IP地址,电脑网口的IP地址
uint8_t  Gateway_ip[4]={192,168,1,1};										/*网关地址*/
uint8_t  Board_ip[4]={192,168,1,55};										/*板子IP地址*/ //上述三个IP地址需配置正确///uint16_t local_port=8888;	                    							/*定义本地端口*///可以固定成8888,实验时候不需要改
uint16_t remote_port=8888;													/*远端端口号*/ //服务器的端口号,可以固定成8888,实验时候不需要改#define W5500_NSS_Pin GPIO_PIN_12
#define W5500_NSS_GPIO_Port GPIOB
#define W5500_RES_Pin GPIO_PIN_8
#define W5500_RES_GPIO_Port GPIOA
#define W5500_RES_High()	  HAL_GPIO_WritePin(W5500_RES_GPIO_Port,W5500_RES_Pin,GPIO_PIN_SET)   // /*W5500的RESET管脚*/
#define	W5500_RES_Low()	    HAL_GPIO_WritePin(W5500_RES_GPIO_Port,W5500_RES_Pin,GPIO_PIN_RESET)// /*W5500的RESET管脚*/
#define W5500_NSS_High()	  HAL_GPIO_WritePin(W5500_NSS_GPIO_Port,W5500_NSS_Pin,GPIO_PIN_SET)  ///*W5500的片选管脚*/
#define	W5500_NSS_Low()	    HAL_GPIO_WritePin(W5500_NSS_GPIO_Port,W5500_NSS_Pin,GPIO_PIN_RESET) ///*W5500的片选管脚*//
//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配置等
}
//SPI发送1字节
void SPI_WriteByte(uint8_t TxData)
{                uint8_t data;HAL_SPI_TransmitReceive(&hspi2,&TxData,&data,1,100);
}//SPI接收1字节
uint8_t SPI_ReadByte(void)
{     uint8_t data[2]={0xFF,0xFF};HAL_SPI_TransmitReceive(&hspi2,data,data+1,1,100);return data[1];
}int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,72M系统主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();//复位管脚,片选管脚初始化MX_SPI2_Init();//初始化SP2引脚,PB13,PB14,PB15/* USER CODE BEGIN 2 */W5500_ChipInit(); //芯片初始化/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Net_Status = getSn_SR(SOCK_TCPC);switch(Net_Status)                  /*获取socket的状态*/{case SOCK_CLOSED:                   /*socket处于关闭状态*/socket(SOCK_TCPC,Sn_MR_TCP,local_port,Sn_MR_ND);break;case SOCK_INIT:                      /*socket处于初始化状态*/connect(SOCK_TCPC,remote_ip,remote_port);/*socket连接服务器*/break;case SOCK_ESTABLISHED:               /*socket处于连接建立状态*/if(getSn_IR(SOCK_TCPC) & Sn_IR_CON) {setSn_IR(SOCK_TCPC, Sn_IR_CON);      /*清除接收中断标志位*/}Len=getSn_RX_RSR(SOCK_TCPC);            /*获取接收的数据长度*/if(Len>0)  //接收到数据{recv(SOCK_TCPC,RevBuf,Len);     /*接收来自Server的数据*/					send(SOCK_TCPC,RevBuf,Len);    //接收到的数据返回给服务器}else{send(SOCK_TCPC,TEST_buff,sLen);    //发送默认的数组HAL_Delay(1000);//等待1000ms}break;case SOCK_CLOSE_WAIT:        /*socket处于等待关闭状态*/close(SOCK_TCPC);break;}}/* USER CODE END 3 */
}

实验效果:

IP,端口都配置完成后,网线连接上电脑后,电脑TCP上位机打开服务器模式,就能接收到数据
在这里插入图片描述

六.CubeMX工程源代码下载

通过网盘分享的文件:W5500以太网模块通信实验(HAL库).rar
链接: https://pan.baidu.com/s/150GohcZUoWHk0-gcq9HbkA 提取码: 5cqi
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

七.小结

W5500模块只需要一些简单的 Socket 编程就能实现以太网通讯,适合STM32F103单片机实现以太网相关应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555098.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

windows下载Redis

1.下载地址 Releases tporadowski/redis GitHub 下载后,将压缩包解压到你的文件夹即可。(此时,redis已经完成安装) 2.使用 2.1双击redis.server.exe即可启动(启动redis服务端)(或者在当前目…

超声波清洗机什么牌子值得入手?推荐四款入手不亏的眼镜清洗机

在当今这个注重细节完美的时代,超声波清洗机凭借其卓越的清洁效率、深层渗透力及细腻的清洗效果,迅速赢得了家庭与专业场景的青睐。无论是精细的珠宝、眼镜框,还是金属装饰品、电子设备乃至医疗器具,超声波技术都能精准祛除隐秘处…

0110 Redis缓存的更新策略

在很多高并发的场景如秒杀系统,QPS会瞬时暴增,如果采用直接读写数据库(如MySQL)的方式,很可能会将数据库打垮。因此这种场景需要引入Redis做缓存,应对高并发的访问。但同时也会引入新的风险,最常…

数据结构——List接口

文章目录 一、什么是List?二、常见接口介绍三、List的使用总结 一、什么是List? 在集合框架中,List是一个接口,通过其源码,我们可以清楚看到其继承了Collection。 Collection 也是一个接口,该接口中规范了后…

华为 HCIP-Datacom H12-821 题库 (31)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1. 默认情况下,IS-IS Level-1-2 路由器会将 Level-2 区域的明细路由信息发布到Lev…

Python入门--函数

目录 1. 函数介绍 2. 函数的定义 3. 函数的参数 4. 函数的返回值 5. 函数说明文档 6. 函数的嵌套调用 7. 函数的作用域 (1). 局部变量 (2). 全局变量 (3). global关键字 1. 函数介绍 函数:是组织好的,可重复使用的,用来实现特定功能…

YOLO-V7 二元分类器

在评估二元分类器性能时,TP、FP、TN和FN是四个核心指标,它们分别代表真阳性、假阳性、真阴性和假阴性。以下是这些指标的定义、计算方法以及在实际应用中的意义: 定义 TP(真阳性):模型正确预测为正类且实…

Yocto - 使用Yocto开发嵌入式Linux系统_06 掌握Bitbake工具

Grasping the BitBake Tool 在上一章中,我们了解了元数据、元数据集合概念以及 conf/layer.conf 的重要性。在本章中,我们将更深入地研究元数据,了解配方如何相互依赖,并了解 BitBake 如何处理依赖关系。 In the previous chapter…

k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载

目录 1 MetailLB 搭建 1.1 MetalLB 的作用和原理 1.2 MetalLB功能 1.3 部署 MetalLB 1.3.1 创建deployment控制器和创建一个服务 1.3.2 下载MealLB清单文件 1.3.3 使用 docker 对镜像进行拉取 1.3.4 将镜像上传至私人仓库 1.3.5 将官方仓库地址修改为本地私人地址 1.3.6 运行清…

【路径规划】多机器人路径规划

摘要 多机器人路径规划在现代自动化、仓储管理及智能交通系统中有着广泛的应用。本文提出了一种基于A*算法的多机器人路径规划方法,旨在解决多机器人在同一环境中的路径冲突问题。通过采用启发式搜索和路径优化策略,机器人能够在保持避障的前提下实现最…

Middleware---RocketMQ

RocketMQ是一个开源的分布式消息中间件。它是一种 低延迟、高可用、高可靠、高并发 的消息队列系统,用于在分布式系统中进行异步通信。 RocketMQ架构模型 Producer Group:消息生产者组,负责发送消息。 Broker:存储消息的服务节…

java:pdfbox 3.0 去除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

Java第二阶段---10方法带参---第三节 面向对象和面向过程的区别

1.案例 2.代码实现 面向过程 import java.util.Scanner;/*** Procedure Oriented Programming 面向过程编程*/public class POP {public static void main(String[] args) {Scanner sc new Scanner(System.in);while(true){System.out.println("1.学生成绩管理");…

双十一不能错过的好物推荐!强推五款超好用的品牌好物

双十一快到了,这个时候的优惠力度都是最大的,还不知道买啥的小伙伴们赶紧来看这篇好物推荐!以下五款产品是我花了几天时间精心挑选出来的,看完之后保证你想加入购物车! 品牌好物推荐一、希亦CG超声波清洗机 如果你带眼…

中小型网络系统综合实验

一、实验要求 1.pc端自动获取ip地址,可以互通访问,可以访问域名解析服务器 2.设置vlan,三层交换机实现不同vlan之间的交流 3.设置静态路由,配置nat地址转换,实现全网可达 二、实验思路 1.首先给LSW2配置vlan 10 &a…

【无人机设计与技术】基于EKF的四旋翼无人机姿态估计matlab仿真

摘要: 本文设计了一种基于扩展卡尔曼滤波(EKF)的四旋翼无人机姿态估计方法。利用EKF算法处理四旋翼无人机姿态的动态模型,通过该滤波算法实现对姿态的实时估计和校正。该方法通过对无人机的运动学和动力学模型的分析,…

【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇 实现穿墙效果 # 检测游戏是否结束 def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x snake_head.x and body[n].y snake_head.y):finished True # 状态检测 def ch…

涉案财务管理系统架构二—交警相关系统——未来之窗行业应用跨平台架构

一、涉案财务保管流程 二、涉案财务返回流程 三、阿雪技术观 拥抱开源与共享,见证科技进步奇迹,畅享人类幸福时光! 让我们积极投身于技术共享的浪潮中,不仅仅是作为受益者,更要成为贡献者。无论是分享自己的代码、撰写…

案例-任务清单

文章目录 效果展示初始化面演示画面 代码区 效果展示 初始化面 演示画面 任务清单 代码区 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

Meta推出Movie Gen 旗下迄今最先进的视频生成AI模型

Meta 今天发布了 MovieGen 系列媒体基础AI模型&#xff0c;该模型可根据文本提示生成带声音的逼真视频。 MovieGen 系列包括两个主要模型&#xff1a; MovieGen Video 和 MovieGen Audio。 MovieGen Video 是一个具有 300 亿个参数的变换器模型&#xff0c;可根据单个文本提示生…