W5300과 dsp28346연결

#1

dsp와 연결을 시도해서… 데이터는 정상적으로 들어오는 것을 확인했습니다. 그런데 loopback으로 보내는
예제인데…(홈페이지에 있는 예제…) recv, send 를 모두 같은 함수로 처리했는데도 불구하고… recv 데이터는
정상적인데 …send가 되지 않는 문제가 있습니다. 무엇이 문제일까요?..

interrupt -> interrupt flag reset -> recv -> send 이런 식으로 수행하고 있는데…원인을 모르겠습니다.


#2

send 함수내에 …len은 11이고 Buffer에는 보낼 데이터가 정확하게 존재하는데
status 가 0x0117로 표시가 됩니다. 이거 때문이 아닌지 의문입니다. send해도 ret값이
0이고요. Sn_SSR(0)값을 0xff로 강제로 masking 시켜도 될지 질문드립니다. 상위 byte는
어떤값이 나오던지 상관없는건가요???

그리고 while (!(getSn_IR(s) & Sn_IR_SENDOK)) 이부분에서 Sn_SSR(0)값을 강제로 0xff로
마스킹 시키면 무한 루프에 빠지게 되는데…이걸 어떻게 처리하는게 좋을지 조언 부탁드립니다.

uint32 send(SOCKET s, uint8 * buf, uint32 len)
{
uint8 status=0;
uint32 ret=0;
uint32 freesize=0;

a3= ret = len;
if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.

/*
* \note if you want to use non blocking function, “do{}while(freesize < ret)” code block
* can be replaced with the below code. \n
* \code
* while((freesize = getSn_TX_FSR(s))==0);
* ret = freesize;
* \endcode
*/
// -----------------------
// NOTE : CODE BLOCK START
do
{
a1=freesize = getSn_TX_FSR(s);
a2=status = getSn_SSR(s);

  if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) return 0;

} while (freesize < ret);
// NOTE : CODE BLOCK END
// ---------------------

wiz_write_buf(s,buf,ret); // copy data

if(!check_sendok_flag[s]) // if first send, skip.
{
while (!(getSn_IR(s) & Sn_IR_SENDOK)) // wait previous SEND command completion[/b].
{

     if (getSn_SSR(s) == SOCK_CLOSED)    // check timeout or abnormal closed.
     {
         a4=3;
    	 return 0;
     }
  }
  setSn_IR(s, Sn_IR_SENDOK);             // clear Sn_IR_SENDOK
  a5++;

}
else check_sendok_flag[s] = 0;

// send
setSn_TX_WRSR(s,ret);
setSn_CR(s,Sn_CR_SEND);

return ret;
}

#3

일단 전송은 성공은 했습니다… 그런데 이렇게 하는게 맞는지 모르겠습니다…

W5300에서 MCU로 인터럽트를 걸어서 인터럽트가 걸릴때 … Receive 될때 받은 데이터를 그대로…Send를 하도록 하였습니다.

기본적으로 제공해주신 Firmware로 28346에 연결은 하였는데…제가 한 방식이 맞는지 모르겠습니다…
네트워크 초기화 후 …MCU 인터럽트에서 Sn_IR을 통해서…Recevice 하고…Send는 … Firmware 그대로 수행했더니
안되어서…Sn_SSR(0)가 0x17이 아닌 0x0117 이 들어와서…0xff로 masking 시켜서 사용했구요. (이부분도 정확하게 이해를 못하겠음.)

인터럽트 Sn_IR을 통해서 기다리는 저 루틴때문에 MCU가 무한루프에 빠지는 현상이 있었습니다…
그래서 약간의 트릭을 써서…SendOK 인터럽트가 걸릴때… Send가 끝나도록 프로그램하였는데…일단은

송/수신은 어느정도 정상적으로 되는듯 합니다. 어느정도 송수신이 된다는 결론하에 속도 측정을 해보았는데…
속도가 정상적으로 측정이 되지 않네요… AX1과 Iperf를 써서 같이 해보았는데… 속도가 나오질 않는 문제가 있는데요…

속도 측정을 하기 위해서 별도의 프로그램을 해주어야 하는건가요? 아니면 제가 프로그래밍 한 것이 정상적이지
않은 것인지…모르겠습니다.

AX1으로 속도 측정을 하니…- 속도가 나오는데…이게 맞는건가요??? 알려주세요…그리고 파일을 전송할 때는 아예 멈춰버리면서 속도가 제대로 나오질 않네요…

if(!check_sendok_flag[s]) // if first send, skip.
{
// while(send_ok[s]!=1);
/*
while (!(getSn_IR(s) & Sn_IR_SENDOK)) // wait previous SEND command completion. <-- 무한루프 빠짐.
{

     if (getSn_SSR(s) == SOCK_CLOSED)    // check timeout or abnormal closed.
     {
         a4=3;
    	 return 0;
     }
  }
  setSn_IR(s, Sn_IR_SENDOK);             // clear Sn_IR_SENDOK
  a5++;

*/
// while((PWORD(Sn_IR(s) & 0xFF) != 0x10));

// PWORD(Sn_IR(s)) = Sn_IR_SENDOK;
}
else check_sendok_flag[s] = 0;

// Send

setSn_TX_WRSR(s,ret);
setSn_CR(s,Sn_CR_SEND);

// PWORD(Sn_IR(0)) = Sn_IR_SENDOK;

while(send_ok[s]!=1) <— SendOK 인터럽트가 걸릴때까지 기다린다.


#4

일단, AX1 프로그램 상에서 CPUTICK을 누르시면 제대로 된 숫자를 보실 수 있을 것 같습니다.
그리고, 그림에서 보니 200여 바이트만 보내서 측정하시는 것 같은데, 너무 순식간에 보내 버리고 받아서 정상적으로 속도를 측정하기는 어려울 것 같네요.
조금 (몇메가 정도) 되는 파일을 송신해서 측정하는 것이 좋을 것 같습니다.