rtl8221b+mcu,2.5g光纤收发器的开发备份

news/2024/5/15 8:53:26/文章来源:https://blog.csdn.net/qq_29734297/article/details/128266937

1、rtl8221b是一款2.5g的光电转换的phy

系统的构建如下

为了省成本,不用mac来对接其中的gmii接口直接接光模块

2、mdio和mdc由mcu的gpio来模拟,在csdn上有很多的文章来参考

mdio的参数如下

不想看英文可以参考下面的文章

MDIO(clause 22 与 clause 45)接口简介以及FPGA Verilog 实现_Angry Noob的博客-CSDN博客

MDIO分成Clause 22和Clause 45还有Clause 35等,但是因为这款芯片只提到了22和45并且用22的话需要间接访问13和14寄存器才能正常工作,没有必要弄得这么的复杂,只使用C45即可,gpio的模拟参考linux内核的源码中的mdio-bitbang.c中的代码,如下

// SPDX-License-Identifier: GPL-2.0
/** Bitbanged MDIO support.** Author: Scott Wood <scottwood@freescale.com>* Copyright (c) 2007 Freescale Semiconductor** Based on CPM2 MDIO code which is:** Copyright (c) 2003 Intracom S.A.*  by Pantelis Antoniou <panto@intracom.gr>** 2005 (c) MontaVista Software, Inc.* Vitaly Bordug <vbordug@ru.mvista.com>*/#include <linux/module.h>
#include <linux/mdio-bitbang.h>
#include <linux/types.h>
#include <linux/delay.h>#define MDIO_READ 2
#define MDIO_WRITE 1#define MDIO_C45 (1<<15)
#define MDIO_C45_ADDR (MDIO_C45 | 0)
#define MDIO_C45_READ (MDIO_C45 | 3)
#define MDIO_C45_WRITE (MDIO_C45 | 1)#define MDIO_SETUP_TIME 10
#define MDIO_HOLD_TIME 10/* Minimum MDC period is 400 ns, plus some margin for error.  MDIO_DELAY is done twice per period.*/
#define MDIO_DELAY 250/* The PHY may take up to 300 ns to produce data, plus some margin* for error.*/
#define MDIO_READ_DELAY 350/* MDIO must already be configured as output. */
static void mdiobb_send_bit(struct mdiobb_ctrl *ctrl, int val)
{const struct mdiobb_ops *ops = ctrl->ops;ops->set_mdio_data(ctrl, val);ndelay(MDIO_DELAY);ops->set_mdc(ctrl, 1);ndelay(MDIO_DELAY);ops->set_mdc(ctrl, 0);
}/* MDIO must already be configured as input. */
static int mdiobb_get_bit(struct mdiobb_ctrl *ctrl)
{const struct mdiobb_ops *ops = ctrl->ops;ndelay(MDIO_DELAY);ops->set_mdc(ctrl, 1);ndelay(MDIO_READ_DELAY);ops->set_mdc(ctrl, 0);return ops->get_mdio_data(ctrl);
}/* MDIO must already be configured as output. */
static void mdiobb_send_num(struct mdiobb_ctrl *ctrl, u16 val, int bits)
{int i;for (i = bits - 1; i >= 0; i--)mdiobb_send_bit(ctrl, (val >> i) & 1);
}/* MDIO must already be configured as input. */
static u16 mdiobb_get_num(struct mdiobb_ctrl *ctrl, int bits)
{int i;u16 ret = 0;for (i = bits - 1; i >= 0; i--) {ret <<= 1;ret |= mdiobb_get_bit(ctrl);}return ret;
}/* Utility to send the preamble, address, and* register (common to read and write).*/
static void mdiobb_cmd(struct mdiobb_ctrl *ctrl, int op, u8 phy, u8 reg)
{const struct mdiobb_ops *ops = ctrl->ops;int i;ops->set_mdio_dir(ctrl, 1);/** Send a 32 bit preamble ('1's) with an extra '1' bit for good* measure.  The IEEE spec says this is a PHY optional* requirement.  The AMD 79C874 requires one after power up and* one after a MII communications error.  This means that we are* doing more preambles than we need, but it is safer and will be* much more robust.*/for (i = 0; i < 32; i++)mdiobb_send_bit(ctrl, 1);/* send the start bit (01) and the read opcode (10) or write (01).Clause 45 operation uses 00 for the start and 11, 10 forread/write */mdiobb_send_bit(ctrl, 0);if (op & MDIO_C45)mdiobb_send_bit(ctrl, 0);elsemdiobb_send_bit(ctrl, 1);mdiobb_send_bit(ctrl, (op >> 1) & 1);mdiobb_send_bit(ctrl, (op >> 0) & 1);mdiobb_send_num(ctrl, phy, 5);mdiobb_send_num(ctrl, reg, 5);
}/* In clause 45 mode all commands are prefixed by MDIO_ADDR to specify thelower 16 bits of the 21 bit address. This transfer is done identically to aMDIO_WRITE except for a different code. To enable clause 45 mode orMII_ADDR_C45 into the address. Theoretically clause 45 and normal devicescan exist on the same bus. Normal devices should ignore the MDIO_ADDRphase. */
static int mdiobb_cmd_addr(struct mdiobb_ctrl *ctrl, int phy, u32 addr)
{unsigned int dev_addr = (addr >> 16) & 0x1F;unsigned int reg = addr & 0xFFFF;mdiobb_cmd(ctrl, MDIO_C45_ADDR, phy, dev_addr);/* send the turnaround (10) */mdiobb_send_bit(ctrl, 1);mdiobb_send_bit(ctrl, 0);mdiobb_send_num(ctrl, reg, 16);ctrl->ops->set_mdio_dir(ctrl, 0);mdiobb_get_bit(ctrl);return dev_addr;
}static int mdiobb_read(struct mii_bus *bus, int phy, int reg)
{struct mdiobb_ctrl *ctrl = bus->priv;int ret, i;if (reg & MII_ADDR_C45) {reg = mdiobb_cmd_addr(ctrl, phy, reg);mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg);} elsemdiobb_cmd(ctrl, MDIO_READ, phy, reg);ctrl->ops->set_mdio_dir(ctrl, 0);/* check the turnaround bit: the PHY should be driving it to zero, if this* PHY is listed in phy_ignore_ta_mask as having broken TA, skip that*/if (mdiobb_get_bit(ctrl) != 0 &&!(bus->phy_ignore_ta_mask & (1 << phy))) {/* PHY didn't drive TA low -- flush any bits it* may be trying to send.*/for (i = 0; i < 32; i++)mdiobb_get_bit(ctrl);return 0xffff;}ret = mdiobb_get_num(ctrl, 16);mdiobb_get_bit(ctrl);return ret;
}static int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val)
{struct mdiobb_ctrl *ctrl = bus->priv;if (reg & MII_ADDR_C45) {reg = mdiobb_cmd_addr(ctrl, phy, reg);mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg);} elsemdiobb_cmd(ctrl, MDIO_WRITE, phy, reg);/* send the turnaround (10) */mdiobb_send_bit(ctrl, 1);mdiobb_send_bit(ctrl, 0);mdiobb_send_num(ctrl, val, 16);ctrl->ops->set_mdio_dir(ctrl, 0);mdiobb_get_bit(ctrl);return 0;
}struct mii_bus *alloc_mdio_bitbang(struct mdiobb_ctrl *ctrl)
{struct mii_bus *bus;bus = mdiobus_alloc();if (!bus)return NULL;__module_get(ctrl->ops->owner);bus->read = mdiobb_read;bus->write = mdiobb_write;bus->priv = ctrl;return bus;
}
EXPORT_SYMBOL(alloc_mdio_bitbang);void free_mdio_bitbang(struct mii_bus *bus)
{struct mdiobb_ctrl *ctrl = bus->priv;module_put(ctrl->ops->owner);mdiobus_free(bus);
}
EXPORT_SYMBOL(free_mdio_bitbang);MODULE_LICENSE("GPL v2");

