Lan8720 网线插拔状态检测

2023-11-07

目的:能够实时的检测网线的插拔状态。并能够根据网线的插拔状态通知到到应用层,让应用层做相应的处理。

1.解决问题的根本方法就是看lan8720的数据手册!!!!

如果说你用过一款芯片,而没有去研究过它的数据手册时,可以说你没有用过这个芯片。

Lan8720数据手册的第48页给出了这个芯片的控制和状态寄存器资料。因为我们是要用来检测lan8720连接网线的状态,所以这个状态应该是属于Basic Status Register这个类别的。

我们跳转到这个寄存器的说明:

红色框框圈出来的是Lan8720的速度以及状态,因为这个是一款10/100M自适应的以太网芯片,所以就有了10M和100M的速度模式的检测。我们可以看到LinK Status状态位是这个寄存器的第2位,我们只需要读取这个寄存器得到的值,然后对这个值的第二位进行与1运算,该位与1得到1则说明网线连接正常,该位与1得到0则说明网线连接断开。

在刚开始验证RTT的这部分代码时,没有细看这个功能,后来想到这个问题的时候,重新看了一遍代码,发现RTT也做了这部分的检测,只是我们没有把调试日志打开,所以没有看到这部分的功能。

检测的代码如下:[摘自RTT]

/* PHY: LAN8720 */
static uint8_t phy_speed = 0;
#define PHY_LINK_MASK       (1<<0)    //1左移0位,结果还是1
#define PHY_100M_MASK       (1<<1)    //1左移1位,结果是2
#define PHY_DUPLEX_MASK     (1<<2)    //1左移2位,结果是4
static void phy_monitor_thread_entry(void *parameter)
{
    uint8_t phy_addr = 0xFF;
    uint8_t phy_speed_new = 0;

    /* phy search */
    {
        rt_uint32_t i;
        rt_uint16_t temp;

        for(i=0; i<=0x1F; i++)
        {
            temp = ETH_ReadPHYRegister(i, 0x02);

            if( temp != 0xFFFF )
            {
                phy_addr = i;
                break;
            }
        }
    } /* phy search */

    if(phy_addr == 0xFF)
    {
        STM32_ETH_PRINTF("phy not probe!\r\n");
        return;
    }
    else
    {
        STM32_ETH_PRINTF("found a phy, address:0x%02X\r\n", phy_addr);
    }

    /* RESET PHY */
    STM32_ETH_PRINTF("RESET PHY!\r\n");
    ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_Reset);
    rt_thread_delay(RT_TICK_PER_SECOND * 2);
    ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_AutoNegotiation);

    while(1)
    {
        uint16_t status  = ETH_ReadPHYRegister(phy_addr, PHY_BSR);//读取Basic Status Register的值
        STM32_ETH_PRINTF("LAN8720 status:0x%04X\r\n", status);

        phy_speed_new = 0;

        if(status & (PHY_AutoNego_Complete | PHY_Linked_Status))
        {
            uint16_t SR;

            SR = ETH_ReadPHYRegister(phy_addr, 31);
            STM32_ETH_PRINTF("LAN8720 REG 31:0x%04X\r\n", SR);

            SR = (SR >> 2) & 0x07; /* LAN8720, REG31[4:2], Speed Indication. */
            phy_speed_new = PHY_LINK_MASK;

            if((SR & 0x03) == 2)
            {
                phy_speed_new |= PHY_100M_MASK;
            }

            if(SR & 0x04)
            {
                phy_speed_new |= PHY_DUPLEX_MASK;
            }
        }

        /* linkchange */
        if(phy_speed_new != phy_speed)
        {
            if(phy_speed_new & PHY_LINK_MASK)//和1进行&运算,得1,则代表连接。否则,断开
            {
                STM32_ETH_PRINTF("link up ");

                if(phy_speed_new & PHY_100M_MASK)
                {
                    STM32_ETH_PRINTF("100Mbps");
                    stm32_eth_device.ETH_Speed = ETH_Speed_100M;
                }
                else
                {
                    stm32_eth_device.ETH_Speed = ETH_Speed_10M;
                    STM32_ETH_PRINTF("10Mbps");
                }

                if(phy_speed_new & PHY_DUPLEX_MASK)
                {
                    STM32_ETH_PRINTF(" full-duplex\r\n");
                    stm32_eth_device.ETH_Mode = ETH_Mode_FullDuplex;
                }
                else
                {
                    STM32_ETH_PRINTF(" half-duplex\r\n");
                    stm32_eth_device.ETH_Mode = ETH_Mode_HalfDuplex;
                }
                rt_stm32_eth_init((rt_device_t)&stm32_eth_device);

                /* send link up. */
                //网线正常连接,通知上层应用
                //可以根据自己的需求进行修改
                eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE);
            } /* link up. */
            else
            {
                STM32_ETH_PRINTF("link down\r\n");
                /* send link down. */
                //网线断开,通知上层应用
                可以根据自己的需求进行修改
                eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE);
            } /* link down. */

            phy_speed = phy_speed_new;
        } /* linkchange */

        rt_thread_delay(RT_TICK_PER_SECOND);
    } /* while(1) */
}

