WIZnet Developer Forum

[W5100] Tcp Rx

w5100이 클라이언트입니다.
서버에서 0x640c 바이트를 전송합니다.
데이타는 모두 정상적으로 받았는데, 체크섬 에러가 발생하는것을 보면, 데이타가 깨지는것 같읍니다.
w5300에서 같은 프로그램을 구동시 정상입니다.

  1. w5100에서 작은 데이타들은 길이 1000byte미만 은 정상인거 같읍니다.(MTU에 의해 분할되서 들어오는 데이타 처리에 문제가 있는거 같읍니다.)
    즉, w5100에서 mtu이상의 데이타 처리일때만 발생하는것 같읍니다. 기존에 많이 사용해봄.(UDP처리 했고, 데이타를 항상 mtu보다 작게 처리해서 사용했읍니다.)
    -. 제공된 V190 드라이버에서 나름 분석해 보면(w5100.c)

void read_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len)
{
uint16 size;
uint16 src_mask;
uint8 * src_ptr;

src_mask = (uint16)src & getIINCHIP_RxMASK(s);
src_ptr = (uint8 *)(getIINCHIP_RxBASE(s) + src_mask);

if( (src_mask + len) > getIINCHIP_RxMAX(s) )
{ // 이부분이 약간 의심스럽습니다. 즉, 데이타가 크면 이 루틴으로 들어오면서 뭔가????
	size = getIINCHIP_RxMAX(s) - src_mask;  // getIINCHIP_RxMAX(s) 사이즈 이상일때만 들어옵니다., 길이가 적은 데이타는 이곳으로 오지 않읍니다.
	wiz_read_buf((uint16)src_ptr, (uint8*)dst,size);
	dst += size;
	size = len - size;
	src_ptr = (uint8 *)(getIINCHIP_RxBASE(s));
	wiz_read_buf((uint16)src_ptr, (uint8*) dst,size);
} 
else
{
	wiz_read_buf((uint16)src_ptr, (uint8*) dst,len); // 평상시 작은 데이타들은 이 루틴에만 들어갑니다.
}

}

-. sysinit(0x55, 0x55) or sysinit(0x03, 0x03) => 최대 사이즈
=> 메모리 설정과는 상관없이 같은 현상이 발생합니다.

-. 이미 판매중인 보드와 연결하기때문에 받는 데이타를 디버그용으로 줄수 없읍니다. 즉, 어디부분부터 깨졌는지 알수 없읍니다.

-. 인터럽트로 처리해도 결과는 같읍니다.(결국, 데이타가 오버되는 현상은 아닌거 같읍니다. TCP구조가 오버되게 전송되지 않겠죠.)

  1. 단순 테스트 해결방법
    -. 포인터를 항상 0으로 처리해서 실험해 보고 싶읍니다. 방법이 있을까요? => 단순히 0으로 하면 다른 루틴이 있어서 안되는거 같더군요.
    void recv_data_processing(SOCKET s, uint8 *data, uint16 len)
    {
    uint16 ptr;
    ptr = IINCHIP_READ(Sn_RX_RD0(s));
    ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD0(s) + 1);
    #ifdef DEF_IINCHIP_DBG
    printf(“ISR_RX: rd_ptr : %.4x\r\n”, ptr);
    #endif
    read_data(s, (uint8 *)ptr, data, len); // read data
    ptr = 0; // 제대로 동작 안함.

// ptr += len;
IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8));
IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff));
}

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.