当前位置: 代码迷 >> 综合 >> RT-Thread 之 WIZnet 软件包(W5500设备)配置说明
  详细解决方案

RT-Thread 之 WIZnet 软件包(W5500设备)配置说明

热度:43   发布时间:2024-02-08 10:16:51.0

目录

 

1、介绍

1.1 WIZnet

1.2 W5500

2、RT-Thread Studio 配置及相关代码

 2.1 添加WIZnet软件包

2.2 配置 WIZnet 软件包

2.3 配置 spi20 

3、验证效果


1、介绍

1.1 WIZnet

WIZnet 软件包是 RT-Thread 基于 WIZnet 官网 ioLibrary_Driver 代码库的移植实现,目前只支持 W5500 设备。该软件包在原代码库功能的基础上,对接 RT-Thread SAL 套接字抽象层,实现对标准 BSD Socket APIs 的支持,完美的兼容多种软件包和网络功能实现,提高 WIZnet 设备兼容性。

1.2 W5500

W5500是WIZnet推出的高性能以太网接口芯片系列之一,内部集成全硬件TCP/IP协议栈+MAC+PHY。全硬件协议栈技术采用硬件逻辑门电路实现复杂的TCP/IP协议簇,其应用具有简单快速、可靠性高、安全性好等显著优势;内部集成MAC和PHY工艺,使得单片机接入以太网方案的硬件设计更为简捷和高效。

W5500 支持高速标准4线SPI接口与主机进行通信,该 SPI 速率理论上可以达到 80MHz。其内部还集成了以太网数据链路层(MAC)和10BaseT/100BaseTX 以太网物理层(PHY),支持自动协商(10/100-Based全双工/半双工)、掉电模式和网络唤醒功能。与传统软件协议栈不同,W5500内嵌的8个独立硬件 Socket 可以进行8路独立通信,该8路Socket的通信效率互不影响,可以通过 W5500 片上32K 字节的收/发缓存灵活定义各个Socket的大小。

(注:参考资料 WIZnet W5500-参考设计大全)

特点

    • 全硬件TCP/IP协议栈:TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE
    • 8个独立的硬件Socket,各路通信互不影响
    • 32K字节收发缓存
    • 集成802.3以太网MAC
    • 集成10Base-T / 100Base-T以太网PHY
    • 主机接口:SPI高速串行外设接口(最高80Mhz )
    • 支持嵌入式操作系统:Linux & RTOS
    • 支持掉电模式 & UDP网络唤醒
    • 工作电压3.3V,I/O 5V耐压
    • 支持自动协商(全/半双工,10M/100M)
    • 工作温度40℃左右
    • 48Pin LQFP无铅封装(7x7mm, 0.5mm针间距)

 

 

2、RT-Thread Studio 配置及相关代码

 2.1 添加WIZnet软件包

在RT-Thread 软件包中搜索W5500软件包后添加到项目中

添加后的结果如下图所示

 

2.2 配置 WIZnet 软件包

spi20 设备引脚说明如下所示 

PB12 SPI2_CS
PB13 SPI2_SCK
PB14 SPI2_MISO
PB15 SPI2_MOSI

Reset复位引脚是26(对应PB10),IRQ中断引脚 27 (对应PB11),引脚号参考见下图

 

2.3 配置 spi20 

在drv_spi.c源文件中添加 HAL_SPI_MspInit 函数(SPI2引脚配置)

void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct;RT_ASSERT(spiHandle != RT_NULL);#ifdef BSP_USING_SPI1if (spiHandle->Instance == SPI1){/* SPI1 clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO ConfigurationPA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}else
#endif
#ifdef BSP_USING_SPI2if (spiHandle->Instance == SPI2){/* SPI2 clock enable */__HAL_RCC_SPI2_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**SPI2 GPIO ConfigurationPB13     ------> SPI2_SCKPB14     ------> SPI2_MISOPB15     ------> SPI2_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}else
#endif
#ifdef BSP_USING_SPI3if (spiHandle->Instance == SPI3){/* SPI3 clock enable */__HAL_RCC_SPI3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**SPI3 GPIO ConfigurationPB3 (JTDO-TRACESWO)     ------> SPI3_SCKPB4 (NJTRST)            ------> SPI3_MISOPB5                     ------> SPI3_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_3 /* | GPIO_PIN_4 */ | GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}else
#endif{RT_ASSERT(0);}
}

 自动初始化 rt_hw_spi_flash_init 函数,将spi20 挂载到spi2总线上

static int rt_hw_spi_flash_init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12);return RT_EOK;
}
/* 导 出 到 自 动 初 始 化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

 

3、验证效果

串口调试助手显示效果如下

ifconfig : 查看当前网络的 ip address 、 gw address (网关地址)、net mask (子网掩码)、 dns server (dns服务器)

ping 172.30.1.103 成功ping通,表示局域网内可以相互访问了

(注:因为路由器没有连到公网,所以没有ping www.baidu.com)

 

 

 

  相关解决方案