我是靠谱客的博主 跳跃豌豆,最近开发中收集的这篇文章主要介绍如何模拟mdc/mdio进行数据通讯,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、初识MDC/MDIO

MDC/MDIO是一种串行双线接口,通讯协议按照标准的以太网协议。 MDIO接口在没有传输数据的空闲状态数据线MDIO处于 高阻态 。 MDIO出现一个2bit的开始标识码(01)一个读/写操作开始。 MDIO出现一个2bit数据来标识是 读 (10)还是写操作(01)。 MDIO出现一个5bit数据标识PHY的地址。 MDIO出现一个5bitPHY寄存器地址。 MDIO需要2个时钟的访问时间。 MDIO串行读出/写入16bit的寄存器数据。 MDIO恢复成IDLE状态,同时MDIO进入高阻状态。我们操作目前操作的有以太网phy芯片和光模块内部的phy,虽然都是采用MDC/MDIO来访问,但是区别还是很大的,首先一点是开始位并不相同。

二、MDC/MDIO分类
MDIO前后有两种协议, 包括之前的Clause22 以及之后为了弥补Clause22 寄存器空间不足而出的Clause45, Clause 45 向前兼容Clause 22。1、协议帧格式如下:Clause 22图片: https://uploader.shimo.im/f/8OZcNooYgrychXlB.jpgClause45图片: https://uploader.shimo.im/f/fMG7k8DJtBHDyMzn.png2、时序Clause 22 的时序:图片: https://uploader.shimo.im/f/Ow8vtI8r7BSSArV7.png(write data) 图片: https://uploader.shimo.im/f/1cnXIFeoFIp7DkNb.png(read data)Clause 45 的时序:图片: https://uploader.shimo.im/f/od6BJZTzn2Os3FJ8.png(select register) 图片: https://uploader.shimo.im/f/D6yWmq6EbVm7BYmx.png(write data) 图片: https://uploader.shimo.im/f/3KDnMqwBJ79vCzXp.png(read data)
三、如何解决差异,实现通讯
在尝试用GD芯片官方提供的专用MDC/MDIO访问不到数据之后,改用其他方式,就是通过模拟时序,进行数据交互。因为有两根线,一根是时钟线,另一根是数据线。时钟线需要芯片配置为输出口,数据线因为数据是双向传输,所以在发送数据的时候配置成输出口,在接收数据的时候需要配置成输入口。数据的接收采用位接收。这里有一个很有意思的现象,把专用口设置成普通IO口来模拟也可以进行访问数据。
四、调试过程中出现的问题
1、在调试数据的时候有几个量是需要确定的,分别是物理地址、寄存器地址、设备类型。物理地址和寄存器地址一般都不会错,但是设备类型如果选错了就访问不了。在调试的过程中,以为没一准的格式都是64 位数据,所以在读数据的时候容易回收这个影响,我前面已经选择了地址了,后面度数据的时候是否还需要发送地址,如果不发送地址就不够一帧数据,就是因为这个逻辑,导致前期获取不到数据。其实在读数据的时候,不需要再一次发送地址了,后面那十六位就是等待接收数据了,为了引起误导,附张图,如下:图片: https://uploader.shimo.im/f/e5tCBr6E6pBvapiQ.png后面的16位,就是获取的数据,而不是送地址了。
2、在发送TA的时候其实有一位是高阻状态,高祖状态的设置直接配置成输出口,但是不做上下拉。但是个人觉得这样的切换太麻烦,还需要重新配置,于是直接把高阻态设置成高电平,实现的效果是一样的。可以正常访问数据。

最后

以上就是跳跃豌豆为你收集整理的如何模拟mdc/mdio进行数据通讯的全部内容,希望文章能够帮你解决如何模拟mdc/mdio进行数据通讯所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部