w5100 TCP send시 오류 문의

안녕하세요.
W5100으로 제품을 개발하여 시험중에 있습니다.
그런데 간혹 송신한 tcp data를 상대방이 받지 못하는 현상이 있습니다.
상대방이 전혀 받지를 못하거나 시작 data는 맞는데 size가 무척 큰 데이터가 들어 오기도 합니다.
이 문제를 debugging중 아래와 같이 send() function내에 w5100에 data와 point를 write후 Sn_CR_SEND cmd를 set하기 전에 약간의 delay를 넣으니 문제가 사라졌습니다.
그런데 이렇게 해결하는 것은 정상적인 방법이 아닌듯하여 문의드립니다.
이렇한 현상이 발생할 가능성은 무엇이고 어느 부분을 중점 debugging 해야 할까요?

참고로 CPU는 stm32게열이고 tcp server mode이고 direct access방식입니다.

u16 send(
SOCKET s, /< the socket index */
const int8 * buf, /
< a pointer to data */
u16 len /**< the data size to be send */
)
{
u8 status=0;
u16 ret=0;
u16 freesize=0;
#ifdef DEF_IINCHIP_DBG
printf(“send()\r\n”);
#endif

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

// if freebuf is available, start.
do
{
	freesize = getSn_TX_FSR(s);
	status = IINCHIP_READ(Sn_SR(s));
	if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT))
	{
		ret = 0;
		break;
	}

#ifdef DEF_IINCHIP_DBG
if (freesize < ret) printf(“socket %d freesize(%d) requestlen(%d) error\r\n”, s, freesize, ret);
#endif
} while (freesize < ret);

// copy data
send_data_processing(s, (u8 *)buf, ret);
    //printf("send_data_processing\n"); //for test
    
    osDelay(1); //insert by hskim for fix send error
    
IINCHIP_WRITE(Sn_CR(s), Sn_CR_SEND);

/* wait to process the command... */
while( IINCHIP_READ(Sn_CR(s)) )
	;

안녕하세요.
위즈네트입니다.

혹시 보내시는 데이터 수와 보내는 주기는 어떻게 되시나요??

제가 보기엔 delay를 넣으시는 것은 상관없어 보입니다.

감사합니다.

회신 감사합니다.

보내는 데이터는 66byte이고 보내는 주기는 10초당 1개입니다.
발생확률은 10%정도입니다.

어느 부분이 문제일까요?

안녕하세요.

10초에 1번 보낸다는 것으로는 데이터 수/주기 문제는 아닌 것 같습니다.
말씀하시는 느낌으로 봐서는 타이밍이 안맞는 것 같은 느낌이 듭니다.

bus interface의 라인 문제일 가능성도 있어보입니다만, 그게 아니라면 코드쪽을 면밀히 찾아봐야할 것 같습니다. 당장 올려주신 코드를 봐서는 문제점이 보이질 않습니다.

send_data_processing(s, (u8 *)buf, ret); 부분의 버퍼에 data 쓰는 부분에서의 무언가 delay가 있을 수도 있습니다.

감사합니다.