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

文章目录

一.概要

我们介绍过单片机的以太网系统一般是由:单片机+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初始化,以及数据收发函数,实现数据通讯

主要代码

c 复制代码
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单片机实现以太网相关应用。

相关推荐
番茄灭世神5 小时前
STM32外设详解——ADC
stm32·单片机·嵌入式硬件
LCMICRO-133108477466 小时前
国产长芯微LUM6100高可靠性双通道双向I2C数字隔离器P2P替代ADUM1250 ADUM1251替代ISO1540 ISO1541
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
黄小美3218 小时前
STM32(四)LED闪烁、流水灯及蜂鸣器操作
stm32·单片机·嵌入式硬件
王大锤43919 小时前
普中51单片机
单片机·嵌入式硬件·51单片机
五羟基己醛10 小时前
【小白向】VOFA+简明教程(快速上手一款强力的串口助手)
单片机·嵌入式硬件
一个人的嵌入式~12 小时前
停止模式下USART为什么可以唤醒MCU?
单片机·嵌入式硬件
OH五星上将14 小时前
OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【内核通信机制】
嵌入式硬件·物联网·harmonyos·openharmony·系统开发·鸿蒙嵌入式·liteos-m
夜间去看海15 小时前
基于单片机的书库环境监测
单片机·嵌入式硬件·温度
点灯的棉羊17 小时前
STM32 Hal库SDIO在FATFS使用下的函数调用关系
stm32·单片机·嵌入式硬件
盼海17 小时前
单片机原理与技术
单片机·嵌入式硬件