三十、W5100S/W5500+RP2040树莓派Pico<PPPoE>

news2025/1/17 13:46:10

文章目录

  • 1 前言
  • 2 简介
    • 2 .1 什么是PPPoE?
    • 2.2 PPPoE的优点
    • 2.3 PPPoE数据交互原理
    • 2.4 PPPOE应用场景
  • 3 WIZnet以太网芯片
  • 4 PPPOE示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 结果演示
  • 5 注意事项
  • 6 相关链接

1 前言

  PPPoE是一种在以太网上传输点对点协议(PPP)的方法。它是一种链路层协议,将PPP会话封装在以太网帧中,以便在以太网上传输。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网PPPOE应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2 简介

2 .1 什么是PPPoE?

  PPPoE(以太网上的点对点协议)是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。它允许在以太网广播域中的两个以太网接口间创建点对点隧道。由于协议中集成PPP协议,所以实现出传统以太网不能提供的身份验证、加密以及压缩等功能,也可用于缆线调制解调器(cable modem)和数字用户线路(DSL)等以以太网协议向用户提供接入服务的协议体系。

2.2 PPPoE的优点

  pppoe的优势主要包括:

  1. 方便用户使用和管理:PPPoE继承了以太网的快速和简便特点,同时具备PPP的强大功能,用户使用拨号网络模式,方便易用。
  2. 允许多个用户共享高速数据接入链路:PPPoE通过简单桥接接入设备连接远端接入设备,并可以利用以太网的共享性连接多个用户主机,允许多个用户共享一个高速数据接入链路。
  3. 动态服务选择:PPPoE终端用户可同时接入多个ISP,这种动态服务选择的功能可以使ISP容易创建和提供新的业务。
  4. 兼容性强:PPPoE兼容现有所有的XDSL Modem 和DSLAM,可与ISP现有接入结构相融合。
  5. 提供独立的接入控制和计费:PPPoE对每个用户进行独立的接入控制和计费,方便用户使用和管理。

2.3 PPPoE数据交互原理

在这里插入图片描述

PPPoE的交互过程包括以下步骤:

  1. PPPoE客户端通过广播发送PADI报文,以请求所需的服务。
  2. 所有在服务范围内的PPPoE服务器收到PADI报文后,将其中请求的服务与自己能够提供的服务进行比较,如果可以提供,则单播回复一个PADO报文。
  3. PPPoE客户端在可能收到的多个PADO报文中选择一个合适的PADO报文,然后向所选择的接入集中器发送PPPoE有效发现请求分组(PADR)。
  4. 接入集中器收到PADR报文后准备开始PPP会话,它发送一个PPPoE有效发现会话确认PADS报文。当主机收到PADS报文确认后,双方就进入PPP会话阶段。

2.4 PPPOE应用场景

PPPoE的应用场景包括但不限于以下几种:

  1. 宽带接入:PPPoE可以用于各种宽带接入方式,如DSL、LAN、HFC等,使得用户可以通过以太网接口进行网络连接,并实现安全、高速、稳定的上网体验。
  2. 小区组网建设:在小区组网建设中,PPPoE可以用于实现小区内的网络连接和数据传输,提高网络管理和安全性。
  3. 移动通信:PPPoE可以应用于移动通信网络中,实现在不同网络之间的无缝连接和数据传输,提高网络性能和管理效率。
  4. 远程办公和在线游戏:PPPoE可以用于实现远程办公和在线游戏等功能,保证数据传输的稳定性和实时性。

3 WIZnet以太网芯片

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

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

4 PPPOE示例概述以及使用

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 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040 进行接线时

    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:pppoe.c文件中加入对应的库文件。

第二步:定义PPPOE配置需要的宏。

第三步:设置PPPOE连接的ID和密码(ID和密码是通过路由器管理界面设置PPPOE的用户时进行获取)以及对应的数据长度。

第四步:网络信息的配置,使用静态获取IP模式。

第五步:主函数先是定义了一个变量接收PPPOE运行函数的返回值,然后定义一个数组用来获取拨号获取到的参数变量,下来是对串口和SPI进行初始化,然后写入W5100S的网络配置参数,主循环直接PPPOE进行拨号,判断是否拨号成功,成功则打印获取到的IP,失败则打印配置好的静态IP

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "wizchip_conf.h"
#include "bsp_spi.h"
#include "PPPoE.h"
#include "socket.h" // Use socket

#define DATA_BUF_SIZE 2048
uint8_t gDATABUF[DATA_BUF_SIZE];

