---
title: "[W5100] Tcp Rx"
url: "https://maker.wiznet.io/forum/12470"
markdown_url: "https://maker.wiznet.io/forum/12470/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "roh faithmaker kr"
created: "2017-09-11T08:34:10+09:00"
last_activity: "2017-09-12T00:12:54+09:00"
language: "ko"
views: 643
replies: 0
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# [W5100] Tcp Rx

## Question

Asked by roh faithmaker kr on 2017-09-11 in Ethernet Chips.

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) &lt;&lt; 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));
}

---

Source: https://maker.wiznet.io/forum/12470
