2138507_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2138507_zh-CN

2138507_zh-CN

MDIORead 在 RMII 接口上总是返回 0xFFFF

你好,我一直在使用 s32k148 和 Microchip LAN8720A phy 子板,试图让它们通信。我设计了一个配套的印刷电路板,用于将信号从 phy 传输到 J16 连接器。我可以在开机时正确初始化 phy,将它插入 Windows 电脑时可以看到琥珀色和绿色 LED 灯,电脑端也可以看到 wireshark 活动。下一步是让板的 MAC 接口与 phy 通信,但这就是问题所在。我的代码尽可能模仿了 tja1101 的示例,但每次尝试运行时,主功能指令中 PHY_SHARED_ReadBasicStatus() 内的 ENET_DRV_MDIORead() 都会返回 0xFFFF。

以下是我仔细检查过的事项:
- 50MHz 时钟符合规格要求,并且位于 phy 的 CLKIN 引脚和 J16 的 PTD11 上。
- 内部模块时钟和 MII_SPEED 位给出的 MDC 频率为 2.4MHz(内部模块时钟 = 48MHz,MII_SPEED 位 = 9)。
- 根据数据手册,phy 地址为 0(内部将 RXER/PHYADD0 拉低)。

我已将整个项目附在本帖后,以便确保初始化代码以及 phy 的数据表都没有问题。

我还用示波器测量了 MDIO 和 MDC 线路上的活动,但无法判断其形式是否正确。

谢谢您!

Re: MDIORead always returning 0xFFFF on RMII interface

你好,我是@克里斯托弗-拉佐伊

感谢您提醒我们您的假期。这样我就有足够的时间为您准备一份详细的答复。

感谢您提供的最新情况和详细的意见。

关于 MDIO 和 MDC 信号的电平转换器,请参阅随附的图片,了解 U14 (MDIO) 和 U22 (MDC) 在板上的位置(黄色的)。您可以使用示波器探测它们的行为,以验证信号完整性。我同意,如果板是新的,除非存在制造缺陷,否则损坏的可能性很小。

PavelL_0-1754043975153.png

至于你关于设置时间的问题:在SMI接口上,在MDC的下一个上升沿对MDIO进行采样。这意味着设置时间要求适用于在该边缘之前有效的数据,不一定要在捕获中显示的当前边缘之前有效。因此,很容易满足设置时间的要求。

为了验证这种行为,我使用以下设置在 S32K148EVB-Q176 板上运行了 lwip_s32k148 示例:

软件:

  • S32 设计工作室 v3.5
  • SDK: s32sdk_s32k1xx_rtm_401

硬件:

  • rev-RMII 模式下的 TJA1103-SDBR 子板
  • PHY 地址:0x02
  • MDIO 线路上没有上拉电阻器

添加了 PHY 驱动程序并定义了 PHY 条目。

PavelL_1-1754044357429.png

创建了一个 FreeRTOS 任务来闪烁 LED,并使用 PHY_Read()定期读取两个 PHY 寄存器。我将 MSCR 设置设为默认值,结果是

  • MDC 频率: ~2.39 MHz
  • 保持时间:20 ns(MSCR.HOLDTIME = 0x0)
  • 保持时间:170 ns(MSCR.HOLDTIME = 0x7 - 由调试器设置)

PavelL_2-1754044404052.png

我尝试RESET PHY,但事实证明没有必要——所以我注释掉了相关的代码。

在电阻器 R46(MDIO)和 R38(MDC)上观察到信号。以下是完整的第 22 条读取交易的波形捕获:

  • 目标 PHY: 0x02
  • 读取寄存器:0x03
  • TJA1103 返回的数据:0xB013(游标之间)

PavelL_3-1754044640726.png

请尝试在示波器上捕获完整的第 22 条交易以进行比较。波形应类似于管理数据输入/输出中描述的时序图-维基百科

我无法查看您的全部代码(但还是要感谢您的分享)。但请注意,PHY_Read(以及其他 PHY 函数)的第一个参数不是 PHY 地址,而是 PHY 条目索引,因此应为 0 或 PHY_INSTANCE_0。PHY 地址必须在 PHY 条目内设置。

顺祝商祺!

帕维尔

Re: MDIORead always returning 0xFFFF on RMII interface我在 LAN8720A 的 1.5k 欧姆电阻上焊了一个 10k 欧姆电阻,它似乎太强了,把整个 3.3V 线路拉低到 1.5V 左右。它会破坏整个信号,所以这不是解决办法。收到我的 digi-key 订单后,我将尝试使用 1.5k 至 10k 之间的其他不同数值。请注意,我下周都在度假,因此无法跟进更多的调试工作。我将于美国东部时间 8 月 4 日星期一回来。Re: MDIORead always returning 0xFFFF on RMII interface

你好,帕维尔,感谢你的详细解答。我将尝试增加 3.3V 线路的上拉电阻,看看是否能改善信号。

至于 TXB0104 双向电平移位器,我不确定如何测试它们,甚至不确定它们在板上的位置。您能指导我这样做吗?而且板很新,所以我非常怀疑它是否坏了,除非它有缺陷。

