传感器模块编程实践(二)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.mzph.cn/news/881270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:GAN图像生成

GAN的诞生背景 诞生: 2014年由Ian Goodfellow提出 创新性: 无监督学习:GAN 提供了一种新的方法来进行无监督学习,即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练:通过引入对抗机制,G…

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏,代码参考了github上的项目Mario-Level-1,使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换(STFT)与逆变换(iSTFT)概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域,短时傅里叶变换(Short-Time Fourier Transform,简…

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

栈与队列面试题(Java数据结构)

前言: 这里举两个典型的例子,实际上该类型的面试题是不确定的! 用栈实现队列: 232. 用栈实现队列 - 力扣(LeetCode) 方法一:双栈 思路 将一个栈当作输入栈,用于压入 push 传入的数…

初始爬虫12(反爬与反反爬)

学到这里,已经可以开始实战项目了,多去爬虫,了解熟悉反爬,然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结: 1.爬虫占总PV较高,浪费资源 2.资源被批量抓走,丧失竞争力…

动态规划10:174. 地下城游戏

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:174.…

小米路由器ax1500+DDNS+公网IP+花生壳实现远程访问

有远程办公的需求,以及一些其他东西。 为什么写? ax1500路由器好像没搜到相关信息。以及其中有一点坑。 前置 公网ip Xiaomi路由器 AX1500 MiWiFi 稳定版 1.0.54 实现流程 花生壳申请壳域名https://console.hsk.oray.com/ 这里需要为域名实名认证 …

Linux:进程调度算法和进程地址空间

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 进程调度算法 1.1 进程队列数据结构 1.2 优先级 ​编辑 1.3 活动队列 ​编辑 1.4 过期队列 1.5 active指针和expired指针 1.6 进程连接 二 进程地址空间 2.1 …

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标:了解大模型理论体系 第二轮学习目标:进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。 预训练(Pretraining&…

linux中缓存,在kafka上应用总结

linux中的缓存 页缓存 pagecatch(读缓存用于提供快速读)块缓存(用于提供其他设备快速写)当对读缓存读的时候,修改了读的数据,页缓存就会被标记为脏数据,等到写的时候它会向块缓存同步数据&…

Redis缓存穿透雪崩击穿及解决

封装缓存空对象解决缓存穿透与逻辑过期解决缓存击穿工具类 Slf4j Component public class CacheClient {private final StringRedisTemplate stringRedisTemplate;public CacheClient(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplat…

Word办公自动化的一些方法

1.Word部分内容介绍 word本身是带有格式的一种文档,有人说它本质是XML,所以一定要充分利用标记了【样式】的特性来迅速调整【格式】,从而专心编辑文档内容本身。 样式(集) 编号(多级关联样式编号&#xff…

操作系统 | 学习笔记 | 王道 | 3.1 内存管理概念

3 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存可以存放数据,程序执行前需要先放到内存中才能被CPU处理—缓和cpu和磁盘之间的速度矛盾 内存管理的概念 虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有…

Kubernetes-环境篇-02-ubuntu开发环境搭建

1、ubuntu基础环境 # 更新apt软件源 sudo apt update# 安装git sudo apt install git# 安装python3 sudo apt install -y python3 python3-pip# 安装vim sudo apt install vim2、安装go 2.1 下载go安装包 wget https://golang.google.cn/dl/go1.23.2.linux-amd64.tar.gz2.2 …

【Qt】控件概述(7)—— 布局管理器

布局管理器 1. 布局管理器2. QVBoxLayout——垂直布局3. QHBoxLayout——水平布局4. QGridLayout——网格布局5. QFormLayout——表单布局6. QSpacer 1. 布局管理器 在我们之前值ui界面进行拖拽设置控件时,都是通过手动的控制控件的位置的。同时每个控件的位置都是…

OpenGL ES 纹理(7)

OpenGL ES 纹理(7) 简述 通过前面几章的学习,我们已经可以绘制渲染我们想要的逻辑图形了,但是如果我们想要渲染一张本地图片,这就需要纹理了。 纹理其实是一个可以用于采样的数据集,比较典型的就是图片了,我们知道我…

【STM32开发之寄存器版】(六)-通用定时器中断

一、前言 STM32定时器分类 STM32103ZET6具备8个定时器TIMx(x 1,2,...,8)。其中,TIM1和TIM8为高级定时器,TIM2-TIM6为通用定时器,TIM6和TIM7为基本定时器,本文将以TIM3通用定时器为例,分析STM32定时器工作的底层寄存器…

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候,效果是否会很好?在这篇论文中,作者给出了答案:Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…

EmEditor传奇脚本编辑器

主程序:EmEditor.exe 目前已有功能 可以自己指定一个快捷键 实现以下功能(默认快捷键为:F1) 以下全功能 都是鼠标所在行 按快捷键 (默认快捷键:F1) 1.在Merchant.txt中 一键打开NPC 没有…