WIZnet W5500-EVB-Pico 静态IP配置教程(二)

       W5500是一款高性价比的 以太网芯片,其全球独一无二的全硬件TCP、IP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用,安全稳定,是物联网设备的首选解决方案。WIZnet提供完善的配套资料以及实时周到的技术支持服务,极大地缩短产品开发周期,全方位保障客户项目按时落地。

以太网知识介绍

        MAC地址:MAC地址也叫物理地址、硬件地址,是设备唯一的网络标识。MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址。

        需注意:MAC地址的首位必须为偶数,也就是MAC地址的第一位数必须为0,奇数则是广播地址。第二位数字必须是偶数,如果是奇数则为单播地址,只能作为目的地址,不能作为源地址。

        IPv4地址:是在以太网上的每一台主机的每一个接口分配一个在全世界范围内的唯一的32比特的标识符。IP地址=网络地址+主机地址

        A:8位网络位,24位主机位组成。0.0.0.0-127.255.255.255. 0-127

        B:16位网络位,16位主机位. 128.0.0.0-191.255.255.255 128-191

        C:24位网络位,8位主机位。192.0.0.0-223.255.255.255 192-223

        D类或E类:

        D:组播地址. 224.0.0.0-239.255.255.255.

        E:保留地址,还未被使用的. 240.0.0.0-255.255.255.255。

        子网掩码:它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。IP地址我们都知道是计算机在网络内的唯一标识,而子网掩码顾名思义是用于划分子网的。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

        子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

        网关地址:是网关设备的IP地址,比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP 地址作 “与” 运算的结果不同判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。这就是网络A向网络B转发数据包的过程。

硬件准备

  1. W5500-EVB-Pico开发板
  2. 网线
  3. Micro USB数据线

    注意:需要把W5500-EVB-Pico接入到与自己电脑同一个网段中。

软件环境

  1. Visual Studio Code

w5500配置静态IP地址

步骤1:找到network_install并打卡

        我们用Visual Studio Code打开示例的network_install程序,可以看到,首先引用了三个官方库,"wizchip_conf.h","w5500.h","w5500_spi.h",然后定义了一个全局变量net_info来存储网卡地址信息。需注意,IP地址必须跟自己电脑是同网段才可以ping通。

static wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},//mac地址
    .ip = {192, 168, 1, 110},//IP地址
    .sn = {255, 255, 255, 0},//子网掩码
    .gw = {192, 168, 1, 1},//默认网关
    .dns = {8, 8, 8, 8},//dns信息
    .dhcp = NETINFO_STATIC};//DHCP模式为静态地址模式

        在主函数中我们只需要对W5500进行初始化,然后再把网卡信息设置上去即可

int main()
{
    stdio_init_all();//串口重定义到printf函数
    sleep_ms(5000);
    printf("W5500 network install example.\r\n");
    wizchip_initialize();//初始化
    wizchip_setnetinfo(&net_info);//设置网卡信息
    printf("mac: %02X-%02X-%02X-%02X-%02X-%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);//打印mac地址
    printf("ip: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);//打印IP地址
    printf("mask: %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);//打印子网掩码
    printf("gw: %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);//打印默认网关
    while (true)
    {
        sleep_ms(1000);
    }
}

步骤2:编译烧录

  1. 选择GCC arm-none-eabi编译链
  2. 选择编译项目为network_install
  3. 点击Build编译

         编译之后,按住BOOTSEL按钮把开发板连接到电脑上,此时电脑将开发板识别为大容量存储器,我们将build/examples/network_install文件夹下面的后缀为.uf2文件拖入开发板的大容量存储器中,就烧录好了。

 步骤3:验证测试

        此时W5500-EVB-Pico的USB口会虚拟出一个串行设备,我们通过VS Code的串口监视器就可以设置连接到W5500-EVB-Pico,此时就可以看到打印信息了。

        注意:如果没有输出信息,可以打开串口监视器里面的自动连接按钮(即框起来的按钮),然后按下RUN进行复位即可。

        也可以打开VS Code的终端进行ping验证

示例下载链接

    基于WIZnet官方的ioLibrary_Driver库编写

    示例下载:W5500-EVB-Pico示例

       本期内容就分享到这里了,觉得文章写的还不错的话给个关注鼓励一下吧!下期为大家讲解W5500-EVB-Pico如何通过DHCP动态获取IP地址。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Linux SPI总线和W5500芯片的驱动程序示例,可供参考: ```c #include <linux/kernel.h> #include <linux/module.h> #include <linux/spi/spi.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #define W5500_SPI_MODE (SPI_MODE_0) #define W5500_SPI_BITS_PER_WORD (8) #define W5500_SPI_MAX_SPEED_HZ (10 * 1000 * 1000) struct w5500_data { struct spi_device *spi; struct gpio_desc *reset_gpio; }; static int w5500_reset(struct w5500_data *w5500) { if (!w5500->reset_gpio) return -ENODEV; gpiod_set_value_cansleep(w5500->reset_gpio, 1); msleep(10); gpiod_set_value_cansleep(w5500->reset_gpio, 0); msleep(10); gpiod_set_value_cansleep(w5500->reset_gpio, 1); msleep(150); return 0; } static int w5500_probe(struct spi_device *spi) { struct device *dev = &spi->dev; struct w5500_data *w5500; int ret; w5500 = devm_kzalloc(dev, sizeof(*w5500), GFP_KERNEL); if (!w5500) return -ENOMEM; spi->bits_per_word = W5500_SPI_BITS_PER_WORD; spi_setup(spi); w5500->spi = spi; w5500->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(w5500->reset_gpio)) { ret = PTR_ERR(w5500->reset_gpio); dev_err(dev, "Failed to get reset GPIO: %d\n", ret); return ret; } ret = w5500_reset(w5500); if (ret) { dev_err(dev, "Failed to reset W5500: %d\n", ret); return ret; } return 0; } static int w5500_remove(struct spi_device *spi) { struct w5500_data *w5500 = spi_get_drvdata(spi); if (w5500_reset(w5500)) { dev_warn(&spi->dev, "Failed to reset W5500 on removal\n"); } return 0; } static const struct of_device_id w5500_of_match[] = { { .compatible = "wiznet,w5500", }, { }, }; MODULE_DEVICE_TABLE(of, w5500_of_match); static struct spi_driver w5500_driver = { .driver = { .name = "w5500", .of_match_table = w5500_of_match, }, .probe = w5500_probe, .remove = w5500_remove, }; module_spi_driver(w5500_driver); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("W5500 SPI driver"); MODULE_LICENSE("GPL"); ``` 此驱动程序在设备树中使用以下属性: ```dts spi { #address-cells = <1>; #size-cells = <0>; w5500@0 { compatible = "wiznet,w5500"; reg = <0>; spi-max-frequency = <10000000>; reset-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; }; }; ``` 该驱动程序使用 `devm_gpiod_get()` 函数获取重置 GPIO 引脚,以及 `gpiod_set_value_cansleep()` 函数将 GPIO 引脚设置为适当的值。它还使用 SPI API 函数来设置 SPI 总线并进行数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值