只需要其一个线程来实时监测即可。

如果是裸机代码,把while循环去掉,里面相关延时去掉。将其放入主程序的大循环中,定时器起一个标志定时检测即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lan8720 网线插拔状态检测 的相关文章

  • Unity性能优化教程

    目录 一 主要优化周期 二 性能问题的各种类型 1 Spikes 1 垃圾收集器的Spikes 2 每一帧的成本 3 加载时间 1 开放世界 4 内存使用 三 性能分析 你是否打算优化你用Unity制作的游戏并获得最佳的性能表现 在这个完整
  • 恶意代码防范技术原理-恶意代码概述

    一 恶意代码定义与分类 恶意代码 Malicious Code 是一种违背目标系统安全策略的程序代码 会造成目标系统信息泄露 资源滥用 破坏系统的完整性及可用性 它能够经过存储介质或网络进行传播 从一台计算机系统传到另外一台计算机系统 未经
  • Zipkin+Sleuth调用链监控集成和使用

    背景与需求 跨微服务的API调用发生异常 要求快速定位出问题出在哪里 跨微服务的API调用发生性能瓶颈 要求迅速定位出性能瓶颈 集成 整体结构 整体机构为C S模式 客户端 Sleuth 来监控采集调用链信息 汇报给服务端 Zipkin 通
  • uniapp push 获取推送消息 需要的手机设备令牌 cid

    var t1 time 0 var t1 setInterval function var cid plus push getClientInfo clientid console log cid undefined cid undefin
  • ubuntu配置MySQL远程登录

    很多时候我们需要开启数据库远程访问 以方便管理和使用 这里我们详细介绍在 ubuntu 下配置 mysql 远程访问的方法 1 创建一个可以远程的用户 我们先在root模式下创建一个可以远程的用户账号 创建时我们没有在 test 后面指定h
  • C 标准库 - 《float.h》

    原文链接 https www runoob com cprogramming c standard library float h html 简介 C 标准库的 float h 头文件包含了一组与浮点值相关的依赖于平台的常量 这些常量是由
  • Vue+Flask+Mysql 项目实战

    写在前面 花了几天跟女友一起撸了个前后端分离项目 之前我是搞的算法 这算是第一个正式负责后端的项目 这个项目里边我是负责算法 后端 这篇文章是用来记录一下中间收集到的资料的 一 项目介绍 做的是一个在线图像修复网站 可以实现局域网内访问 主
  • 吸水间最低动水位标高_对《消水规》关于消防水池最低有效水位确定的理解

    消防水池是人工建造的供固定式或移动式消防水泵吸水的储水设施 根据 消防给水及消火栓系统技术规范 GB 50974 2014第4 3 9条规定 消防水池的出水管应保证消防水池的有效容积能全部被利用 消防水池的有效水深是设计最高水位至消防水池最
  • [1175]hive函数greatest、least多列取最大最小值

    文章目录 greatest函数 least函数 用多了 max min 今天刚好遇到了需要取连续6年中营收最大的逻辑 6列 greatest函数 取多列最大值 select greatest 99 0 73 73 存在 null 或者字符串
  • ld.exe: cannot find -l?eclipse上用C/C++时,如何链接静态库?

    对g 和静态库不熟悉的人可能会搞不清楚问题所在 因为我自己在网上很久找不到直接的解决方案 为了方便各大g 初学者学习 我将我的犯错经历和解决办法写在这里 节约时间 可以直接看最后的结果 犯错和解决经历 学习socket的使用的时候 想自己在
  • Canvas 原生实现图片涂抹打马赛克功能

    先看效果 上图是一段打码过后的代码截图 简单说一下实现思路 就是通过创建多个canvas 一个用来绘制原图 一个用来绘制全马赛克图 一个用来绘制笔迹或者叫打码的区域 最后一个canvas用来将三个canvas绘制到一个canvas之上 主要
  • 关于解决IDEA中git的commit无效的解决方法

    关于解决IDEA中git的commit无效的解决方法 在开发中我们偶尔会遇到点击idea中commit无效的情况 点击完commit后 进度条一闪而过缺没有将代码提交上去 下面是本人总结的几种方法 一 重启IDEA 重启大法 俗话说的好 重
  • 算法与数据结构技术书籍从入门到进阶推荐适合大神小白附技术书阅读方法论【附网盘链接】

    转载自某大佬博客 https pymlovelyq github io 2018 10 06 Algorithm 前言 技术书阅读方法论 一 速读一遍 最好在1 2天内完成 人的大脑记忆力有限 在一天内快速看完一本书会在大脑里留下深刻印象
  • ubuntu安装英伟达显卡驱动

    文章目录 1 通过PPA安装 2 手动安装 3 通过ubuntu官方方法安装 4 相关命令 1 通过PPA安装 1 卸载系统里低版本的英伟达驱动 sudo apt get purge nvidia 2 把显卡驱动加入PPA sudo add
  • redis 五种数据类型的底层数据结构

    为了拿捏 Redis 数据结构 我画了 40 张图 完整版 Redis 数据结构并不是指 String 字符串 对象 List 列表 对象 Hash 哈希 对象 Set 集合 对象和 Zset 有序集合 对象 因为这些是 Redis 键值对
  • Docker安装RabbitMQ

    1 首先确保自己的虚拟机安装了Docker环境 可以通过docker v 查看自己的docker是否安装了 docker v Docker未安装可以通过下面的教程安装Docker CentOS7安装Docker教程 2 通过命令安装Rabb
  • 现代文翻译成古文_把现代文翻译成古文诗词,太雅致了!

    1 今文 身不由己古译 向来心是看客心 奈何人是剧中人 2 今文 我们越来越陌生了古译 相達何必曾相识 再看君卿已陌路 3 今文 我也不想你 你也就别想我了 古译 我断不思量 你莫思量我 4 今文 物是人非 我们回不去了 古译 柳絮随风各西
  • 关于计算机视觉中的深度信息概念

    引用 https blog csdn net a1059682127 article details 80503378 https www zhihu com question 406919125 answer 1338670936 单独使

