WIZnet Developer Forum

[W7500x] Retransmission이 엉뚱한 시간에 발생하는 원인은?

RTR 레지스터의 설정과 다른 시간에 재전송이 발생하는데 원인은 무엇입니까?
해결 방법은 무엇입니까? 아래 내용 참조바랍니다. 작년에 게시한 문의사항입니다.

안녕하세요

해당 내용 테스트 진행한후에 다시 답변드리도록 하겠습니다.
RTR값을 한번 더 read하여 값을 확인해보시기 바랍니다.

안녕하세요

먼저 저희측에서는 Retransmission Time Register로 RTR로 표기하고 있습니다.
RTO라고 표기하셨는데 혼동이 있을것 같습니다.

질문 1. RTO가 200ms가 맞습니까? 너무 빠릅니다.
RTR 값을 테스트하였으나 200ms 가 맞는것으로 확인되었습니다.
레지스터값을 한번 read하여 0x07d0으로 셋팅되어있는지 확인 바랍니다.

질문 2. RTR이 발생하면 RTO가 자동으로 커집니까?
ARP의 경우 재전송이 발생할 경우 재전송 타임은 RTR 값으로 동일하게 전송되지만,
TCP의 경우 2배씩 증가하게 되어있습니다.

아래 테스트한 이미지 첨부합니다. 첫 재전송이 200ms 후에 발생하였으며 이후 400, 800, 1600으로 증가하고 있습니다. 참고 바랍니다.

Retransmission이 발생할 때의 RTR 레지스터의 값이 2000으로 되어 있음을 확인했습니다.

Retransmission Time Out은 약 80ms ~ 90ms 내외로 발생하고 있습니다.

192.168.22.84 는 PC이고 192.168.12.105는 W7500P입니다.

W7500P에서 Retransmission이 지속적으로 발생하고 있는 상황이며
PC에서 다른 PC와 통신할 때에는 Retransmission이 발생하지 않습니다.

캡쳐된 와이어샤크 패킷 파일을 좀 올려주세요. 살펴보는데 도움이 되겠습니다.

wireshark 캡쳐 파일.zip (252.5 KB)

첨부 1은 TCP Session을 반복해서 열고 닫으면서 데이터를 송수신 하는 경우,
첨부 3은 TCP Session을 유지한 채로 데이터만 반복적으로 송수신하는 경우입니다.

캡쳐파일 보내주셔서 감사합니다. 보내주신 캡쳐파일을 보면 말씀하신대로, 8~90ms 마다 재전송이 되고 있네요.
저희가 테스트한 보드는 system clock을 20MHz로 테스트해서 다른 결과가 나오는 것 같습니다.
저희 레지스터에 RCR 말고 TCKCNTR (Ticker Counter Register, 주소값은 0x4600_2000) 라는 레지스터가 있습니다.
이값이 기준으로 내부 TCP 코어로 100usec 를 알려주게 되어 있는데, 현재 20MHz(리셋값 기준)에 맞춰져서 이런 증상이 발생하는 것 같습니다. 위의 글을 보니 48Mhz 로 사용중인 것 같습니다. 따라서, 이 레지스터 값을 48MHz 에 맞추어 4800(0x12c0) 으로 조정하면 예상한 결과가 나올것으로 기대합니다.

그리고, W7500P를 사용중이시면, 저희가 배포한 에러타시트도 참고하셔서 반영이 되어 있지 않다면, 코드에 반영해 주시기 바랍니다. 한글 문서 첨부해 드립니다.
w7500x_erratasheet_v120k.pdf (440.1 KB)

시스템 클럭이 얼마인지에 관계 없이 RTR을 100us 해상도로 설정하도록 했다면 CPU 속도가 빠르던지 느리던지 관계 없이 100us 해상도로 동작해야 하는 것이 아닌지요?

Reference Manual에는 RTR과 TCKCNTR이 관계가 있다는 문구가 없는데 어디를 참조하면 해당 내용의 근거를 확인 할 수 있을까요?

시스템 클럭을 조정했을 때 TCKCNTR을 조정해야 하는지에 대한 이유를 기록해두지 않으면 향후 유지 보수할 때 해당 구문이 왜 필요한지 알 수 없게 되므로 코드 수정의 근거로 삼기 위함입니다.

사용중인 부분에 대해서는 이미 적용되어 있습니다.

말씀하신대로 변경되지 않는 절대 클럭값을 내부에 별도로 사용했다면 사용자가 편했을 아쉽게도 현재 칩의 구현은 그렇게 되어 있지 않습니다.

Reference Manual 에 보면, 아래와 같이 설명되어 있습니다.

[15:0] TCKCNT – Ticker counter register is used Tick counter of 100usec. for internal timer of
TOE. The unit of tick is HCLK. RTR, Sn_RTR, Sn_KATMR operates on the value of this register.
(1 / 𝑓) × 𝑇𝐶𝐾𝐶𝑁𝑇 = 𝑅𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑒 𝑡𝑖𝑚𝑒 𝑜𝑓 𝑇OE

관점에 따라 다를 수 있다고 생각하지만, TOE의 internal timer의 레퍼런스로 사용하고, 100us sec의 기준값으로 사용한다는 말이 관계성을 표현한다고 생각합니다.
물론, 말씀대로 아예 RTR 과의 연관성을 표현하는 문구를 예를 들어 보강하면 더 직관적일 것으로 생각합니다.

사용중인 부분에 대해서는 이미 적용되어 있습니다.

네 다행입니다.