WIZnet Developer Forum

W5300 loopback 관련해서 문의드립니다

안녕하세요.

28335와 연결해서 사용중입니다.

현재 w5300을 이용해서 잘 사용중입니다.

다만, 문제되는 점이라면

루프백 테스트중, PC에서 16바이트를 전송하면 w5300이 수신하여 PC로 전송한 데이터의 길이가 15가 됩니다. 그리고 마지막 바이트가 잘려져 있습니다.

혹시나해서 PC에서 전송하는 데이터의 내용을 125로 해보았는데 데이터의 길이는 16으로 모두 일치해서 전송되어집니다.

하지만 126, 다시말해 125보다 크면 15바이트로 재전송되어지고 마지막 바이트가 잘려집니다.

동작을 전혀 되지 않으면 하드웨어 설계나 프로그램 문제로 보겠는데, 이런 문제가 있으니, 접근 방법을 찾지를 못하겠습니다.

혹시나해서 관련 글을 검색해보니 DSP에서 char가 1word라서 홀수번지는 건너뛰고 짝수 번지에 데이터가 저장된다는 내용이 있었습니다.

저도 역시 이런 현상을 알고 있는데, 이런 부분에서 데이터의 수신길이가 달라지는지요…?

w5300의 레지스터를 확인해보니 수신된 내용을 16개가 맞았습니다만 전송하는 갯수는 15개로 낮아집니다.

또한, 데이터의 내용중 125보다 큰 내용이 많으면 이런 현상이 더 중첩이되어서 데이터길이가 가변되어집니다.

집히시는 부분이 있으시면 조언 부탁드립니다.

125와 126의 의미를 모르겠습니다…

W5300 모드가 8bit인지 16bit인지도 알려주세요

그리고 데이터 loss가 났을때 read 포인터와 write 포인터가 같은지 확인 부탁드립니다.

또 제공되는 Loopback 예제로 포팅하여 테스트 부탁드립니다.

감사합니다.

답변감사드립니다.

  1. 125와 126은 PC에서 w5300으로 데이터를 전송할 때, 데이터입니다.

127과 128인데 잘못 적었네요… 정정합니다.

8bit의 절반치값 127 이하는 갯수가 맞게 전송되는데 이상되는 값은 갯수가 맞게 전송되지 않고 있습니다.

  1. W5300 모드는 16bit 이고 다이렉트 모드입니다.

  2. 데이터 loss는 아닌것 같습니다. Sn_TX_FIFOR 메모리를 확인해보면 PC에서 받은 데이터 16개는 저장되어있습니다. PC의 데이터는

맞게 저장되어있는데, 단순히 피드백하는 갯수가 다릅니다., 추가 내용 덧붙입니다… TX_FIFOR 레지스터에 PC에서 전송된 데이터의 내용이 쉬프트가 되어집니다.

예) PC에서 전송하는 데이터 : 0x1122, 0x3344, 0x5566, 0x7788, 0x99aa
TX_FIFOR 레지스터 : 0x1122, 0x3344, 0x5566, 0x7788, 0x99aa ----------- 입니다만
다시 PC에서 전송을 하게되면
TX_FIFOR 레지스터 : 0x1122, 0x3344, 0x5566, 0x7788, 0x99aa, 0x1122, 0x3344, 0x5566, 0x7788, 0x99aa, -------------- 입니다.

전송하기 위해 w5300에 데이터를 저장할때, 주소번지는 항상 처음 위치일것인데, 이처럼 누적되어 흘러갑니다.

따라서 10바이트 데이터를 수신후 피드백 전송을 하게되면 가끔 9바이트가 뜰때, 나머지 한바이트 + 다음 9바이트를 포함해서 10바이트를

전송하기도 하고 나머지 한바이트 + 다음 8바이트로 9바이트를 전송하기도 합니다.

  1. 제공되는 Loopback 예제로 포팅하여 테스트 하였습니다.

TCP 전송시 재전송할 때를 대비하여 TX의 RD/WR 포인터값을 Sequence number와 같이 맞춰서 사용합니다.
따라서 TX FIFO에는 순서대로 데이터가 누적되는것 처럼 보이는게 맞습니다.

하지만 그 다음 말씀하신 9바이트가 뜰때 1바이트와 다음9바이트 또는 1바이트와 다음8바이트를 전송한다는 말이 이해가 되지않습니다…
다시 설명 부탁 드립니다…

