W5500 Tx 패킷 깨지는 현상 문의

#1

W5500을 서버로 설정하여 Client 가 접속이 정상적으로 됩니다.
Client에서 전송한 데이터는 정상으로 패킷이 들어오는데
Server에서 보내는 데이터는 길이는 맞는데 패킷이 깨지는 현상이 나타납니다.
예로 “123456789” 패킷을 서버에서 전송하면 client에서는 길이 9바이트는 맞지만 "123456789"가 아닌
다른 쓰레기 값들이 들어옵니다. 들어오는 값들은 일정한 패턴의 값이 아닌 랜덤하게 들어옵니다.
0x75, 0x7A, 0x0B, 0x18, 0xCE, 0x44, 0xEF, 0xEB, 0x2D

사용하는 커넥터가 “RJ45 with integrated Transformer and connected CT” 이기에 회로는 수정하였습니다.

왜 이런 현상이 나타나는지 알 수가 없네요.


#2

수신쪽 code에 문제가 있어보입니다.
가능하시면
수신쪽 code를 잘라서 올려 주시면 확인 후 답변 드리겠습니다.

#3

case TCP_DATAREADY:
if ((dataSize = ClientTCPRead (g_hconversation, receiveBuf,
dataSize, 1000))
< 0)
{
SetCtrlVal (g_hmainPanel, MAINPNL_RECEIVE, “Receive Error\n”);
}
else
{
DebugPrintf(“dataSize = %d\n”, dataSize);
for(i=0; i<dataSize; i++)
DebugPrintf("%02X\n",receiveBuf[i] & 0xFF );
receiveBuf[dataSize] = ‘\0’;
SetCtrlVal (g_hmainPanel, MAINPNL_RECEIVE, receiveBuf);
}

Client는 NI사의 Labwindows 라는 소프트웨어를 사용합니다.
전송된 데이터를 화면에 뿌리는 코드밖에 안되서 별문제는 없을꺼라 판단됩니다.
W5100 모듈을 사용했을 때도 같은 코드를 사용하였습니다. 이때는 문제 없었습니다.

#4

W5500과 W5100은 드라이버의 구현 및 동작에 차이가 있는데,
혹시 드라이버 포팅 없이 기존 W5100과 동일한 드라이버를 사용하신 것은 아닌지 궁금합니다.

#5

가능하시면 함수 내부 코드를 올려주시면 분석하는데 더욱 도움이 되겠습니다.
감사합니다.

#6

Lib 형태의 라이브러리로 되어 있어서 확인이 안되며,
드라이버는 제공하는 W5500 드라이버를 사용하였습니다.

#7

Client에서 전송한 데이터는 Server에서 정상적으로 수신하는데 반해,
Server 측에서 client로 전송한 데이터가 깨진다면 W5500 칩 내 Tx buffer에 데이터를 채우고 잘못된 위치 포인터를 넘겨주었을 수 있습니다.

사용 중이신 소켓 번호와 할당된 Tx/Rx 버퍼 사이즈, Server의 Send 동작 시 Tx/Rx socket buffer pointer 레지스터의 값과 Tx/ Rx socket buffer의 덤프를 첨부해 주시면 확인해보도록 하겠습니다.

#8

W5500에서 보내는 데이타가 깨질 때를 감안해서, 회로도를 체크해 보았는데, 크게 문제 될 부분은 찾지 못하였습니다.

#9

MSP430 컴파일러의 문제였습니다.
unsigned long 타입을 shift 연산을 할 때 오류가 발생을 하여서 버퍼 어드레스가 엉뚱한 곳을 지시하였습니다.
아래와 같이 코드 수정하였더니 정상적으로 동작하네요.
빠른 대응에 대해 감사합니다~.

unsigned int wiz_write_buf_TX(unsigned int addrbsb, unsigned int cmd, unsigned char* buf,unsigned int len)
{
char str[64];

unsigned int idx = 0;
if(len == 0) printf("Unexpected2 length 0\r\n");

//IINCHIP_ISR_DISABLE(); // 
_DINT();
IINCHIP_CSoff();                            // CS=0, SPI start
IINCHIP_SpiSendData((addrbsb & 0xFF00)>> 8);// Address byte 1
IINCHIP_SpiSendData((addrbsb & 0x00FF)>> 0);// Address byte 2
IINCHIP_SpiSendData(cmd + 4);// Data write command and Write data length 1

sprintf(str, "Addr & Cmd >> %04X, %04X\n", addrbsb, cmd);
Print_rs232(str); 

for(idx = 0; idx < len; idx++)                   // Write data in loop
{
    IINCHIP_SpiSendData(buf[idx]);
}
IINCHIP_CSon();                                  // CS=1, SPI end
//IINCHIP_ISR_ENABLE(); // 
_EINT();                          // Interrupt Service Routine Enable    

return len;  

}