DP83TD510E 计数器错误调试记录

free-jdx 2021-06-24 10:54:24 5538
1. 前言

测试EVM以验证DP83TD510

寄存器如下
RX TX
0 x012e 0 x012b
0 x012f 0 x012c
0 x0130 0 x012d
奇怪的是,发送错误计数器0x012D的寄存器总是具有与发送计数器(0x012B和0x012C)相同的值。
数据包是简单的ping,有一个应答,即没有数据包被丢弃。

2. 查询如下几个问题

(1)查询这些寄存器中读取的准确值
(2)读取0x012B, 0x012C, 0x012D来清除寄存器
每次试着在几秒钟后4-5秒,以确认可以成功清除寄存器

3. 框图 & 脚本

包括两个DP83TD510评估板连接一个特殊的SPE Cabel从Harting。
一边是树莓派4,我的Thinkpad以1Hz的频率发送信号。
这台Thinkpad定期使用python脚本读取寄存器。

寄存器被清除后,所有三个他们的顺序,然后计算结果。
在我的代码中读取RX和TX计数器,问题只显示与TX计数器。

import serial
import time
import math
ser = serial.Serial(
    port='COM6', 
    baudrate=9600, 
    timeout = None,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)
TX = 0
TX_err = 0
RX = 0
RX_err = 0

def read_TI_register(ID, address): 
    request = f"{ID:02}{address:04X}=/"
    #print(f"request: {request}")
    ser.write(bytes(request,'utf-8'))
    response = ser.readline()
    #print(f"response: {response}")
    i_response = int(str(response,'utf-8'),16)
    #print(f"read  Register: 0x{address:04X} = 0x{(str(response,'utf-8'))}")
    return i_response

def read_TI_register_exd(ID, address): 
    request = f"{ID:02}{address:04X}*/"
    #print(f"request: {request}")
    ser.write(bytes(request,'utf-8'))
    response = ser.readline()
    #print(f"response: {response}")
    i_response = int(str(response,'utf-8'),16)
    #print(f"read  Register: 0x{address:04X} = 0x{(str(response,'utf-8'))}")
    return i_response

def write_TI_register(ID, address, value): 
    request = f"{ID:02}{address:04X}{value:04X}*/"
    ser.write(bytes(request,'utf-8'))
    response = ser.readline()
    i_response = int(str(response,'utf-8'),16)
    #print(f"wrote Register: 0x{address:04X} = 0x{(str(response,'utf-8'))}")
    return i_response

def read_MSE_dB(ID):
    r = read_TI_register(ID, 0x872)
    MSE = 10 * math.log10(r/2**17)
    SNR = MSE - 1.76
    #print(f"MSE: {MSE:f} dB, SNR: {SNR:f} dB")
    return MSE

#read_MSE_dB(0)

def read_n_clear_tx_pkt_cnt():
    global TX
    global TX_err
    TX = TX + read_TI_register_exd(0, 0x12B) 
    TX = TX + read_TI_register_exd(0, 0x12C) * 2**16
    TX_err = TX_err+ read_TI_register_exd(0, 0x12D)
    print(f"tx_cnt = {TX} tx_error = {TX_err}")
    return TX

def read_n_clear_rx_pkt_cnt():
    global RX
    global RX_err
    RX = RX + read_TI_register_exd(0, 0x12E) 
    RX = RX + read_TI_register_exd(0, 0x12F) * 2**16
    RX_err = RX_err + read_TI_register_exd(0, 0x130)
    print(f"rx_cnt = {RX} rx_error = {RX_err}")
    return TX

try:
    while True:
        read_n_clear_rx_pkt_cnt()
        read_n_clear_tx_pkt_cnt()
        time.sleep(5)
except KeyboardInterrupt:
    print('interrupted!')
4. 尝试如下实验

(1)把电缆拿掉,用think pad通过DP83TD510发送数据包
a.确保有DP83TD510设置为数字环回
b. 看看思考板是否能够接收所有的数据包而没有任何错误
(2) 对树莓派和第二个DP83TD510做同样的事情

5. 实验结果

因为没有把Thinkpad的网卡设置为Promiscuous Mode,所以它收到了错误的MAC地址。
要么就是数字环坏了。

将寄存器0x016设置为0b0000_0001_0000_0100以启用环回。
这个动作发生在我已经发送了一些ping建立数据在arp- cache。
之后显然没有更多的反应。

但是请求应该返回到thinkpad,但它没有。
我怀疑网卡“过滤”错误的mac地址,另一方面wireshark可以删除重复,
因为发送一个接收相当快。

6. 梳理疑问

DP83TD510 EVM与ThinkPad连接的接口是什么? EVM连接的引脚是什么?
使用DP83TD510 EVM,可以尝试使用独立EVM生成包吗?

不要连接另一台DP83TD510 EVM或ThinkPad。
将DP83TD510放入数字环回,DP83822放入数字环回。

使用DP83822生成数据包,然后检查DP83822中的寄存器0x0015中的错误。
通过这样做,将确认DP83822和DP83TD510之间的MAC侧数据路径没有问题。

7. 查阅DP83TD510文档

阅读DP83TD510的数字环回时,注意到在第29页,需要设置一个神秘位0x0883[0]为1。
在将数字环回和神秘位设置为1之后,在发送请求后得到了返回。
所以数据包通过数字环回时没有改变。