감사합니다.

빠른 답변 감사드립니다.

28335에서 w5300을 사용하는데, 데이터는 16비트, 다이렉트 모드입니다.
그리고 UDP통신중입니다.

실험은 다음처럼 하고있습니다.

PC에서 데이터 16바이트를 전송합니다.
DSP에는 Loopback 함수를 사용하고있기때문에 PC에서 받은 데이터 16바이트를 전송합니다.

여기서 문제점이, PC에서 전송하는 데이터의 크기를 0xff의 절반인 0x7f이하로 설정하여 전송하면 데이터 16개는 모두 수신해서 재전송되어집니다.
하지만, 0x80이상으로 설정하여 전송하면 데이터의 길이가 15개로 해서 재전송됩니다.

이를 분석하기 위해서 PC에서 받은 데이터를 DSP에서 확인하였고 이를 다시 재전송하는 함수 sendto에서 TX_FIFOR레지스터에

저장된 데이터를 WRITE 한후, 데이터를 읽어 보니 PC에서 받은 데이터가 다 들어있었습니다. 그리고 길이 또한 16개로 레지스터에

저장되어있었습니다. 하지만 PC에 수신되는 데이터는 길이가 15개이고 마지막 데이터가 없었습니다.

이상황에서 PC로 부터 전송명령을 한번더 보내면, TX_FIFOR에 누적된 내용 다음 부터(15개를 보낸 마지막 바이트) 다음의 데이터가 전송되어집니다.

예) 0x1122, 0x3344, 0x5566, 0x7788 로 8바이트를 전송한다면은 앞의 7바이트 0x1122, 0x3344, 0x5566, 0x77 까지 전송이되어지고 다음번 다시

PC에서 같은 데이터를 전송하면 0x8811, 0x2233, 0x4455, 0x6677 이렇게 수신됩니다.

하지만, 이상황에서 TX_FIFOR에 저장된 데이터를 읽어보지 않으면 0x8811, 0x2233, 0x4455, 0x6677게 전송되지는 않습니다. 그냥 0x1122, 0x3344, 0x5566, 0x77이 전송됩니다.

답변 기다리고 있겠습니다.

SEND 완료 후 TX FIFO의 RD 포인터와 WR 포인터의 값이 같은지 확인부탁드립니다.

감사합니다.

제가 이해한 것이 맞는지 모르겠습니다만,

데이터 전송전 TX FIFO에 저장되는 주소값과 CR에 0x0020을 줬을때의 TX FIFO 주소는 동일합니다.

그리고 TX WRSR에 저장된 데이터 길이도 수신된 데이터의 길이와 동일합니다.

  1. TX_FIFOR 레지스터는 아래의 코드 처럼 같은 주소에 데이터를 WRITE만 해주어도 자동 증감되는건가요?

  2. 아래의 코드처럼 data_add_FIFO를 확인 해보았지만 역시나 고정된 TX_FIFOR 주소값만 나옵니다.

for(i=0;i<len;i+=2){
IINCHIP_WRITE(Sn_TX_FIFOR(s),temp_buf[i]);
data_add_FIFO = Sn_TX_FIFOR(s);
}

위의 코드에서 len 변수에는 PC에서 수신된 데이터 길이가 저장되어 있습니다.

답변 감사합니다.

레지스터값은 맞게 들어가있고 데이터 시트를 봐도 오류를 못찾아서 한참을 고민하다가

PC에서 데이터를 받는 프로그램이 오류가 있을지도 모른다는 생각에 Wireshark를 설치하여 패킷을 확인하였습니다.

그랬더니, DSP에서 보낸 데이터의 길이가 딱딱 맞았고 데이터 또한 유효하였습니다. 하지만 전송된 데이터 뒤에

0x00, 0x00 두바이트가 붙어있었습니다. 이건 UDP 프로토콜 상에 존재하는 잔류 데이터 인가요?

그림 첨부하였습니다. 해당 부분을 노란색으로 표시하였습니다.


안녕하세요 ? :slight_smile:

UDP에서 Ethernet frame 60byte 이하에서는 padding이 붙습니다.

죄송하지만 질문으로는 문제가 도저히 추측되지 않습니다…

테스트한 코드를 알려주시면 검토해보겠습니다.

포럼에 올리기 불편하시면 justinkim@wiznet.co.kr로 보내주시기 바랍니다.

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.