W5300 Client TCP

안녕하세요. w5300과 DSP28335를 가지고 TCP 통신 중에 문제되는 사항이 있어 글을 올립니다.

개발환경
DSP 28335, CCS V6, w5300 16bit Data Length, Base Address : 0x4000

현상

  • w5300을 Server로 놓고 PC를 Client로 접속하였시 정상동작
  • w5300을 Client로 놓고 PC를 Server로 했을 경우 접속불가

소스코드

  • 소스코드는 귀사의 홈페이지에서 받은 자료를 사용했으며, w5300_Drv_V1.2.5 를 참고하였습니다.

디버깅

  • DIPR 16Bit 레지스터에 입력한 값의 상위 8Bit만 입력됨.
    S0_PORTR의 경우 아래와 같이 정상적으로 Data가 써집니다. (w5300 Port NO : 0x1234)


    S0_DIPR의 경우 아래와 같이 상위 8bit만 반복적으로 써집니다. (Target Port NO : 0x1234 → 0x1212) : 비교를 위해 포트번호를 같게 놓았고 실제는 다르게 설정하였습니다.


    IP는 캡쳐되 것과 같이 정상적으로 입력되었고 Port 번호만 비정상적으로 Write 됩니다. (DIPR : 192.6.95.2 → 0xC0 0x06 0x5F 0x02)

  • 테스트 해보니 PORTR 레지스터의 경우 (((uint16)Baseadd + 0x20A)) = value; 와 같이 Data를 쓰면 메모리에 바로 입력되는 것을 확인하였습니다.
    DORTR의 경우에는 Data를 써도 바로 메모리에 Update 되지 않고 Sn_CR = 0x04; 로 입력해야만 Update가 되더군요.

  • PORTR과 같이 하드코딩 했을때 바로 입력되면 원인파악이 쉬울텐데 DORTR의 경우 유저가 쓴 데이터를 Sn_CR 상태에 따라 내부적으로 처리하는듯 합니다.

  • 귀사의 Errata에 작성된 DPORTR 문제와 비슷하긴 하나 해당 문서에는 w5300 메모리에는 정상적인 값이 들어간다고 나와 있으므로 현상은 틀린것으로 보여집니다.

  • 게시판을 보니 저와 비슷한 문제(w5300 Client)로 작성된 글은 보이나 명확한 원인 규명이나 솔루션이 제공되지 않은 상태로 보여집니다.
    Wire Shark등의 툴을 사용하여 보았으나 아예 접속이 이루어 지지 않는 것으로 확인 되었습니다.

  • DPORTR 문제인지 확신할 순 없으나 정상동작 되는 TCP Server 모드와 비교 분석해 봤을때 w5300에서 DPORTR을 업데이트 하는 과정에서 생기는 문제로 예상되어 집니다.

추신 :
혹시 다음버전 API 자료 업데이트시 recv 함수의 Packet size 판단하는 부분을 아래와 같이 수정해 주셨으면 합니다.
if(getSn_RX_RSR(s))
{
pack_size=IINCHIP_READ(Sn_RX_FIFOR(s));
}
기존소스는 getSn_RX_RSR(s)없이 진행되어 이전 데이터가 FIFOR에 남아 있다면 메모리에 엄청난 양의 쓰레기 값이 들어가는 현상이 확인 되었습니다.

환절기 감기조심하시고 바쁘시겠지만 위 문제에 대한 명확한 답변 부탁드립니다. (개발기간이 지연되고 있습니다…)

Port 문제가 아니라 방화벽 문제였네요.
작성된 글중에 방화벽 관련 내용이 있어 한번 시도해보니 잘되네요 ㅠ ㅠ
그럼 수고하세요.~

해결되어서 다행입니다 ^^