uint8_t pppoe_id[6] = "W5100S";
uint8_t pppoe_id_len = 6;
uint8_t pppoe_pw[7] = "WIZnet";
uint8_t pppoe_pw_len = 6;
uint8_t pppoe_ip[4] = {
    0,
};
uint16_t pppoe_retry_count = 0;

/* 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_STATIC};                     // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.

wiz_NetInfo get_info;

int main()
{
    int32_t ret = 0;
    uint8_t str[15];
    struct repeating_timer timer; // Define the timer structure

    /* MCU init */
    stdio_init_all();              // Initialize the main control peripheral
    wizchip_initialize();          // Initialize the chip interface
    wizchip_setnetinfo(&net_info); // Configure once first

    printf("wiznet chip PPPOE example.\r\n");

    while (1)
    {
        ret = ppp_start(gDATABUF); // ppp start function
        if (ret == PPP_SUCCESS || pppoe_retry_count > PPP_MAX_RETRY_COUNT)
        {
            break; // PPPoE Connected or connect failed by over retry count
        }
            
    }
    if (ret == PPP_SUCCESS) // 1 : success
    {

        printf("\r\n<<<< PPPoE Success >>>>\r\n");
        printf("Assigned IP address : %d.%d.%d.%d\r\n", pppoe_ip[0], pppoe_ip[1], pppoe_ip[2], pppoe_ip[3]);

        printf("\r\n==================================================\r\n");
        printf("    AFTER PPPoE, Net Configuration Information        \r\n");
        printf("==================================================\r\n");

        getSHAR(str);
        printf("MAC address  : %x:%x:%x:%x:%x:%x\r\n", str[0], str[1], str[2], str[3], str[4], str[5]);
        getSUBR(str);
        printf("SUBNET MASK  : %d.%d.%d.%d\r\n", str[0], str[1], str[2], str[3]);
        getGAR(str);
        printf("G/W IP ADDRESS : %d.%d.%d.%d\r\n", str[0], str[1], str[2], str[3]);
        getSIPR(str);
        printf("SOURCE IP ADDRESS : %d.%d.%d.%d\r\n\r\n", str[0], str[1], str[2], str[3]);
    }
    else // failed
    {
        printf("\r\n<<<< PPPoE Failed >>>>\r\n");
        wizchip_setnetinfo(&net_info);        // Configuring Network Information
        print_network_information(&get_info); // Read back the configuration information and print it
    }

    while (1)
    {
    }
}

4.5 结果演示

在这里插入图片描述

5 注意事项

  • 注意使用PPPOE进行拨号时,要用到带有拨号功能的路由器,并进入路由器管理界面开启PPPOE功能,获取到ID和密码并将其写入到代码中。
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

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

​ (3)在wol.c文件宏定义处,将_WIZCHIP_ 宏定义修改为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习 | 假设检验】那些经常被忽视但重要无比的假设检验!! 确定不来看看?(附详细案例)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

代码随想录算法训练营Day 54 || 392.判断子序列、115.不同的子序列

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

STM32-基本定时器

一、基本定时器的作用 定时触发输出直接驱动DAC。 二、基本定时器的框图 以STM32F103系列为例&#xff0c;具体开发板请查看开发手册。 类别定时器总线位数计数方向预分频系数是否可以产生DMA捕获/比较通道互补输出基本定时器TIM6 / TIM7APB116位向上1~65536可以0无通用定时…

一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令

目录 前言1 操作 Docker 的命令1.1 启动 Docker1.2 停止 Docker1.3 重启 Docker1.4 查看 Docker 状态1.5 查看 Docker 所有命令的信息1.6 查看某个命令的帮助信息 2 操作镜像的命令2.1 查看所有镜像2.2 搜索某个镜像2.3 下载某个镜像2.4 查看镜像所占空间2.5 删除镜像2.6 强制删…

基于猕猴感觉运动皮层Spike信号的运动解码分析不同运动参数对解码的影响

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…

2D槽道流

之前看槽道流时&#xff0c;一直无法在二维槽道流里计算出湍流状态&#xff0c;后来了解到二维槽道流需要额外添加随机扰动&#xff0c;但是这个体积力的植入方式一直不知道。而且看稳定性分析中的OS方程的推导&#xff0c;也是基于2d的NS方程&#xff0c;至今还是很疑惑这个问…

Struts2 数据校验之四兄弟

现在是科技的时代&#xff0c;大多数人都在网上购物了&#xff0c; 我们都碰到过相同的问题&#xff0c;各大网站弄的那些各种各样的注册页面&#xff0c;相信大家都深有体会。 有了这验证就很好的保证了我们的信息的准确性和安全性。 接下来我给大家讲解一下用struts2怎么实…

