w5300사용시 소켓0번 1번 동시사용 질문입니다.


#1

현재 DSP 28346 과 w5300을 사용하여 랜통신을 시도 하고 있습니다.

전송할 데이터의 크기가 100kbyte 라서

소켓을 50Kbyte로 지정해서 0번, 1번을 사용하려고 합니다.

그런데 소켓0번에 데이터는 잘 전송이 되는데 1번의 데이터는 전송이 안됩니다.

  1. 소켓 0 번 , 소켓 1번을 동시 사용하여 데이터 전송이 가능합니까?

코드는 아래와 같이 예제를 수정하여 사용하였습니다.

(생략)
uint8 tx_mem_conf[8] = {50,50,10,10,0,0,0,0};
uint8 rx_mem_conf[8] = {1,1,1,1,1,1,1,1};
(생략)
while(1)
{
loopback_tcpc(0,ServerIP, 3000, data_buf,0);
loopback_tcpc(1,ServerIP, 3000, data_buf2,0);
}


#2

TX memory 설정이 잘못되었습니다. 데이타시트 보시면 아시겠지만,
TX memory의 총합과 RX memory의 총합은 각각 최대 64KB 를 초과할수 없습니다. 64KB 이하로 설정하셔야 합니다.
따라서, 상기와같이 설정할 경우 0번은 정상 전송하나, 1번과 2번 채널은 데이타를 정상적으로 전송할 수 없습니다.


#3

답변감사드립니다.

문제점을 파악하기 위해 데이터시트를 다시 한번 살펴보았습니다.

p.58의 3번째 줄에

’ 각 socket의 tx memory size는 0Kbyte 에서 64Kbytes내에 설정이 가능’

이라는 설명이 있는데

제가 이 부분을 '소켓 하나의 tx 사이즈가 최대 64Kbytes까지 가능하다’는 것으로 잘못이해 한것 같습니다.

답변해 주신내용은 소켓8개의 총 tx 사이즈합이 최대 64Kbytes까지 가능하다는 의미인가요?

그렇다면 p.91 의 그림 8에서 tx 사이즈가 (72Kbyte)로 되어있는데

이 그림은 어떤 의미인가요?


#4

제가 착각한 것 같습니다.
Socket 하나당 설정가능 버퍼의 크기는 64KB 이내이고 각 Socket의 버퍼의 총합은 128KB 입니다.
따라서 말씀하신 설정은 잘못되지 않았습니다.

W5300 Datasheet P90 중에서

MTYPER 값을 확인부탁드립니다. MTYPER은 말씀하신 설정으로 지원하기 위해선, 0x7FFF 값을 가져야 합니다.
MTYPER 하위bit 부터 TX buffer 120KB 할당은 8K *15 로 구성되고, RX buffer는 총합은 8KB * 1 이므로 최상위비트만 '0’으로 설정됩니다.

오해를 불러일으켜서 죄송합니다.


#5

매번 친절한 답변 감사드립니다.

말씀해주신데로 MTYPER값을 확인해 보니 0x7fff값을 가지고 있었습니다.

소켓 영역 할당에는 문제가 없는것 같습니다.

  1. 혹시 소켓의 포트가 같으면 사용이 불가능한건가요?

소켓 0번의 데이터와 1번의 데이터를 전송하기 위해 코드를 아래와 같이 예제를 수정하여 사용하였습니다.

(생략)
uint8 tx_mem_conf[8] = {50,50,10,10,0,0,0,0};
uint8 rx_mem_conf[8] = {1,1,1,1,1,1,1,1};
(생략)
while(1)
{
loopback_tcpc(0,ServerIP, 3000, data_buf,0);
loopback_tcpc(1,ServerIP, 3000, data_buf2,0);
}

추가 질문 있습니다.

소켓의 크기를 50Kbyte( 51200byte)로 설정하고 50000byte 크기의 데이터를 전송시키는 테스트를 해보았습니다.

그 결과 데이터 일부가 안나오는 현상을 확인하였습니다.

예로 0~25000이라는 숫자를 전송하는경우 0~12500, 12700~25000 이런 식으로 중간의 데이터를 건너 뛰고 전송이 됩니다.

그런데 데이터의 크기를 소켓의 크기와 동일하게 51200byte로 한 후 데이터를 전송한 경우에는

문제 없이 전송이 잘되는 것을 확인 하였습니다.

  1. 데이터 전송 시 소켓의 크기와 동일한 크기의 데이터를 설정해야 하나요?

  2. 데이터 일부가 전송되지 않는 원인이 버퍼를 리셋해주지 않아서 그런건가 의심되는데 확인할수 있는 방법이 있나요?

  3. 위 3.번이 원인이라면 버퍼를 리셋하는 방법이 있나요?


#6

[quote]1. 혹시 소켓의 포트가 같으면 사용이 불가능한건가요?
[/quote]
여기서 소켓포트는 Sn_PORTR를 말씀하시는 것인가요 아님 Sn_DPORTR를 말씀하시는 것인가요?
TCP Server를 작성할 경우 Sn_PORTR을 같은 값을 가질수 있습니다. 같은 포트 수 만큼 상대방이 동시에 접속할 수 있습니다.
반대로 TCP Client (아래 코드처럼)를 작성할 경우 Sn_PORTR은 서로 다른 값을 가져야 합니다. 물론 같은 서버에 접속할 경우 Sn_DPORTR는 같은 값을 가져야 합니다.

[quote]2. 데이터 전송 시 소켓의 크기와 동일한 크기의 데이터를 설정해야 하나요?
[/quote]
상관없습니다.

[quote]3. 데이터 일부가 전송되지 않는 원인이 버퍼를 리셋해주지 않아서 그런건가 의심되는데 확인할수 있는 방법이 있나요?

  1. 위 3.번이 원인이라면 버퍼를 리셋하는 방법이 있나요?[/quote]
    데이타일부가 빠지는 것은 Buffer와 상관이 없습니다. 그리고 W5300은 Buffer flushing을 지원하지 않습니다.

[quote]소켓의 크기를 50Kbyte( 51200byte)로 설정하고 50000byte 크기의 데이터를 전송시키는 테스트를 해보았습니다.

그 결과 데이터 일부가 안나오는 현상을 확인하였습니다.

예로 0~25000이라는 숫자를 전송하는경우 0~12500, 12700~25000 이런 식으로 중간의 데이터를 건너 뛰고 전송이 됩니다.

그런데 데이터의 크기를 소켓의 크기와 동일하게 51200byte로 한 후 데이터를 전송한 경우에는

문제 없이 전송이 잘되는 것을 확인 하였습니다.
[/quote]
이부분은 저도 처음보는 증상인것 같습니다. 좀더 정확한 분석이 필요할 것 같습니다.
50000byte를 한번에 Copy하여 Send command를 처리하는지 궁금합니다. 그리고 매번 할때 마다 동일한 증상이 나타나는지도 궁금하네요.

아니면 50000byte씩 매번 처리하는데 간혹 빠지는 것인지?

51200 byte는 매번 Loss 없이 잘 전송되는지 확인 부탁드립니다.

가능하시다면 send() 함수 부분을 공유해주시면 검토하겠습니다.