我只是在下面实施 TDR 跟随 和 snla389 ,但它通常 在0x1E[1]中显示1 : 1。
通过将寄存器0x1E 中的位[15]置位来激活 TDR。 操作步骤如下。
DP83TC814S-Q1、DP83TC814R-Q1
SNLS663–2021年12月 www.ti.com
34提交文档反馈版权所有2021 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;
}
}