H5ke11--3介绍本地,会话存储

代码顺序: 1.设置input,捕获input如果有多个用属性选择符例如 input[typefile]点击事件.向我们的本地存储设置键值对 2.在点击事件外面设置本地存储表示初始化的值.点击上面的事件才能修改我们想修改的值 会话(session)浏览a数据可以写到本地硬盘,关闭页面数据就没了 本地(…

2023年【P气瓶充装】报名考试及P气瓶充装复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年P气瓶充装报名考试为正在备考P气瓶充装操作证的学员准备的理论考试专题&#xff0c;每个月更新的P气瓶充装复审考试祝您顺利通过P气瓶充装考试。 1、【多选题】充装过程中出现充气头漏气的主要原因为&#xff1…

Java Web——JavaScript运算符与流程语句

1. 运算符 1.1. 算数运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经常和算术运算符一起。 算术运算符&#xff1a;也叫数学运算符&#xff0c;主要包括加、减、乘、除、取余&#xff08;求模&#xff09;等 …

git拉取普通idea Java项目module没有build的问题

在不断完成一个项目的时候&#xff0c;会有不断新加的module&#xff0c;我们用git拉取时会发生没有识别新module的情况。 解决方法是右键项目名称&#xff0c;然后点击Open Module Settings 接下来&#xff0c;点击Module&#xff0c;加号&#xff0c;新建Module的名字就是在g…

高效文件管理:一键批量修改文件名,并统一转换为大写扩展名

在日常生活和工作中&#xff0c;文件处理成为了一项必不可少的任务。无论是个人还是企业&#xff0c;都需要管理大量的文件&#xff0c;包括图片、文档、音频和视频等。这些文件的名字可能千奇百怪&#xff0c;格式各不相同&#xff0c;而且往往需要按照一定的规则进行修改或整…

MFC 对话框

目录 一、对话款基本认识 二、对话框项目创建 三、控件操作 四、对话框创建和显示 模态对话框 非模态对话框 五、动态创建按钮 六、访问控件 控件添加控制变量 访问对话框 操作对话框 SendMessage() 七、对话框伸缩功能实现 八、对话框小项目-逃跑按钮 九、小项…

十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录 一、网关技术的实现 在SpringCloud中网关的实现包括两种: 作用&#xff1a; 二、搭建网关服务 1、新建模块&#xff0c;并添加依赖 2、新建Gateway包&#xff0c;并编写启动类 3、编写yml文件 4、启动服务&#xff0c;并在网页内测试 5、步骤 三、路由断言工厂 …

Vue3 shallowRef 和 shallowReactive

一、shallowRef 使用shallowRef之前需要进行引入&#xff1a; import { shallowRef } from vue; 使用方法和ref 的使用方法一致&#xff0c;以下是二者的区别&#xff1a; 1. 如果ref 和 shallowRef 都传入的是普通数据类型的数据&#xff0c;那么他们的效果是一样的&#x…

OpenGL 的学习之路-4(变换)

三大变换&#xff1a;平移、缩放、旋转&#xff08;通过这三种变换&#xff0c;可以将图像移动到任意位置&#xff09; 其实&#xff0c;这背后对应的数学在 闫令琪 图形学课程 中有过一些了解&#xff0c;所以&#xff0c;理解起来也不觉得很困难。看程序吧。 1.画三角形&am…

【C++】类和对象(6)--运算符重载

目录 一 概念 二 运算符重载的实现 三 关于时间的所有运算符重载 四 默认赋值运算符 五 const取地址操作符重载 一 概念 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数…

【使用vscode在线web搭建开发环境--code-server搭建】

官方版本下载 https://github.com/coder/code-server/releases?q4.0.0&expandedtrue使用大于版本3.8.0,因为旧版本有插件市场不能访问的情况版本太高需要更新环境依赖 拉取安装包 []# wget "https://github.com/coder/code-server/releases/download/v4.0.0/code-…

[游戏开发][Untiy]跨平台可视化Log系统

工具介绍 今天介绍的主角是LogViewer 工具运行时长这个样子&#xff0c;Unity的Log日志都会在这里显示 如何安装 在Unity商店搜索Log&#xff0c;排名第一的就是它 也可以去Github官网下载源码&#xff1a; Unity-Logs-Viewerhttps://github.com/aliessmael/Unity-Logs-Vie…

机器学习的医疗乳腺癌数据的乳腺癌疾病预测

项目视频讲解:基于机器学习的医疗乳腺癌数据的乳腺癌疾病预测 完整代码数据分享_哔哩哔哩_bilibili 效果演示: 代码: #第一步!导入我们需要的工具 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inlin…