文章目录
- 1. 前言
- 2. 相关简介
- 2.1 简述
- 2.2 原理
- 2.3 优点&应用
- 3. WIZnet以太网芯片
- 4. PHY模式配置测试
- 4.1 程序流程图
- 4.2 测试准备
- 4.3 连接方式
- 4.4 相关代码
- 4.5 测试现象
- 5. 注意事项
- 6. 相关链接
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 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8 bit BUS, SPI | 16 KB | 4 | Max 25 Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8 bit BUS, Fast SPI | 32 KB | 8 | Max 25 Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32 KB | 8 | Max 15 Mbps |
- W5100S/W6100 支持 8 bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPv6,与W5100S 可以Pin to Pin兼容,若已使用W5100S的用户需要支持IPv6,则可直接换用。
- 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)
{
}
}
4.5 测试现象
硬件连接无误后,编译烧录程序,打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;可以看到回读的信息:PHY根据配置依次进入对应模式,如下图所示:
5. 注意事项
- 进入掉电模式后是不能进行数据收发的,并且不会进行ping请求的回复;
- 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
-
在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。
-
在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。
6. 相关链接
WIZnet官方库链接
本章例程链接
想了解更多,评论留言哦!