RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信

目录

1、介绍

1.1 WIZnet

1.2 W5500

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

 2.1 添加WIZnet软件包

2.2 配置 WIZnet 软件包

2.3 配置 spi20 

3、验证效果


开发环境:使用 RT-Thread 实时操作系统 。

开发软件:使用 RT-Thread Studio (目前最新版本1.1.3)。

开发硬件:使用正点原子的 STM32L475 潘多拉开发板 。

 

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 芯片是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。是韩国WIZnet(微知纳特)发布全硬件TCP/IP协议栈以太网接口芯片。

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针间距)

 

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第1张图片

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第2张图片

 

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

 2.1 添加WIZnet软件包

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

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第3张图片

添加后的结果如下图所示

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第4张图片

2.2 配置 WIZnet 软件包

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第5张图片

spi20 设备引脚说明如下所示 

PB12 SPI2_CS
PB13 SPI2_SCK
PB14 SPI2_MISO
PB15 SPI2_MOSI

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

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第6张图片

硬件连接图如下所示:

 

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_SPI1
    if (spiHandle->Instance == SPI1)
    {
        /* SPI1 clock enable */
        __HAL_RCC_SPI1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        /**SPI1 GPIO Configuration
        PA5     ------> SPI1_SCK
        PA6     ------> SPI1_MISO
        PA7     ------> 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_SPI2
    if (spiHandle->Instance == SPI2)
    {
        /* SPI2 clock enable */
        __HAL_RCC_SPI2_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        /**SPI2 GPIO Configuration
        PB13     ------> SPI2_SCK
        PB14     ------> SPI2_MISO
        PB15     ------> 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_SPI3
    if (spiHandle->Instance == SPI3)
    {
        /* SPI3 clock enable */
        __HAL_RCC_SPI3_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();

        /**SPI3 GPIO Configuration
        PB3 (JTDO-TRACESWO)     ------> SPI3_SCK
        PB4 (NJTRST)            ------> SPI3_MISO
        PB5                     ------> 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)

RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信_第7张图片

 

注:下一篇将结合阿里云IoT平台软件包进行MQTT协议通信:

RT-Thread 之 RT-Thread + WIZnet + W5500 + MQTT + ali-iotkit-v3.0.1 完成以太网Socket通信MQTT协议主题订阅发布

你可能感兴趣的:(RT_Thread,STM32,C/C++,物联网)