对于我提出的设置时间问题,您有什么建议吗?我觉得很奇怪的是,MDIO 信号在 MDC 的上升沿之前至少 10 ns 没有触发信号,如我的照片所示。我将保持时间参数设置为 1 个周期,在我的情况下,48 MHz 的保持时间约等于 20 ns。数据手册中明确规定,设置时间必须至少为 10 ns。我测试了 phy 的读取和写入操作,均未显示设置时间。

christopherlajoie_0-1753448062961.png

再次感谢您的支持!


Re: MDIORead always returning 0xFFFF on RMII interface

你好,我是@克里斯托弗-拉佐伊

感谢您的详细跟进和测量。请在下面找到答案和建议:

  • MDIO 线路上的尖峰确实不同寻常。请尝试将上拉电阻增大到 10 kΩ 或更高。1.5 kΩ 上拉并非严格要求,在这种情况下可能过于激进。

  • S32K148-Q176 板在 MCU 和 PHY 之间使用 TXB0104 双向电平移位器。这些都会影响信号的形状和时间。请确认其操作是否正确,因为它们可能是 PTB4 上出现振铃或失真现象的原因。

  • 关于驱动强度:设置为 "高 "时,输出驱动器(更多晶体管)会更强,从而改善上升/下降时间并提高电流能力。这有助于提高信号完整性,尤其是在较长的线路或电容负载上。S32K1 数据表中记录了两者的区别。

  • 调整 MDC 频率意味着调整它以匹配 MDIO 线路的电气特性,包括上拉电阻、线路长度和寄生电容。虽然从技术上讲,MDC 的频率可达 2.5 MHz,但降低频率(如 500 kHz 或 250 kHz)有助于稳定边缘信号条件。不过,既然您已经尝试过了,但没有任何改善,那么问题可能出在其他地方。

  • 除了 MDC 通过 MSCR 寄存器从 ENET 模块时钟派生之外,内核时钟与 MDC 时钟之间没有严格的依赖关系。只要 MDC 符合规范,内核时钟就不会直接影响 MDIO 时序。


顺祝商祺!

帕维尔

Re: MDIORead always returning 0xFFFF on RMII interface

另一件事是 LAN8720A 数据表中,在表 5-12 中写道,参考 MDC 的上升沿进行数据输入的 MDIO 信号设置时间应至少为 10 ns。但是,我已经使用不插电的 phy 测量了未上电的板上的信号,它们似乎根本没有设置时间。是我忘记设置参数了吗?我设置了保持时间,但没有设置设置时间。见下图

Re: MDIORead always returning 0xFFFF on RMII interface

我还测量了 3.3V 和接地之间 MDIO 线路的电阻。当我仅在 phy(未插入恩智浦板)上测量时,3.3V 的电压为 1.5k 欧姆,GND 为 120k 欧姆。但是,如果我在插入板(未通电)时进行测量,3.3V 时会得到 1.5k 欧姆,但到 GND 会得到 2.9k 欧姆。我相信 PTB4 在断电时可能会使其沉没,但这也意味着 MDIO 线路在不插入板时可以正常工作。

Re: MDIORead always returning 0xFFFF on RMII interface

看来我可能错了,我刚刚测量了 MDIO 线路上的信号,没有插入 PCB(没有 phy),这意味着没有任何东西会响应 MCU 的读取请求,而信号实际上看起来是干净的!它的整体形式与坏信号相同,这意味着在 MDIO 线路上,phy 与 MCU 的交互以某种方式破坏了 MCU 的信号。见下图

Re: MDIORead always returning 0xFFFF on RMII interface

此外,我还在 R46 电阻上测量了 MDIO 信号,以确保问题不是出在我的 PCB 上。请看下图

Re: MDIORead always returning 0xFFFF on RMII interface

你好,帕维尔、

很高兴知道这一点!我想它一定是内部自动控制的,但我想确认一下。不过,恐怕这并不能解决我的问题。正如我之前提到的,MDIO 线路在 MDC 的时钟周期之间的高电平和低电平逻辑之间出现了这些快速尖峰,看起来并不像它应有的样子。PTB4 的线路和行为仍然存在问题。

按照您的建议,我尝试将 MDC 速度从 1 MHz 降到 500KHz 再降到 250KHz,但结果还是一样。总是那些锋利的尖刺。MDC 时钟似乎影响了我从 phy 的基本寄存器 1 获得的读数,我认为这是因为 MDIO 线路的问题,因为在正常情况下,只要 MDC 的速度低于 2.5MHz,就不会影响任何事情。核心时钟和 MDC 时钟之间是否存在某种必须遵循的关系?

我还尝试设置了 PTB4 的上拉功能。我尝试了上拉和下拉,但都没有成功。我很想知道高驱动力强度和低驱动力强度之间有什么区别?

最后,我不确定"调整 MDC 频率是什么意思" 根据我的理解,只要频率低于 2.5 MHz 就没有问题。由于这条线路是 MAC 和 phy 之间唯一共享的通信线路,我认为在与 PTB4 配对时,线路的电气性能可能出了问题。您对测试的内容有什么其他想法,或者有任何其他在 S32k148EVB-Q176 上完成的类似项目成功的例子吗?