DP83TD510的数据表中没有描述0x0883寄存器,找FEA提供完整的registermap,以避免将来出现这样的混淆。
在这个场景中,数据包计数器看起来与预期的一样,因此错误计数器保持为零,而正常计数器随着每个数据包的增加而增加。

8. 回环测试

错误的计数器的问题只解决在数字环回,
而不是在正常操作
这表明Phy的不同部分存在问题。
我不确定错误计数器的行为,它只能增加一个CRC错误。
我要用不同的环回模式去调查,也许我能找到些什么。

Edit1:
我读回了整个线程,如果有什么我可能错过了,是的,我收到了接收和发送混合的错误是在RX计数器上,所以在0x12E 0x12F和0x130。很抱歉我在最初的请求中把这些弄混了。
另一方面,我不确定这是否对我们的调查结果有任何影响。

Edit2:
我已经启用了模拟环回,并发现了一个非常奇怪的行为,第一个和另一个数据包后,启用模拟环回回到我的Thinkpad,但其余的没有回来,RX错误计数器在那之后再次增加。
这是第一次真正丢弃一个“有缺陷的”数据包。

Edit3:
我想尝试一些不同的东西,并使用其他10BASe-T1L Phy。
如果发送端是另一个DP83TD510,那么发送端就有问题了。
一个同事提示我,也许CRC是coreting错误,因此是递增计数器,这将解释(从黑盒的角度)完美的通信。
Edit4:
测量另一个DP83TD510揭示了关于RX/TX计数器的混淆。
取决于你看它的以太一个RX或TX错误。

9. 再试如下几个实验

DP83TD510是否发送了良好的数据,这听起来像是一个问题。
通过下面这些实验,将能够看到这是否是事实。
(1)从DP83TD510生成PRBS数据
设置PHY为数字环回
这将通过MAC发送PRBS数据
计算DP83TD510中的RX_ER计数器
(2)从DP83TD510生成PRBS数据
使用另一个T1L兼容PHY接收数据
然后检查另一个PHY上的RX错误

我用数字回路启动了PRBS发生器。在此之后,RX和TX计数器增加,TX_ERR和RX_ERR也以相同的速度增加。

rx_cnt = 11938 rx_error = 11938
tx_cnt = 12064 tx_error = 12064

如果我关闭数字环回,按建议连接另一个10BASE-T1L板,另一个Phy的RX Error Counter会增加。
错误是如此之大,其他Phy丢弃了数据包,没有一个通过我的Thinkpad。

rx_cnt = 0 rx_error = 0
tx_cnt = 27383 tx_error = 27383
MSE -31.0 dB PWR off Rx 0, Err 27383 

我正在测试另一个DP83TD510_EMV是否显示类似的行为。
显然,由于计数器的读出时间不同,rx2和tx1之间的包计数有微小的不同。

rx1_cnt = 0 rx1_error = 0
rx2_cnt = 7863 rx2_error = 7863
tx1_cnt = 7874 tx1_error = 7874
tx2_cnt = 0 tx2_error = 0

我开始怀疑我的两个DP83TD510_EMV板之间是否有不同,无论是硬件还是软件。

10. 测试场景下查询以下寄存器
0x0000
0x0002
0x0003
0x0010
0x0011
0x0467
0x0468

五种情况下读出了寄存器。

//With PRBS and digital loopback enabled on 1
rx2_cnt = 3161 rx2_error = 3161
tx2_cnt = 3194 tx2_error = 3194
tx1_cnt = 2 tx1_error = 0
rx1_cnt = 10 rx1_error = 10

registers of 1
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0000
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000

registers of 2
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
//With PRBS and digital loopback enabled on 1
rx2_cnt = 3161 rx2_error = 3161
tx2_cnt = 3194 tx2_error = 3194
tx1_cnt = 2 tx1_error = 0
rx1_cnt = 10 rx1_error = 10

registers of 1
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0000
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000

registers of 2
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
//With PRBS and digital loopback enabled on 2
rx2_cnt = 5780 rx2_error = 5780
tx2_cnt = 5864 tx2_error = 5864
tx1_cnt = 1 tx1_error = 0
rx1_cnt = 1 rx1_error = 0

registers of 1
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
registers of 2
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
//with PRBS enabled and disabled digital loopback on 1
rx2_cnt = 1580 rx2_error = 1578
tx2_cnt = 0 tx2_error = 0
tx1_cnt = 1596 tx1_error = 1594
rx1_cnt = 0 rx1_error = 0

registers of 1
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000

registers of 2
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
//with PRBS enabled and disabled digital loopback on 2
rx2_cnt = 2 rx2_error = 0
tx2_cnt = 2406 tx2_error = 2406
tx1_cnt = 2 tx1_error = 0
rx1_cnt = 2415 rx1_error = 2415

registers of 1
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000

registers of 2
read  Register: 0x0000 = 0x1100
read  Register: 0x0002 = 0x2000
read  Register: 0x0003 = 0x0181
read  Register: 0x0010 = 0x0001
read  Register: 0x0011 = 0x002A
read  Register: 0x0467 = 0x0086
read  Register: 0x0468 = 0x0000
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 93 5 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区