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

news/2024/12/22 10:26:19/

文章目录

    • 一.概要
    • 二.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.ppmy.cn/news/1536455.html

相关文章

十二、血条UI

一、制作血条UI 注:一般不用Slider制作血条;而是用两个Image制作,选择为填充 使用Slider滑动条制作UI 人物血条:背景深绿色;滑条浅绿色 在场景中的画布选择为OverLay 敌人血条: 在预制体里面制作&#x…

【笔记】I/O总结王道强化视频笔记

文章目录 从中断控制器的角度来理解整个中断处理的过程复习 处理器的中断处理机制**中断驱动I/O方式** printf——从系统调用到I/O控制方式的具体实现1轮询方式下输出一个字符串(程序查询)中断驱动方式下输出一个字符串中断服务程序中断服务程序与设备驱动程序之间的关系 DMA方…

【JavaEE】【多线程】Thread类讲解

目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用…

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker,负责整个kafka集群的…

freex源码抄写+ue5视频1个+渲染泛读催眠

分三块: 一,freex系列源码抄写。 工作为主,立足本职,再谈发展。 freex的四个模块共计408741行(含空格和注释),如果周一到周四每天300行,周六日开着和平精英抄1000行,那就…

ES postman操作全量修改,局部修改,删除

全量修改 修改需要调用的url 地址是http://192.168.1.108:9200/shopping/_doc/1001,调用方法使用put 只修改指定的需求的内容的请求方式 post方式就是局部修改 http://192.168.1.108:9200/shopping/_update/1001,请求方式post 上图是只修改id 为1001数…

Python | Leetcode Python题解之第456题132模式

题目: 题解: class Solution:def find132pattern(self, nums: List[int]) -> bool:candidate_i, candidate_j [-nums[0]], [-nums[0]]for v in nums[1:]:idx_i bisect.bisect_right(candidate_i, -v)idx_j bisect.bisect_left(candidate_j, -v)if…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员,工作中需要使用Python进行编程,甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python,如何给Pycharm(IDE)配置对应的interpreter等,都成为一个 “不熟练工” 的难…