TI TLK105L/TLK106L以太网PHY寄存器配置与调试实战指南

📅 2026/7/23 10:54:59 👁️ 阅读次数 📝 编程学习
TI TLK105L/TLK106L以太网PHY寄存器配置与调试实战指南

1. 项目概述与核心价值

如果你正在开发一款嵌入式网络设备,比如工业交换机、PLC控制器或者智能网关,那么你大概率绕不开一个核心芯片:以太网PHY。这东西就像网络世界的“翻译官”,负责把MAC层发来的数字信号,变成能在网线上跑的模拟信号,反之亦然。而控制这位“翻译官”行为的,就是它内部那一堆寄存器。今天,我们就来深扒一下德州仪器(TI)的TLK105L和TLK106L这两款经典百兆PHY的寄存器手册,这可不是照本宣科地翻译数据手册,而是结合我这些年调试PHY踩过的坑、调通的经验,把那些枯燥的位域(Bit Field)变成你能直接用在代码里的逻辑。

为什么是TLK105L/TLK106L?这两款芯片在工业、车载、消费电子领域应用非常广泛,稳定、可靠,功能也足够丰富。但它的寄存器手册有几十页,密密麻麻的表格,新手看了直接头大。寄存器配置错了,轻则网络不通、速度不对,重则出现各种玄学问题,比如间歇性断线、大量CRC错误,调试起来能让人崩溃。所以,吃透这些寄存器,不仅仅是“配通”网络,更是“配好”、“配稳”网络,实现产品差异化的关键。比如,你想实现快速链路故障检测(Fast Link Down)来提升系统可靠性,或者想通过LED灯的不同闪烁模式来直观显示网络状态,这些高级功能都藏在寄存器里。

本文的目标读者,是那些已经知道MII、RMII接口怎么接,但对着PHY寄存器不知道从何下手的嵌入式软件工程师、硬件工程师,或者任何需要对网络物理层进行深度定制的开发者。我会从最基础的BMCR、BMSR寄存器讲起,确保你能让PHY跑起来,然后深入到自动协商的细节、各种高级控制寄存器(CR1/CR2/CR3),最后再分享一些调试中“踩坑”才能得到的经验,比如如何正确读取锁存(Latched)状态位,如何利用PHY状态寄存器(PHYSTS)快速定位问题。我们不止讲“这个位是干什么的”,更重点讲“你为什么要配置它”以及“配置错了会怎样”。

2. 寄存器访问基础与核心概念解析

在深入每个寄存器之前,我们必须统一语言,理解几个贯穿始终的核心概念。PHY寄存器通常通过MDIO(Management Data Input/Output)接口访问,这是一个两线制的串行管理接口。你可以把它想象成I2C,但专用于以太网PHY管理。每个寄存器有一个5位的地址(0x00到0x1F是标准寄存器,0x10及以上通常是厂商扩展寄存器)和一个16位的数据值。

当你读数据手册的寄存器表格时,会看到“DEFAULT”列下有一些缩写,它们定义了寄存器的行为特性,理解这些是正确编程的前提:

  • RW (Read/Write):最常见的类型,可读可写。你配置它,PHY按你的配置工作;你读取它,返回当前配置值。
  • RO (Read Only):只读。通常是状态寄存器,用于反映PHY的当前运行状态,比如链路是否建立、速度是多少。你写它没用。
  • RO/P (Read Only, Permanent):永久只读。这个值在芯片制造时就已经固定了,比如PHY标识符(OUI和型号),用于软件识别芯片型号。你读到的总是一个常量。
  • RW/SC (Read Write/Self Clearing):可读写,但具有自清除特性。这是非常关键的一类。典型例子是BMCR的软件复位位(bit 15)。你向它写1,触发复位操作。你紧接着再读它,可能还是1,因为复位正在进行中;当复位完成后,硬件会自动将其清0。如果你在代码里写了一个1之后,不断循环读这一位等待它变0,这就是正确的做法。如果你错误地以为写1后它立刻变0,就可能出问题。
  • RO/COR (Read Only, Clear on Read):只读,读后清除。这是一种“事件标志”位。当某个事件(比如收到一个自动协商页面)发生时,硬件将此位置1。当你通过MDIO读取这个寄存器后,硬件会自动把这一位清0。如果你需要持续监控这个事件,就需要在代码中缓存这个状态,或者理解它的瞬时性。
  • LH/LL (Latched High/Low):锁存高/低。这也是一种事件标志,但它的清除条件不同。LH位在事件发生时被锁存为1,并保持为1,直到你读取这个寄存器,它才会被清除。LL则相反。这保证了软件不会错过短暂发生的事件。BMSR中的“远程故障(Remote Fault)”位就是一个RO/LH位。
  • Pin_Strap:引脚 strap。这意味着该位的上电默认值不是固定的,而是由芯片的某个硬件引脚(strap pin)在上电复位时的电平状态决定的。这为硬件设计提供了灵活性,比如可以通过一个电阻选择默认是100M全双工还是10M半双工。

