首页 > 技术知识 > 正文

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脚本读取寄存器。

DP83TD510E 计数器错误调试记录

寄存器被清除后,所有三个他们的顺序,然后计算结果。 在我的代码中读取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可以删除重复, 因为发送一个接收相当快。

DP83TD510E 计数器错误调试记录1

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错误计数器在那之后再次增加。 这是第一次真正丢弃一个“有缺陷的”数据包。

DP83TD510E 计数器错误调试记录2

DP83TD510E 计数器错误调试记录3

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
<

猜你喜欢