3、配置寄存器

 配置任意寄存器,其中的RW是可读可写的,RO是只读的寄存器

如图配置其中的12位的自适应寄存器,只需要将值置位即可,默认值为0x3000,将其关闭之后就成了0x2000,读取数据后通过串口发出如下图所示

 与设置的值一致,所以成功了,如果是mdio读取的值为0xffff用示波器测试后一直是高电平,那么就需要检查了。

下面例出开发中的问题

1、mdio的数据是全1的数据即0xffff

检查mdio和mdc的接口,我在测试的时候因为没有预留这两个接口的引脚导致我用线引出后手没有拉好直接将mdio口拉掉了,导致在示波器上可以看到波形,但是这个波是没有到phy的

检查phy的(端口)地址,设备地址(寄存器的前导),以及寄存器的地址(address/data),是否正确,可以通过观察led来确定phy是否是正确的地址。

2、led不亮,或者只亮一盏两盏

引起这个问题的因素比较多,因为当时采用的芯片的主频是64m按理来说使用最高的频64m就行了,但是后续的使用发现这个频率很不稳定,在烧写过程中时好时坏,建议使用25的倍数的频率,这里使用50m就行,只要满足mdc所需的0-2.5m即可,我尝试用过250hz和1.5khz,效果都不错。

3、MDI接口的信号有误