实操心得:理解“锁存”与“清除”区分RW/SC、RO/COR和LH/LL是调试的基石。我曾经遇到一个Bug,现象是PHY偶尔上报“远程故障”,但实际链路没问题。查了半天代码,发现同事在中断服务程序里频繁读取BMSR寄存器来检查链路状态,这无意中把LH的远程故障标志位给清除了,导致主程序轮询时看不到历史故障记录,无法正确记录日志。正确的做法是:在需要检查事件时,读取寄存器并保存到变量中进行分析,避免无意义的重复读取冲刷掉状态标志。

3. 核心寄存器详解与配置实战

掌握了基本概念,我们开始啃硬骨头。我会把寄存器分组,按照“初始化配置 -> 状态监控 -> 高级功能”的顺序来讲解。

3.1 基础控制与状态寄存器:让PHY跑起来

这组寄存器是PHY工作的基石,任何驱动都必须正确处理它们。

3.1.1 基本模式控制寄存器(BMCR - 0x00)

这是PHY的“总开关”。上电后,对PHY的第一次操作往往就是写BMCR。

名称默认值功能详解与配置要点
15复位 (Reset)0, RW/SC软件复位位。写1启动复位,复位完成后硬件自动清0。必须等待清0后才能进行后续配置。典型操作:write(BMCR, 0x8000); while(read(BMCR) & 0x8000);
14MII环回 (Loopback)0, RW置1时,PHY内部将发送数据直接环回到接收路径。用于芯片自检和调试MAC层,正常工作时必须为0。
13速度选择 (Speed Select)1, RW仅在自动协商禁用时有效。1=100Mbps, 0=10Mbps。如果开启了自动协商(bit 12=1),此位被忽略,速度由协商结果决定。
12自动协商使能 (Auto-Negotiation Enable)1, RW核心位。1=启用自动协商(推荐)。0=强制模式,此时需要手动设置bit 13(速度)和bit 8(双工)。
11节能模式 (Power Down)0, RW1=进入低功耗模式,PHY大部分功能关闭。通常由系统电源管理调用。
10隔离 (Isolate)0, RW1=隔离PHY与MII接口(管理接口除外)。用于故障隔离或测试,正常工作时为0。
9重启自动协商 (Restart Auto-Negotiation)0, RW/SC自清除位。写1会重新启动自动协商过程。当你改变了广告能力(ANAR寄存器)后,需要写此位来让新配置生效。
8双工模式 (Duplex Mode)1, Pin_Strap仅在自动协商禁用时有效。1=全双工,0=半双工。默认值由硬件引脚决定。
7冲突测试 (Collision Test)0, RW用于测试MII COL信号功能,普通应用设为0。

配置流程示例(强制100M全双工模式):

  1. 软件复位:写BMCR(0x8000) -> 等待复位完成
  2. 关闭自动协商,设置速度100M,全双工:BMCR值 = 0x0000 (禁用自协商) | 0x2000 (100M) | 0x0100 (全双工) = 0x2100
  3. 写入配置:写BMCR(0x2100)
  4. 等待链路建立:轮询BMSR的Link Status位(bit 2)

配置流程示例(启用自动协商模式):

  1. 软件复位。
  2. 配置广告能力寄存器(ANAR,后文详述),例如广告支持100M全/半双工、10M全/半双工。
  3. 启用自动协商:BMCR值 = 0x1000 (启用自协商)。也可以同时设置bit 13和8,但它们会被忽略。
  4. 写入配置:写BMCR(0x1000)
  5. (可选)如果需要立即开始协商,可以再写一次BMCR,将bit 9置1。
  6. 等待自动协商完成:轮询BMSR的Auto-Negotiation Complete位(bit 5)和Link Status位(bit 2)
3.1.2 基本模式状态寄存器(BMSR - 0x01)

这个寄存器是PHY的“仪表盘”,反映了它的固有能力、当前状态和事件。

名称默认值功能详解与解读
15100Base-T4能力0, RO/PTLK10xL不支持T4,永远为0。
14-11速度/双工能力1, RO/P只读,反映PHY硬件支持的能力。对于TLK10xL,bit 14(100TX_FD), bit 13(100TX_HD), bit 12(10T_FD), bit 11(10T_HD) 都为1,表示支持100M全/半双工和10M全/半双工。
5自动协商完成 (Auto-Negotiation Complete)0, RO关键状态位。1表示自动协商过程已成功完成。在启用自协商后,必须查询此位为1,且Link Status也为1,才算真正建立链路。
4远程故障 (Remote Fault)0, RO/LH锁存事件位。1表示对端设备报告了故障(通过自协商报文)。读此寄存器后该位会被清除。用于诊断网络对端问题。
3自动协商能力1, RO/P表示本PHY支持自动协商,TLK10xL为1。
2链路状态 (Link Status)0, RO/LL最核心的状态位。1表示物理链路已建立(无论速度如何)。这是一个LL位,链路断开时会自动清0,但链路建立时置1后不会因读取而清除。驱动应持续监控此位。
1Jabber检测0, RO/LH仅在10M模式有意义,检测到过长的帧时置位。读后清除。
0扩展能力1, RO/P为1表示PHY支持扩展寄存器(地址>=0x10),TLK10xL支持。

注意事项:状态位的读取策略对于BMSR这类混合了永久位、状态位和锁存事件位的寄存器,在软件设计时要区分对待。例如,PHY的能力位(bit15-11, bit3, bit0)只需要在上电初始化时读取一次并缓存。而链路状态(bit2)需要定期轮询或配置中断来监控。对于远程故障(bit4)这类LH位,建议在链路状态变化时或定期诊断时读取一次并记录,而不是在高速轮询循环中读取,以免丢失历史故障信息。

3.2 自动协商相关寄存器:让PHY“握手”成功

自动协商是以太网设备“对话”并确定最佳连接方式的过程。TLK10xL的相关寄存器非常标准。

3.2.1 自动协商广告寄存器(ANAR - 0x04)

这个寄存器告诉对端:“我有哪些本事”。你需要根据产品需求来配置它。

名称默认值功能与配置建议
15下一页 (NP)0, RW通常设为0,不使用下一页功能。
13远程故障 (RF)0, RW如果你检测到本地故障并想通知对端,则置1。通常为0。
11不对称暂停 (ASM_DIR)0, RW流量控制相关。如果需要高级流量控制功能,需与MAC配合设置。普通应用设为0。
10对称暂停 (PAUSE)0, RW流量控制相关。如果需要IEEE 802.3x流控,置1。普通应用设为0。
8100B-TX全双工1, RW建议置1,广告支持100M全双工。
7100B-TX1, RW建议置1,广告支持100M半双工。
610B-T全双工1, RW建议置1,广告支持10M全双工。
510B-T1, RW建议置1,广告支持10M半双工。
4:0选择器字段00001, RW固定为00001,表示支持IEEE 802.3u(快速以太网)。

典型配置:如果你希望PHY既能接千兆交换机(通常协商为100M全双工),也能接老旧的10M设备(协商为10M半双工),那么应该将bit 8,7,6,5都置1。即ANAR = 0x01E1。配置完ANAR后,需要向BMCR的bit 9(重启自协商)写1,或者先禁用再启用自协商(操作BMCR bit 12),才能使新的广告能力生效。

3.2.2 自动协商链路伙伴能力寄存器(ANLPAR - 0x05)与扩展寄存器(ANER - 0x06)
  • ANLPAR:只读寄存器。在自动协商完成后,这里保存了对端设备(链路伙伴)广告的能力。你可以通过读取这个寄存器,知道对端支持什么速度、双工模式和流控能力。例如,如果读到bit8=1且bit7=0,说明对端只支持100M全双工,不支持半双工。
  • ANER:提供了自协商过程的额外状态。其中比较有用的位是:
    • Bit 1 (PAGE_RX): RO/COR位。当收到一个新的链路码字(Link Code Word)时置1。可用于监控自协商过程中的报文交换。
    • Bit 0 (LP_AN_ABLE): 表示链路伙伴是否支持自动协商。如果不支持(读为0),而本地又启用了自协商,那么PHY会进入“并行检测”模式,尝试与不支持自协商的老设备(如10BASE-T)建立连接。

3.3 高级控制寄存器:性能调优与特殊功能

TI在TLK10xL中提供了多个控制寄存器(CR1, CR2, CR3)来实现超越标准的功能,这是产品差异化的关键。

3.3.1 控制寄存器1(CR1 - 0x09):链路建立与MDI/MDIX优化

这个寄存器主要优化链路建立过程和MDI/MDIX自动翻转。

名称默认值功能详解与应用场景
9RMII增强模式0, RW针对RMII接口的优化。在普通模式下,当检测到错误时,CRS_DV可能保持有效。增强模式下,遇到错误载波或符号错误时,CRS_DV会更快地被取消断言,有助于MAC层更快地识别错误包。在RMII接口且对错误敏感的应用中建议启用
6快速自动MDI-X0, RW当两端都强制为100M模式(禁用自协商)时,启用此模式可以加快MDI/MDIX自动翻转的判定速度。如果网络环境固定,两端设备均强制模式,可以开启以加速连接
5强健自动MDI-X0, RW强烈推荐启用。此模式解决了“MDI/MDIX死锁”问题。当一端是自协商,另一端是强制模式,或者两端都是强制模式但配置不匹配时,普通自动翻转可能失败。强健模式能处理这些非标准场景,极大提高线缆连接的兼容性。
4, 3:2快速自协商使能与选择0, RW可以大幅缩短自协商时间。标准自协商可能需要几百毫秒,快速模式可缩短到几十毫秒。但必须确保链路两端PHY都配置为相同的快速自协商时序,否则可能导致协商失败。Fast AN Selbits 选择具体超时参数。

配置建议:对于需要快速上电并建立链路的设备(如工业IO模块),可以这样配置:CR1 = 0x0060(即启用强健自动MDI-X,bit5=1)。如果需要更快,可以研究并启用快速自协商模式,但务必在对端设备上也做相应配置或确认兼容性。

3.3.2 控制寄存器2(CR2 - 0x0A):链路行为与LED控制

这个寄存器控制链路断开行为和LED指示。

名称默认值功能详解
15100BT强制远端链路断开0, RW特殊功能。在强制100M模式下,当本地链路丢失时,PHY会主动停发信号,促使对端也断开链路。这确保了链路两端状态同步,适用于需要严格故障同步的系统。非标准行为,需谨慎使用
5扩展全双工能力0, RW当本地为强制100M模式,且对端也是强制100M模式时,若启用此位,则强制使用全双工。用于兼容一些不按标准实现的老设备。通常保持默认0。
4增强型LED链路功能0, RW启用后,LINK LED只在100M全双工模式下常亮。在其他模式(如10M、半双工)下,即使链路建立,LINK LED也不亮。这可以用于直观区分高速/全双工连接和低速/半双工连接。
3100M半双工时隔离MII0, RW当链路协商或强制为100M半双工时,如果启用此位,PHY会隔离MII输出。用于某些特殊的测试或故障安全场景,通常为0。
0RMII接收时钟选择0, RW选择RMII接口的RXD数据参考时钟。0=参考外部XI时钟,1=参考RX_CLK。必须根据硬件原理图上RMII时钟的提供方式(来自PHY或外部晶振)来严格配置此位,配错会导致通信完全失败。
3.3.3 控制寄存器3(CR3 - 0x0B):端口镜像与快速链路断开

这个寄存器功能强大,包含硬件端口镜像和多种快速链路断开检测机制。

名称默认值功能详解
6, 5极性反转与MDI/MDIX交换0, RW这两个位组合用于实现硬件端口镜像。同时置1时,PHY会交换收发线对并反转极性,使得网络分析仪可以跨接在单端口上监听流量,而无需配置交换机的镜像端口。这是硬件调试的利器
10, 3:0快速链路断开模式0, RW工业级应用的关键特性。标准以太网在链路信号丢失后,可能需要几十到几百毫秒才报告链路断开。快速链路断开可以在10微秒级别内检测到故障并断开链路,极大提升系统的故障响应速度。这是一个“或”逻辑,可以同时启用多种检测条件:
• Bit 10: 解扰器失锁。
• Bit 3: MII接口RX错误计数超阈值。
• Bit 2: 线路上MLT3编码错误超阈值。
• Bit 1: 信噪比(SNR)过低。
• Bit 0: 信号/能量丢失(最快)。
启用bit 0和bit 1是常见的组合,能在信号劣化初期就断开链路,避免传输大量错误数据。

快速链路断开配置示例:为了在信号丢失或严重劣化时快速反应,可以配置CR3 = 0x0003(即启用bit 0和bit 1)。同时,可以通过读取快速链路断开状态寄存器(FLDS - 0x0F)来查询具体是哪一种原因导致了快速断开,便于故障诊断。

3.4 扩展寄存器访问与状态寄存器

3.4.1 扩展寄存器间接访问机制(REGCR & ADDAR)

TLK10xL的扩展寄存器(地址 >= 0x0010)需要通过两个寄存器间接访问:寄存器控制寄存器(REGCR, 0x0D)和地址/数据寄存器(ADDAR, 0x0E)。这个过程类似通过一个地址指针去访问内存。

  1. 设置地址指针:向REGCR写入0x001F(DEVAD=11111,选择厂商特定MMD,功能位=00表示地址模式)。然后向ADDAR写入你想访问的扩展寄存器地址(例如PHY状态寄存器PHYSTS的地址0x10)。
  2. 读写数据:再次向REGCR写入0x401F(功能位=01,数据模式,无后递增)。此时,对ADDAR的读写操作,就会指向步骤1中设置的地址(0x10)所对应的寄存器。
  3. (可选)自动递增:如果需要对连续地址的扩展寄存器进行批量读写,可以使用功能位=10(读写后地址均递增)或11(仅写后地址递增)的模式,提高效率。

避坑指南:扩展寄存器访问时序在设置REGCR功能位和操作ADDAR之间,必须保证足够的MDIO访问间隔。有些MCU的MDIO驱动速度很快,连续写入REGCR和ADDAR可能导致PHY内部状态机来不及响应,造成访问失败。一个稳妥的做法是在写REGCR后,插入一个小的延时(例如读取一次无意义的寄存器),再进行ADDAR操作。

3.4.2 PHY状态寄存器(PHYSTS - 0x10)

这是一个非常实用的“一站式”状态寄存器,汇集了多个关键状态信息,避免了频繁读取多个寄存器。

名称说明与调试价值
14MDI-X模式状态实时显示当前是MDI还是MDI-X连接,有助于排查线序问题。
13接收错误锁存RO/LH位。自上次读取RX错误计数寄存器后,是否有接收错误发生。是快速判断链路质量的一个标志。
12极性状态显示检测到的线对极性是否正确。不正确的极性可能导致连接不稳定。
11虚假载波锁存RO/LH位。指示是否检测到虚假载波,可能与电磁干扰有关。
10, 9信号检测与解扰器锁定100M模式下的底层信号状态。Signal Detect表示检测到能量,Descrambler Lock表示成功锁定并解扰数据流。这两个位是判断物理层是否正常工作的最直接依据。即使链路状态为UP,如果Descrambler Lock为0,通信也必然失败。
7MII中断表示有内部中断 pending,需要读取MISR(0x12)寄存器确认中断源。
4, 2, 1, 0自协商完成、双工、速度、链路状态这些是BMSR中关键状态的“镜像”,但读取PHYSTS不会清除BMSR中的LH/LL位。在需要频繁查询当前运行状态(而非事件)时,读PHYSTS效率更高。

调试实战:当网络不通时,我的第一反应是读取PHYSTS。如果bit 0(Link Status)为0,我会接着看bit 10和9。如果bit 10为0,说明网线可能没插好或对端没电;如果bit 10为1但bit 9为0,说明有信号但无法同步,可能是线缆质量太差、距离过长或干扰严重。如果链路为UP(bit 0=1),但通信仍有问题,我会检查bit 2和1确认双工和速度是否与预期一致,避免出现“一端全双工,一端半双工”的经典双工不匹配问题。

4. 典型配置流程与调试技巧实录

理解了各个寄存器,我们将其串联起来,形成一套可操作的配置与调试流程。

4.1 上电初始化标准流程

  1. 硬件复位/上电:等待电源稳定(通常几毫秒)。
  2. 软件复位:写BMCR(0x8000),并循环读取直到bit 15变为0。这是必须的,确保PHY处于已知状态。
  3. (可选)读取PHY ID:读取PHYIDR1(0x02)和PHYIDR2(0x03),验证是否为TLK105L(OUI: 0x080028)或TLK106L,确保驱动与硬件匹配。
  4. 配置广告能力:根据需求写ANAR寄存器。例如,通用配置为0x01E1
  5. 配置高级功能:根据应用需求,配置CR1、CR2、CR3。例如,对于工业应用,启用强健自动MDI-X和快速链路断开:CR1=0x0020,CR3=0x0003
  6. 启用自动协商:写BMCR,将bit 12置1(例如0x1000)。如果需要立即开始,再写一次BMCR将bit 9置1。
  7. 等待链路建立
    • 延迟一段时间(如50ms)让自协商进行。
    • 轮询BMSR的bit 5(自协商完成)和bit 2(链路状态),直到两者都为1。
    • 更高效的做法是配置PHY的中断,并通过MISR寄存器来响应链路变化事件。
  8. 确认最终模式:链路建立后,读取PHYSTS的bit 4,2,1,0,或读取ANLPAR和BMSR,确认最终协商出的速度、双工模式是否符合预期。

4.2 常见问题排查速查表

现象可能原因排查步骤与解决方法
链路始终无法建立(Link Status=0)1. 物理连接问题
2. 对端设备不支持或未上电
3. 自协商配置错误
4. MDI/MDIX不匹配
1. 检查网线、连接器。
2. 读取PHYSTS bit 10 (Signal Detect)。为0则无信号。
3. 检查ANAR配置是否与对端能力匹配。尝试强制模式(BMCR bit12=0,手动设速度双工)。
4. 启用CR1的“强健自动MDI-X”(bit5)。或尝试交叉线。
链路时通时断1. 线缆质量差、距离过长
2. 电磁干扰
3. 双工不匹配
4. 电源噪声
1. 查看PHYSTS bit 9 (Descrambler Lock)是否频繁跳动。
2. 读取BMSR bit 4 (Remote Fault)或PHYSTS bit 11 (False Carrier)。
3.重点排查:读取PHYSTS bit 2和1,确认本地与对端双工设置是否一致。强制为相同双工模式测试。
4. 检查电源纹波,PHY的模拟电源AVDD要求较高。
链路已建立但无法通信(Ping不通)1. MAC层配置错误(速度、双工)
2. RMII时钟模式错误
3. 隔离位被误置位
1.确保MAC的配置与PHYSTS读出的速度/双工模式完全一致。这是最常见原因。
2. 检查CR2 bit 0 (RMII Receive Clock)设置是否正确。
3. 检查BMCR bit 10 (Isolate)是否为0。
性能差(吞吐量低,延迟高)1. 半双工模式下的冲突
2. 流控未启用导致丢包
3. 快速链路断开过于敏感
1. 强制为全双工模式测试。
2. 检查ANAR和ANLPAR的PAUSE位,确保两端流控协商正确。在MAC层启用流控。
3. 检查CR3的快速链路断开配置,如果启用了基于错误计数的条件(如bit 3,2),且阈值设置不当,可能在稍有干扰时就断链,导致重传。调整阈值或禁用相关条件。
LED指示灯行为异常1. LED配置寄存器未设置
2. 增强型LED模式影响
1. TLK10xL的LED行为可通过PHYCR等扩展寄存器配置,检查是否被修改。
2. 如果启用了CR2 bit 4 (Enhanced LED Link),则LINK LED只在100M全双工下常亮。

4.3 高级调试技巧:利用中断与状态寄存器

轮询效率低,对于需要快速响应链路事件的系统,应使用中断。

  1. 配置中断掩码:通过扩展寄存器(如MISR相关的掩码寄存器)使能你关心的事件,例如链路状态变化、自动协商完成、远程故障等。
  2. 连接中断线:将PHY的INT/PWDN引脚连接到MCU的外部中断输入引脚,并配置为下降沿或低电平触发。
  3. 中断服务程序:当中断发生时,在ISR中读取MII中断状态寄存器(MISR - 0x12),确定具体的中断源。然后读取相应的状态寄存器(如PHYSTS、BMSR)来获取详细信息并处理。
  4. 清除中断:根据数据手册,有些中断标志读状态寄存器即可清除,有些需要写特定寄存器清除。务必按手册操作。

最后,再分享一个硬件上的小经验:TLK105L/TLK106L的模拟电源(AVDD)对噪声非常敏感。在PCB布局时,务必确保AVDD的滤波电容(通常是0.1uF和10uF的组合)尽可能靠近芯片的电源引脚,并且有独立、干净的地回路。我曾经遇到一个案子,PHY在大量数据传输时随机丢包,折腾了半天寄存器配置,最后发现是AVDD的电容布局不当,电源纹波超标导致的。用示波器看一下电源质量,有时比调一天寄存器都管用。