感谢您一直以来的支持,非常感谢!

Re: MDIORead always returning 0xFFFF on RMII interface

你好,我是@克里斯托弗-拉佐伊

MDIO 引脚(PTB4)由 ENET 外设控制,该外设可自动管理方向(TX/RX)和第 22 条操作期间的开漏行为。无需手动将引脚配置为漏极开路。

将 MDC 频率降至 1 MHz 是一个很好的举措。您可以尝试降低频率(如 500 kHz),以提高稳定性和可视性。您的 PHY 没有 MDC 最大时钟限制:

MDC 边沿之间的最短时间为 160 ns。边缘之间没有最长间隔时间。最短周期时间(两个连续上升沿或两个连续下降沿之间的时间)为 400 ns。这些适中的时序要求使得微控制器的 I/O 端口可以轻松驱动该接口。

将驱动强度设置为 "高 "是一个很好的调整。

只需根据实际情况调整 MDC 频率即可。

顺祝商祺!

帕维尔

Re: MDIORead always returning 0xFFFF on RMII interface

你好,PaveIL、

非常感谢你的意见,你说的关于欠采样的问题是对的,我确实没有正确读取信号。我已经对它进行了正确的采样,以下是我的发现:
-在每个 phy_read () 交易中,MDIO 总线上写入信号的 MAC 似乎到处都是,但是 PHY 写入总线上的内容看起来很干净。
- 从我链接的图片来看,MAC 似乎无法正确地将线路拉低以发送逻辑 0,这导致在整个写入持续时间内,0V 和 3.3V 之间出现非常尖锐的峰值。
- 就我所见,写入的时间似乎没有问题。

我研究了一下,怀疑是不是 J16 连接器的 MDIO/PTB4 引脚出了问题。如下图所示,我已经对其进行了正确配置,但它似乎并不像一个漏极开路集电极那样工作。

我修改了配置,将 MDC 频率设为 1 MHz,所以图片上的读数才是 1 MHz。此外,保持时间设定为 3 个模块时钟周期(48MHz)。

christopherlajoie_0-1753290612216.png

谢谢您!

Re: MDIORead always returning 0xFFFF on RMII interface我已经成功地从寄存器 1 读取了 phy ID 编号,因此我相信在这种情况下 0 是正确的地址Re: MDIORead always returning 0xFFFF on RMII interface

您有没有尝试扫描其他 PHY 地址以防万一?我曾遇到过这样的情况:捆扎没有正确生效,PHY 出现在与预期不同的地址上。

Re: MDIORead always returning 0xFFFF on RMII interface

你好,我是@克里斯托弗-拉佐伊

我已经查看了所有可用的配置文件、初始化代码和提供的示波器捕获。现在 MDC 信号已正确配置,并以 2.4 MHz 频率运行。MDIO 线路具有适当的 1.5 kΩ 外部上拉电阻,ENET 外设已正确初始化。因此,剩下的问题似乎与信号观测有关,而不是功能故障。

感谢您提供最新信息和分享所有数据。根据您的描述和示波器捕获的内容,您观察到的 MDIO 信号不稳定性很可能是由于采样不足所致。

  • 每个 MDIO 事务(第 22 条读取)由 64 位组成,时钟频率约为 2.4 MHz → 总持续时间约为 27 µs。
  • 由于时基为 500 µs/div,示波器每笔交易只能捕获几个样本。
  • 这可能导致波形失真或部分失真,类似放电/充电曲线或 "V 形 "骤降。

由于 PHY 读取现在返回的是有效数据,而且 MDC 信号被确认为正确,因此 MDIO 线路很可能运行正常。

建议采取的下一步措施:

  • 将示波器设置为 1-5 µs/格时。
  • 在 MDC 上升沿触发。
  • 在已知的 phy_read () 期间以单发模式捕获。

这样就可以观察到完整的 MDIO 交易并确认信号完整性。

顺祝商祺!

帕维尔

Re: MDIORead always returning 0xFFFF on RMII interface此外,有时 MDIO 上的 V 形信号没有与 MDC 的下降沿同步,只能降到 1.5V-2VRe: MDIORead always returning 0xFFFF on RMII interface

下面是两个信号灯的更多合影

Re: MDIORead always returning 0xFFFF on RMII interface

最新的情况是,我发现我没有为 MDC 复用正确的引脚,更改引脚后,MDC 信号在 2MHz 频率下非常完美。不过,我在 MDIO 稳定性方面仍有问题。Mac 可以从 phy 读取数据,但链接的稳定性非常糟糕。我附上了一些示波器读取 MDIO 数据的图片。我逐渐明白,PTB4 引脚(MII_RMII_MDIO)应为开漏引脚,以便 MAC 和 Phy 都能向其写入数据。但我在引脚复用菜单中没有看到该选项,而且它被锁定为输入/输出引脚。我的印象是,phy 和 mac 出于某种原因正在争夺它。此外,图片上 3.3V 附近的信号看起来像是放电/充电曲线。

标记 (1)
无评分
版本历史
最后更新:
‎11-20-2025 04:38 PM
更新人: