This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DP83TC814x-Q1在执行 TDR 测试时通常显示测试失败。

Guru**** 667810 points
Other Parts Discussed in Thread: DP83TC814S-Q1, DP83TC814R-Q1
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1219690/dp83tc814x-q1-often-show-test-failed-when-execute-tdr-test

主题中讨论的其他器件:DP83TC814R-Q1、DP83TC814S-Q1

我只是在下面实施 TDR 跟随 和 snla389 ,但它通常  在0x1E[1]中显示1 : 1。

通过将寄存器0x1E 中的位[15]置位来激活 TDR。 操作步骤如下。
DP83TC814S-Q1、DP83TC814R-Q1
SNLS663–2021年12月 www.ti.com
34提交文档反馈版权所有Copyright2021 Texas Instruments Incorporated
产品文件夹链接:DP83TC814S-Q1 DP83TC814R-Q1
•根据 SNLA389应用手册中的初始化设置配置 DP83TC814-Q1
•确保连接到 PHY 的链路伙伴已滑动。 在 TDR 执行期间链路将断开。
•运行 SNLA389中列出的 Pre-TDR 配置设置。
•通过将寄存器0x1E[15]设置为"1"来启动 TDR。
•等待100ms、读取寄存器0x1E[1]:0]
–如果读数为0b10,则 TDR 已成功执行。
•如果 TDR 成功执行、则读取寄存器0x310以获取 TDR 结果。
–0x310[8]:0 =未检测到半线开路或1 =检测到半线开路
–0x310[7]:0 =未检测到电缆故障或1 =检测到电缆故障
–0x310[6]:0 =电缆故障开路或1 =电缆故障短路
–如果检测到有效电缆故障,则0x310[5:0]将以米为单位存储位置值。

我的代码如下所示

ETH_setRegister (0x0834、0xC001、true);
睡眠(1);

ETH_setRegister (0x0523、0x0001、false);
ETH_setRegister (0x0827、0x4800、false);
ETH_setRegister (0x0301、0x1701、false);
ETH_setRegister (0x0303、0x023d、false);
ETH_setRegister (0x0305、0x0015、false);
ETH_getRegister (0x0306、regVal、false);

regVal =(regVal|0x0010);

ETH_setRegister (0x0306、regVal、false);
ETH_setRegister (0x001f、0x4000、false);
usleep (120000);//等待复位
ETH_setRegister (0x0523、0x0000、false);
ETH_setRegister (0x001f、0x0000、false);

RET = ETH_setRegister (0x001e、0x8000、false);//bit15 1:开始电缆测量0:禁用电缆诊断

while (true)

RET = eth_getRegister (0x001E、regVal、false);
if (ret)

log (error)<< std::hex << regVal << endl;
measurementResult = regVal & 0x3;//位0:1
if (3 == measurementResult)//完成并失败

VAL = Ethernet_OPEN_ERROR;
// log (error)<< Cable test failed"<< endl;
返回支架;
}
else if (2 == measurementResult)//complete 且 not fail

// log (warning)<<"cable test completed success"(电缆测试完成成功)<< endl;
中断;
}
方案

//不执行任何操作,循环
nRetrycnt++;
如果(ETH_RETRY_READ_REG_MAX < nRetryCnt)

VAL = Ethernet_unknown;
// log (error)<<"eth_getCableDiagResult、Retry failed!!!! "<<结束;
返回支架;
}
usleep (ETH_DELAY_READ_REG_MS);
}
}
方案

VAL = Ethernet_OPEN_ERROR;
// log (error)<<"cable test failed, get register failed"<< endl;
返回支架;
}

}

REt = eth_getRegister (0x0310、regVal、false);
if (ret)

// log (error)<< std::hex << regVal << endl;
if (bit_TST (regVal、7))

if (bit_TST (regVal、6))

VAL = Ethernet_OPEN_ERROR;
// log (error)<<"eth_getCableDiagResult Ethernet_open_error1"<< endl;
}
方案

VAL = Ethernet_SHORT_ERROR;
// log (error)<<"eth_getCableDiagResult Ethernet_short_error"<< endl;
}
}
否则为(BIT_TST (regVal、8))

VAL = Ethernet_OPEN_ERROR;
// log (error)<<"eth_getCableDiagResult Ethernet_open_error2"<< endl;
}
方案

VAL = Ethernet_NO_FAULT;
// log (error)<<"eth_getCableDiagResult Ethernet_no_fault"<< endl;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的杨明:

    eth_setRegister (0x0834、0xC001、true);

    应写入寄存器0x1834h 而不是0x0834。

    请参阅以下应用手册中的 TDR 部分:

    https://www.ti.com/lit/an/snla389a/snla389a.pdf?ts=1682357799346&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FDP83TC814S-Q1

    此外、访问扩展寄存器时、请确保遵循数据表中所述的扩展寄存器空间访问读取/写入序列(第8.4.9节):

    https://www.ti.com/lit/ds/symlink/dp83tc814s-q1.pdf?ts=1682357943409&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FDP83TC814S-Q1

    此致、
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ,我已经尝试了0x0834->0x1834,但它是相同的,其他状态链接状态/主,从/ SQI/phyid...等我得到了正常,只是 TDR 失败。

    如果我不配置"Reg[0x0305]= 0x0015"、则代工厂代工厂代工厂代工厂代工厂代工厂代工厂代工厂代工厂代工厂编、  

    所以,我有以下问题:

    1:在 TDR 期间是否有必要配置305?

    2:如果是、问题是什么? 我该如何解决?

    3:关于寄存器1834和0834、我在驱动程序示例中看到访问0834 (链接:gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - ti-analog-linux-kernel/analog-linux.git/blob - drivers/net/phy/dp83tc812.c)、不能访问类似数据表的1834。 为什么?

    驱动程序代码:

    如果(dp83812->IS_MASTER)
    RET = phy_write_md (phydev、DP83812_DEVADDR_MMD1、0x0834、0xc001);
    // ret = phy_write_md (phydev、DP83812_DEVADDR、0x0834、0xc001);
    方案
    RET = phy_write_md (phydev、DP83812_DEVADDR_MMD1、0x0834、0x8001);
    // ret = phy_write_md (phydev、DP83812_DEVADDR、0x0834、0x8001);

    数据表

    8.6.2.89 MMD1_PMA_CTRL_2寄存器(地址= 1834h)[复位= 8000h]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还发现、如果我使用下面的头连接导线、也会导致 TRD 失败。(1Eh 位0 TDR_FAIL 为1)、2个引脚 TRD_P/TRD_M 是否开路、短路、连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Yang:

    如果没有配置  Reg[0x0305]= 0x0015、TDR 是否正在通过?

    此致、
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Yang:

    在驱动器中、 DP83812_DEVADDR_MMD1将值进行偏移1。

    1:在 TDR 期间是否需要配置305?

    是的、必须按照应用手册中所述使用它。

    我们已在末端通过汽车连接器测试了 TDR、但没有对香蕉捕捉器进行测试。  

    您是否可以尝试使用汽车连接器对其进行测试?

    谢谢。
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我用的是汽车连接器、但看起来是一样的。寄存器0x305必须配置为0x15? 还是根据 实际情况需要?

    TDR 中使用了这2个文件(hpf_gain_TDR、Pgd_gain_TDR)是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    寄存器0x305必须按照应用手册中所述进行配置。

    您能否分享正在写入的寄存器写入? 以及您的测试设置图片。

    谢谢。
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Rahul

    下面是我的驱动程序中的初始代码:

    静态 void indirial_write (struct phy_device * phydev、u32 Regnum、U16 val)

    PHY_WRITE (phydev、0x0d、0x1f);
    PHY_WRITE (phydev、0x0E、Regnum);
    PHY_WRITE (phydev、0x0d、0x401f);
    PHY_WRITE (phydev、0x0E、val);
    }

    静态 void indirial_WRITE_mmd1 (struct phy_device * phydev、u32 Regnum、U16 val)

    PHY_WRITE (phydev、0x0d、0x01);
    PHY_WRITE (phydev、0x0E、Regnum);
    PHY_WRITE (phydev、0x0d、0x4001);
    PHY_WRITE (phydev、0x0E、val);
    }

    静态 int ti81x_soft_reset (struct phy_device *phydev、bool isHardReset)

    U16 MDIO_DATA = 0;

    MDIO_DATA = phy_read (phydev、0x1f);//reg:PHYCR

    if (硬复位)

    BIT_SET (MDIO_DATA、15);
    }否则

    BIT_SET (MDIO_DATA、14);
    }

    PHY_WRITE (phydev、0x1f、MDIO_DATA);

    msleep(100);

    printk ("ti81x_soft_reset %d**\n"、isHardReset);

    返回0;
    }

    初始化代码:

    INDIRECT 写入(phydev、0x523、0x0001);//禁用链路建立启动、直到配置完成

    MDIO_DATA = INDIRECT、READ_mmd1 (phydev、0x0834);//access MMD1、


    BIT_SET (MDIO_DATA、14);
    BIT_SET (MDIO_DATA、0);
    INDIRECT 写入_mmd1 (phydev、0x0834、MDIO_DATA);//configure PHY 主器件

    indirial_write (phydev、0x81c、0x0fe2);
    indirial_write (phydev、0x872、0x0300);
    indirial_write (phydev、0x879、0x0f00);
    INDIRECT 写入(phydev、0x806、0x2952);
    INDIRECT 写入(phydev、0x807、0x3361);
    indirial_write (phydev、0x808、0x3d7b);
    indirial_write (phydev、0x83e、0x045f);
    indirial_write (phydev、0x834、0x8000);
    indirial_write (phydev、0x862、0x00e8);
    indirial_write (phydev、0x896、0x32cb);
    indirial_write (phydev、0x03e、0x0009);
    //indirial_write (phydev、0x01f、0x4000);
    //indirial_write (phydev、0x523、0x0000);

    ti81x_soft_reset (phydev、false);

    msleep(100);

    PHY_WRITE (phydev、0x01、0x0065);

    INDIRECT 写入(phydev、0x523、0x0000);//在配置结束后启用链路启动

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是由第一个代码调用的较高 APP 级的寄存器函数。

    静态 bool eth_setRegister (const uint32_t registerNumber、const uint32_t registerValue、const bool isMMD1 = false)

    uint32_t dEvad1 = 0x001f;
    uint32_t dEvad2 = 0x401f;

    if (false == eth_creatSocket ())

    返回 false;
    }

    if (isMMD1)

    dEvad1 = 0x0001;
    dEvad2 = 0x4001;
    }

    strncpy (IFR.IFR_NAME、"eth0"、IFNAMSIZ);
    如果(ioctl (skfd、SIOCGMIIPHY、&IFR)< 0)

    Cout <<"read Ethernet address failed"<< endl;
    关闭(skfd);
    skfd =-1;
    返回 false;
    }

    //usleep (10000);
    mII_val =(结构 mII_ioctl_data *)(&IFR.IFR_DATA);
    mi_val->reg_num = 0x0d;
    mi_val->val_in = dEvad1;
    if (ioctl (skfd、SIOCSMIIREG、&IFR)< 0)

    COUT <<"Set 0xD register first failed"<< endl;
    关闭(skfd);
    skfd =-1;
    返回 false;
    }

    //(10000);
    mi_val->reg_num = 0x0e;
    mi_val->val_in = registerNumber;
    if (ioctl (skfd、SIOCSMIIREG、&IFR)< 0)

    COUT <<"Set 0xE register failed"<< endl;
    关闭(skfd);
    skfd =-1;
    返回 false;
    }

    //usleep (10000);
    //mII_val =(结构 mII_ioctl_data *)(&IFR.IFR_DATA);
    mi_val->reg_num = 0x0d;
    mi_val->val_in = dEvad2;
    if (ioctl (skfd、SIOCSMIIREG、&IFR)< 0)

    COUT <<"Set 0xD register first failed"<< endl;
    关闭(skfd);
    skfd =-1;
    返回 false;
    }

    //usleep (10000);
    //mII_val =(结构 mII_ioctl_data *)(&IFR.IFR_DATA);
    mi_val->reg_num = 0x0e;
    mi_val->val_in = registerValue;
    if (ioctl (skfd、SIOCSMIIREG、&IFR)< 0)

    COUT <<"Set 0xD register first failed"<< endl;
    关闭(skfd);
    skfd =-1;
    返回 false;
    }

    关闭(skfd);
    skfd =-1;

    返回 true;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是我们现在使用的连接器。替换香蕉连接器。

    测试步骤:

    1:当 NAD 模块与814 phy 工作,我们调用一个 NAD API, 然后将安装 PHY ko 驱动程序,它工作到初始通过 我提到的初始代码 . 然后、我们将 通过 ifconfig 命令在较高的应用级别中看到 eth0。

    2:打开导线,或用镊子短接或连接其他端子。

    3:then 我们 start a eth test example., that welled up (the first part 中的第一个代码).然后这个例子将启动 TDR。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的杨明:

    感谢您分享这些详细信息、下面我将回顾一下注册序列并对您进行更新。

    此致、
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Rahul,有任何更新吗???

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的杨明:

    "对不起,我不知道该怎么说。"

    上面的代码共享用于初始化 PHY 和 PHY 功能。 看看上面的陈述、我的理解是 DP83TC814能够建立链路、而且您可以使用 ifconfig 验证它?

    你是否要强制速度达到100? 由于 DP83TC814仅支持100M、不支持 ANEG。

    phydev->speed = speed_100;
    2::用镊子打开或短接导线或连接其他端子。

    正如您提到的、为了运行 TDR、线路应该保持开路(不应连接链路伙伴)。

    您是否在 Linux 系统上运行此程序?  

    我已经在 EVM 上测试了 TDR 方法、能够测量这些值。 您是否有 EVM 来测试此方法?
    https://www.ti.com/tool/DP83TC812EVM-MC

    此致、
    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1:我强制速度达到100。

    2:我在 Linux 系统上运行此示例、但没有 EVM。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的杨明:

    我们是否可以使用 phytool 或 MDIO 工具执行单个寄存器读/写序列?

    应用手册中提到的寄存器序列正常工作、我们可以在 EVM 上测试它。 我想想想我们如何在您的案例中进行调试。

    此致、
    拉胡尔