当前位置: 首页 > article >正文

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

相关文章:

  • C#-泛型学习笔记
  • MQ 架构设计原理与消息中间件详解(一)(上一篇只是概述)
  • Github 2024-10-07 开源项目周报 Top15
  • YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能
  • Linux中的网络指令:ping、netstat、watch、pidof、xargs
  • mysql 慢查询日志、设置单条数据最大 packet 插入大小指令
  • 2024Java最新面试题总结(针对于一些小厂、中厂)
  • 通信工程学习:什么是AIOT智能物联网
  • [云] Hands-on with a sample application--DockerCoins 挖矿程序!
  • 外国钞票面值检测系统源码分享
  • 【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别
  • kubernetes get pods的STATUS字段显示ImagePullBackOff 的解决办法
  • UE5数字人制作平台使用及3D模型生成
  • 毕业设计项目 深度学习语义分割实现弹幕防遮(源码分享)
  • 【2024最新】华为HCIE认证考试流程
  • 2024最新 Navicat Premium 17 简体中文版安装图文详细教程
  • 如何使用ssm实现基于web技术的税务门户网站的实现+vue
  • 图论大总结
  • 408算法题leetcode--第27天
  • 注意!新增一本期刊解除On Hold!仍有37本无法检索慎投!