MDI即第一张图中的电口,我遇到过几个问题,现在总结,首先是mdi的信道不对,检查引脚mdi_swap的置位与自己设计的是否一致,开始我置位了,但是因为有其他问题我改了这个脚的状态导致硬件工程师用的双绞线没有一起改变,配置成100m的时候信道反了,于是信号灯就不闪了,另外在设计的时候因为丝印错了没有和焊工说明清楚导致电阻过大,信号被严重削弱导致电口信号不通

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.2 流控模式【关联】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.2 流控模式【关联】31.2.1 流控模式31.2.2 流控模式 - 关联31.2.3 小结31 限流规则…

Python模块fileinput操作文件和目录操作总结

前言 之前介绍Python的 pathlib 模块可以有效的路径及文件查找等方便操作&#xff0c;本篇介绍一个相对 readlines() 获取文件内容更高效的用法 fileinput模块 对一个或者多个文件的内容迭代遍历&#xff08;类似文件操作的readlines()&#xff09;,但是返回的是迭代对象&…

【Linux】四、Linux 进程概念(三)|进程优先级|环境变量

目录 七、进程优先级 7.1 基本概念 7.1.1 什么是优先级 7.1.2 为什么存在优先级 7.1.3 Linux 优先级特点 7.2 查看系统进程 7.3 PRI 和 IN 7.4 查看进程优先级和更改进程优先级 7.5 其它概念 7.6 进程切换 八、环境变量 8.1 环境变量基本概念 8.2 常见环境变量 8…

English Learning - L1 站在高处建立灵魂 2022.12.5 周一

English Learning - L1 站在高处建立灵魂 2022.12.5 周一1.1 到底什么是语法1.2 为什么要学习语法口语分广义和狭义讲母语的人为啥不学语法&#xff1f;作为一名二语习得者口语中可不可以没有有语法&#xff1f;1.3 英语&#xff08;听说读写&#xff09;的核心金字塔理论关于词…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例&#xff0c;介绍与图相关的各种矩阵。我们定义下面的图为 GGG&#xff1a; import networkx as nx import matplo…

redis cluster 集群安装

redis cluster 集群安装 redis集群方案 哨兵集群 如图&#xff0c;实际上还是一个节点对外提供服务&#xff0c;所以虽然是三台机器&#xff0c;但是还是一台机器的并发量&#xff0c;而且master挂了之后&#xff0c;整个集群不能对外提供服务 cluster集群 多个主从集群节点…

编写高质量代码 - 多线程和并发(2)

文章目录1. 使用线程异常处理器提升系统可靠性2. volatile不能保证数据同步3. 异步运算考虑使用Callable接口1. 使用线程异常处理器提升系统可靠性 我们要编写一个Socket应用&#xff0c;监听指定端口&#xff0c;实现数据包的接收和发送逻辑&#xff0c;这在早期系统间进行数据…

微信群营销方式微信群建群营销案例