随机推荐

  • kettle抽取数据中文乱码

    kettle如何解决也有一两篇谈到在建数据库连接时加characterEncoding来解决 在kettle中 数据链接中添加属性 数据源和目标 都要添加
  • 使用Vue创建一个商品展示首页

    使用Vue创建项目实现一个商品展示首页 在这篇博客中 我们将使用Vue来创建一个简单的商品展示首页 我们已经有一个后端API提供了商品信息 接口地址为 http localhost 8080 api products 返回的数据格式是JSO
  • C++猜数字小游戏-通过循环实现

    C 猜数字小游戏 通过循环实现 题目 系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且退出游戏 每局游戏只能猜5次 实现 通过循环和if判断 源码 include
  • 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 SUSAN算子原理 1 2 SUSAN边缘检测算法 2 运行结果 3 Ma
  • Temporary failure in name resolution

    在启动nexus war包时出现以下提示错误 2016 05 04 13 50 12 ERROR main net sf ehcache Cache Unable to set localhost This prevents creatio
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • Word里如何打出带有上下横杠的大写字母i

    换成新罗马就行了
  • Linux系统中关于/etc/rc.d/rc.local中部分命令不执行的问题

    最近遇到了个奇怪的问题 费了一番周折才最终解决 在此给遇到类似问题的同学提供一条思路 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行 此时我们会想到利用文件 etc rc d rc local 按照正常逻辑 只需要将相应的
  • 通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

    通过re requests urlib BeautifulSoup os模块实现从百度下载指定类别图片 包含代码逐行解析 import re 进行http请求的第三方库 import requests from urllib import
  • STM32F103屏蔽JTAG/SWD 以及PC13,PC14,PC15的RTC晶振禁用。

    STM32F103屏蔽JTAG SWD 以及PC13 PC14 PC15的RTC晶振禁用 1 关于JTAG SWD屏蔽 2 PC13 PC14 PC15的RTC晶振屏蔽 1 关于JTAG SWD屏蔽 STM32F103系列上的一些IO口在标
  • 免费获取省市县的shp,geojson文件

    整理下资料 需要做准备工作 1 一个全能地图下载 https blog csdn net qq 41619796 article details 90241491 可以获取边界坐标 2 获取文件的网站 http geojson io 3 G
  • Python爬虫实战——爬取新闻数据(简单的深度爬虫)

    前言 又到了爬新闻的环节 好像学爬虫都要去爬爬新闻 没办法谁让新闻一般都很好爬呢XD 拿来练练手 只作为技术分享 这一次要的数据是分在了两个界面 所以试一下深度爬虫 不过是很简单的 数据目标 相关库 import openpyxl impo
  • 本地python连接腾讯云数据库

    文章目录 前言 免费体验一个云数据库 申请云数据库 开通外网 设置用户账号 开通外网 设置账号密码 创建数据库 用python连接数据库 前言 简单说下云数据库的概念 云的概念其实就是把网络上的服务虚拟话 比如说没有云的时候 搭建数据库 得
  • 查看僵尸进程并杀掉僵尸进程

    在运维过程中 我们经常会碰到机器由于某几个特殊的僵尸进程造成整台服务器上的进程异常卡死 负载变高 例如以下 其中 存在8个僵尸进程 并且进程19712的CPU使用异常 查看具体的僵尸进程有哪些 发现这些子僵尸进程的父进程即为19712进程
  • ASP.NET WebFrom 使用C# 连接 MySql

    内容 对于ASP NET WebFrom连接SQL database的方法网络上有很多大牛都有介绍 本文介绍一种ASP NET WebForm连接MySql database的方法 材料 Visual Studio 2017 MySql最新
  • 华为2288hv5服务器安装ESXI 6.7(一):远程访问服务器管理口

    文章目录 准备条件 实际操作 1 修改本地网卡信息 2 访问网页管理页面 3 修改管理口IP信息 4 通过Wifi登录管理页面 下一步 不管是网络设备也好 或者服务器也罢 从投入使用到寿终正寝 机房都是它们的归宿所在 但是我们不一样 机房常
  • 虎年啦,小老虎一文带你解决困扰多年Linux命令下的vim,中国人不骗中国人,好好学,工作必备,牢记

    初学者来说 先把最简单 最基础 最重要的知识点掌握好 再去研究难度较高 更加高级的知识点 这样由易到难 循序渐进的学习路径 无疑是最合理的 vi和vim是Linux下的一个文本编辑工具 可以理解为Windows的记事本 或Word文档 1
  • Win10系统下python快速安装点云库pclpy-0.11.0

    目录 一 安装Anaconda3 二 pclpy概述 三 安装pclpy 四 测试代码 五 结果展示 六 进入pclpy11环境 七 实验数据 一 安装Anaconda3 见 Anaconda详细安装及使用教程 带图文 二 pclpy概述
  • 为什么jdbc连接一个异常的源,会出现请求失败的结果

    测试1 使用jdbc mysql 1 1 3306 test 这样ip错误的url路径 jdbc会直接抛出异常 测试2 使用jdbc mysql 1 1 1 1 3306 test 这样看似正确的url路径 实际是请求不同的的ip时 请求会
  • Lan8720 网线插拔状态检测

    目的 能够实时的检测网线的插拔状态 并能够根据网线的插拔状态通知到到应用层 让应用层做相应的处理 1 解决问题的根本方法就是看lan8720的数据手册 如果说你用过一款芯片 而没有去研究过它的数据手册时 可以说你没有用过这个芯片 在Lan8