• 二十四、W5100S/W5500+RP2040树莓派Pico<PHY的状态模式控制>


    1. 前言

      W5100S/W5500不仅支持自动PHY自动协商,而且支持用户自定义PHY模式,有10M/100M、半双工/全双工、掉电模式等。

      本章节将用 W5100S/W5500 + 树莓派RP2040 进行逐一配置和测试 。

      W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。

    2. 相关简介

    2.1 简述

    ​ PHY的10M和100M是指网络传输速率,分别表示每秒传输10兆比特(Mbit)和100兆比特(Mbit)的数据速率。这些速率通常用于描述局域网(LAN)和广域网(WAN)连接的性能。

    ​ 半双工和全双工是指网络连接的工作模式。半双工意味着数据连接双方在同一时刻只能执行一方发送数据而另一方接收数据的操作模式。而全双工则是指数据连接双方在同一时刻都能发送和接收数据的操作模式。全双工方式无需进行方向的切换,因此没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。

    ​ PHY的掉电模式是指PHY芯片在遇到异常情况或需要节能时,会自动进入掉电模式,关闭不必要的设备和功能,以减少能源消耗和延长设备使用寿命。在掉电模式下,一些设备的运行会受到影响,如屏幕亮度降低、处理器频率降低等。掉电模式是一种节能技术,可以在保证设备正常运行的同时,实现能源的高效利用。

    2.2 原理

    在这里插入图片描述

    ​ 根据实际需要可以通过写入 PHYCR0 和 PHYCR1 寄存器参数,从而配置PHY为不同的模式。

    2.3 优点&应用

    • 节能:低功耗PHY芯片在保持高性能的同时,能够有效地降低功耗,对于电池供电的设备来说,可以大大延长设备的工作时间。

    • 热设计优化:低功耗PHY芯片在设计时已经考虑到了热性能的优化,能够在高负载情况下保持良好的散热性能,从而保证芯片的高效稳定运行。

    • 延长设备使用寿命:由于低功耗PHY芯片能够有效地降低功耗,因此可以减少设备的热量积累和损耗,从而延长设备的使用寿命。

    • 符合绿色环保要求:随着人们对环保意识的提高,电子设备的高效节能也成为了关注的重点。低功耗PHY芯片能够更好地符合绿色环保的要求,为电子设备的绿色发展做出贡献。

    • 应用广泛:低功耗PHY芯片在各种领域都有广泛的应用,如物联网、智能家居、医疗设备等,这些领域都需要长时间的工作和高效的表现,低功耗PHY芯片恰好能够满足这些需求。

    ​ 总之,PHY低功耗的优点主要表现在节能、热设计优化、延长设备使用寿命、符合绿色环保要求和应用广泛等方面,这些优点使得低功耗PHY芯片在各种领域中都得到了广泛的应用和推广。

    3. WIZnet以太网芯片

    WIZnet 主流硬件协议栈以太网芯片参数对比

    ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
    W5100STCP/IPv4, MAC & PHY8 bit BUS, SPI16 KB4Max 25 Mbps
    W6100TCP/IPv4/IPv6, MAC & PHY8 bit BUS, Fast SPI32 KB8Max 25 Mbps
    W5500TCP/IPv4, MAC & PHYFast SPI32 KB8Max 15 Mbps
    1. W5100S/W6100 支持 8 bit数据总线接口,网络传输速度会优于W5500。
    2. W6100 支持IPv6,与W5100S 可以Pin to Pin兼容,若已使用W5100S的用户需要支持IPv6,则可直接换用。
    3. W5500 拥有比 W5100S更多的 socket数量以及发送与接收缓存

    4. PHY模式配置测试

    4.1 程序流程图

    在这里插入图片描述

    4.2 测试准备

    软件

    • Visual Studio Code
    • WIZnet UartTool

    硬件

    • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
    • Micro USB 接口的数据线
    • TTL 转 USB
    • 网线

    4.3 连接方式

    • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
    • 通过TTL串口转USB,连接UART0 的默认引脚:
      • RP2040 GPIO 0(UART0 TX) <----> USB_TTL_RX
      • RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
    • 使用模块连接RP2040进行连线时
      • RP2040 GPIO 16 <----> W5100S MISO
      • RP2040 GPIO 17 <----> W5100S CS
      • RP2040 GPIO 18 <----> W5100S SCK
      • RP2040 GPIO 19 <----> W5100S MOSI
      • RP2040 GPIO 20 <----> W5100S RST
    • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

    4.4 相关代码

    ​ 打开low_power.c文件(路径:examples/low_power/low_power.c)看下具体实现:

    ​ 可以看到这里是以dhcp模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做dhcp过程中的计时以进行超时处理;接着进入dhcp配置网络信息,失败则用静态配置信息,之后依次配置PHY为10M模式、100M模式、掉电模式并回读打印配置,最后进入while阻塞,如下所示:

    /* Network information to be configured. */
    wiz_NetInfo net_info = {
        .mac = {0x00, 0x08, 0xdc, 0x11, 0x22, 0x33}, // Configured MAC address
        .ip = {192, 168, 1, 10},                     // Configured IP address
        .sn = {255, 255, 255, 0},                    // Configured subnet mask
        .gw = {192, 168, 1, 1},                      // Configured gateway
        .dns = {8, 8, 8, 8},                         // Configured domain address
        .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.
    
    static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
        0,
    }; // Send and receive cachestatic
    
    static uint8_t breakout_flag = 0; // Define the DHCP acquisition flag
    
    int main()
    {
        struct repeating_timer timer; // Define the timer structure
        wiz_NetInfo get_info;         // Stores the read configuration information
        wiz_PhyConf phy_conf, get_conf;
    
        /* MCU init */
        stdio_init_all();              // Initialize the main control peripheral
        wizchip_initialize();          // Initialize the chip interface
        wizchip_setnetinfo(&net_info); // Configure once first
    
        /*dhcp init*/
        DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
        add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler
    
        printf("wiznet chip low power example.\r\n");
        network_init(&net_info);              // Configuring Network Information
        print_network_information(&get_info); // Read back the configuration information and print it
    
        /* config init massage */
        phy_conf.by = PHY_CONFBY_SW;        // Use software config
        phy_conf.mode = PHY_MODE_MANUAL;    // User config mode 
        phy_conf.duplex = PHY_DUPLEX_FULL;  // Full duplex
        phy_conf.speed = PHY_SPEED_100;     // Speed
    
        /* setting phy 100M mode */
        ctlwizchip(CW_SET_PHYCONF, &phy_conf);
        ctlwizchip(CW_GET_PHYCONF, &get_conf);
    
        printf("The current Mbtis speed : %d\r\n", get_conf.speed == PHY_SPEED_100 ? 100 : 10);
        printf("The current Duplex Mode : %s\r\n", get_conf.duplex == PHY_DUPLEX_HALF ? "Half-Duplex" : "Full-Duplex");
    
        /* setting phy 10M mode */
        phy_conf.speed = PHY_SPEED_10;
        ctlwizchip(CW_SET_PHYCONF, &phy_conf);
        ctlwizchip(CW_GET_PHYCONF, &get_conf);
    
        printf("The current Mbtis speed : %d\r\n", get_conf.speed == PHY_SPEED_100 ? 100 : 10);
        printf("The current Duplex Mode : %s\r\n", get_conf.duplex == PHY_DUPLEX_HALF ? "Half-Duplex" : "Full-Duplex");
    
        /* setting phy low power mode */
    #if (_WIZCHIP_ == W5100S)
        wizphy_setphypmode(PHY_POWER_DOWN);
        printf("The current phy is : %s\r\n", (read_phy_pwdn(PHYCR1) & (1 << 5)) ? "normal mode" : "power down mode");
        printf("FHY is in power down state and cannot be ping reply.\r\n");
    #elif (_WIZCHIP_ == W5500)
        setPHYCFGR((uint8_t) PHYCFGR_RST);
        setPHYCFGR(PHYCFGR_OPMDC_PDOWN);
        printf("The current phy is : %s\r\n", (getPHYCFGR() & PHYCFGR_OPMDC_PDOWN) ? "power down mode" : "normal mode");
        printf("FHY is in power down state and cannot be ping reply.\r\n");
    #endif
    
    
        while (true)
        {
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    4.5 测试现象

    ​ 硬件连接无误后,编译烧录程序,打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;可以看到回读的信息:PHY根据配置依次进入对应模式,如下图所示:

    在这里插入图片描述

    5. 注意事项

    • 进入掉电模式后是不能进行数据收发的,并且不会进行ping请求的回复;
    • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
    1. 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

    2. 在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

      6. 相关链接

      WIZnet官网

      WIZnet官方库链接

      本章例程链接

      想了解更多,评论留言哦!

  • 相关阅读:
    Spring中PointcutAdvisor和IntroductionAdvisor梳理
    定制自己的 AI 角色CustomChar;AI知识点和面试题;提高llama 3 的微调速度Unsloth
    【leetcode】仅仅反转字母 c++
    2.spring cloud gateway 源码编译
    企业应用开发效率神器——B/S架构下的“易语言”工具
    小米路由器Pro R3p 刷机 Breed Padavan OpenWrt UART/TTL 救援
    Python 大麦抢票脚本
    字符串的排列
    三、T100应付管理之采购应付-入库应付管理篇
    C语言之文件操作(详解版)
  • 原文地址:https://blog.csdn.net/WIZnet2012/article/details/134337742