今天我们以小区微信群营销为例&#xff0c;聊一聊具体的步骤和流程&#xff1a; 1、社群的建立&#xff0c;就是如何找到合适的小区&#xff0c;建立小区专属社群?因此&#xff0c;终端在做小区社群营销之前&#xff0c;需要先对当地所有的潜在小区做一个综合性的分析和评估&a…

ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

最近项目需要&#xff0c;使用了 ffmpeg 做摄像头视频采集和串流。这几天有点时间&#xff0c;打算把相关的一些知识记录分享一下。 在撰写本文时&#xff0c;我又在另外一台电脑上把 ffmpeg 重新安装了一遍&#xff0c;所以绝对真实靠谱&#xff01;如果你觉得文章写得还不错…

Linux消息中间件-RabbitMQ

Linux消息中间件-RabbitMQ 消息中间件 MQ简介 MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xff0c;而无需专用连接来链接它们。消息传递指的是程序之间通…

cef浏览器加载过程实测ILoadHandler和IRequestHandler

针对方法GetResourceRequestHandler获取资源请求过程中,会多次发生请求,不知道何时加载完的问题,IRequestHandler没有了OnResourceLoadComplete和OnBeforeResourceLoad方法,如何判断是否加载完。使用browser.isLoading并不能真正的判断。所以想到了 OnFrameLoadEnd OnFram…

Spring Cloud Alibaba-全面详解(学习总结---从入门到深化)

​​​​​​​ Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.5 流控效果【排队等待】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.5 流控效果【排队等待】31.5.1 流控效果【排队等待】31.5.2 案例31.5.3 总结31 限流…

【Java开发】 Spring 10 :Spring Boot 自动配置原理及实现

用了这么久的 SpringBoot &#xff0c;我们再来回顾一下它&#xff0c;本文介绍 Spring Boot 的自动配置&#xff0c;这是它区别于 Spring 的最大的点&#xff0c;本文的自动配置项目包含三个项目&#xff0c;建议拉取仓库里的代码进行实践&#xff1a;尹煜 / AutoConfigDemo …

DCDC电感下方铜箔如何处理

挖&#xff1a;电感在工作时&#xff0c;其持续变化的电流产生的电磁波会或多或少的泄露出来&#xff0c;电感下方的铜箔受电磁波影响&#xff0c;就会有涡流出现&#xff0c;这个涡流&#xff0c;①可能对线路板上的信号线有干扰&#xff0c;②铜箔内的涡流会产生热量&#xf…

容器的常用方法和线程安全(Map、List、Queue)

一、Map 1. HashTable 线程安全的Map&#xff0c;用synchronized锁 2. Collections.synchronizedMap Collections.synchronizedMap(new HashMap()) 可以把HashMap变成线程安全的&#xff0c;锁粒度比HashTable稍微小一点 3. ConcurrentHashMap ConcurrentHashMap主要提高…

某Y易盾滑块acToken、data逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 目标 网址&#xff1a;案例地址 这个好像还没改版&#xff0c;我看官网体验那边已经进行了混淆 只研究了加密的生成&#xff0c;环境不正确可能会导致的加密结果对 (太累了&#xff0c;先缓缓吧&#xff0c;最近事比…

农业灌区量测水流量在线监测系统解决方案-灌区信息化管理系统-灌区水网智慧化

平升电子农业灌区量测水流量在线监测系统解决方案/灌区信息化管理系统/灌区水网智慧化&#xff0c;对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测&#xff0c;同时对泵站、闸门进行远程控制&#xff0c;对重点区域进行视频监控&#xff0c;实现了信息的采集、…

使用openshift 进行云平台连接

使用openshift 进行云平台连接 OpenShift CLI on Windows openshift 文档地址 OpenShift CLI on Mac 通过Homebrew方式安装 brew install openshift-cli安装完成&#xff0c;进行验证 oc version服务连接 oc login 服务地址根据提示输入用户名和密码&#xff0c;即可连接…

【日常系列】LeetCode《20·数据结构设计》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 155 【剑指 30】【top100】&#xff1a;最小栈 https://leetcode.cn/problems/min-stack/ 提示&#xff1a; -2^31 < val < 2^31 - 1 pop、top 和…