W5100 전송 속도 및 설정 관련

안녕하세요
W5100 에 관해 질문드립니다

  1. FSR (Tx Free Size Register) 와 SEND_OK의 완료 시점 차이는 무엇인가요??

while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ); // 180us 지연

//======================================================================= // 200us 지연
do
{
freesize = getSn_TX_FSR(s);
status = IINCHIP_READ(Sn_SR(s));
if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT))
{
ret = 0;
break;
}
}while(freesize < ret);
//=======================================================================

이렇게 SEND OK 이후에도 FSR 레지스터에 지연이 생기네요 지연을 없애는 방법이 있나요? // No delayed ACK Register Enalbe 설정 상태임

  1. Socket0 Memory Size를 8k로 쓰려고 하는데 write_data 함수에서 TX_BUF에 값이 제데로 안들어가네요( 5000Byte Size Data) 코드 첨부합니다

void write_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len)
{
uint16 size;
uint16 dst_mask;
uint8 * dst_ptr;

dst_mask = (uint16)dst & getIINCHIP_TxMASK(s);
dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s) + dst_mask);

if (dst_mask + len > getIINCHIP_TxMAX(s)) 
{
	size = getIINCHIP_TxMAX(s) - dst_mask;		// 변수 값 , Register는  정상 	
	wiz_write_buf((uint16)dst_ptr, (uint8*)src, size);	// 정상적으로 Buffer copy가 될 때도 있고 	엉뚱한 곳의 번지로 copy 되기도 함
	src += size;                                                                 
	size = len - size;
	dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s));
	wiz_write_buf((uint16)dst_ptr, (uint8*)src, size);		// Tx_BASE의 번지로 Buffer가 copy 되지 않고 엉뚱한 곳의 번지로 copy됨
} 

}

// ==============================================
// 설정 부분입니다
// ==============================================
void sysinit(uint8 tx_size, uint8 rx_size) // tx_size , rx_size = 0x03 Socket0 8kbyte 설정
{ // tx_size , rx_size = 0x55 Socket0 2Kbyte 설정시 정상 동작함
int16 i; // Socket은 0번만 사용
int16 ssum,rsum;

ssum = 0;
rsum = 0;

IINCHIP_WRITE(TMSR,tx_size);	// Set Tx memory size for each channel
IINCHIP_WRITE(RMSR,rx_size);	// Set Rx memory size for each channel

SBUFBASEADDRESS[0] = (uint16)(__DEF_IINCHIP_MAP_TXBUF__);		// Set base address of Tx memory for channel #0 
RBUFBASEADDRESS[0] = (uint16)(__DEF_IINCHIP_MAP_RXBUF__);		// Set base address of Rx memory for channel #0 

for (i = 0 ; i < MAX_SOCK_NUM; i++)       // Set the size, masking and base address of Tx & Rx memory by each channel
{
	SSIZE[i] = (int16)(0);
	RSIZE[i] = (int16)(0);
	if (ssum < 8192)
	{
		switch((tx_size >> i*2) & 0x03)  // Set Tx memory size
		{
			case 0:
				SSIZE[i] = (int16)(1024);
				SMASK[i] = (uint16)(0x03FF);
			break;
			case 1:
				SSIZE[i] = (int16)(2048);
				SMASK[i] = (uint16)(0x07FF);
			break;
			case 2:
				SSIZE[i] = (int16)(4096);
				SMASK[i] = (uint16)(0x0FFF);
			break;
			case 3:
				SSIZE[i] = (int16)(8192);
				SMASK[i] = (uint16)(0x1FFF);
			break;
		}
	}
	if (rsum < 8192)
	{
		switch((rx_size >> i*2) & 0x03)     // Set Rx memory size
		{
			case 0:
				RSIZE[i] = (int16)(1024);
				RMASK[i] = (uint16)(0x03FF);
			break;
			case 1:
				RSIZE[i] = (int16)(2048);
				RMASK[i] = (uint16)(0x07FF);
			break;
			case 2:
				RSIZE[i] = (int16)(4096);
				RMASK[i] = (uint16)(0x0FFF);
			break;
			case 3:
				RSIZE[i] = (int16)(8192);
				RMASK[i] = (uint16)(0x1FFF);
			break;
		}
	}
	ssum += SSIZE[i];
	rsum += RSIZE[i];

	if (i != 0)             // Sets base address of Tx and Rx memory for channel #1,#2,#3
	{
		SBUFBASEADDRESS[i] = SBUFBASEADDRESS[i-1] + SSIZE[i-1];
		RBUFBASEADDRESS[i] = RBUFBASEADDRESS[i-1] + RSIZE[i-1];
	}
}

}

  1. TCP 통신의 경우 W5100 전송송도 Spec이 어떻게 되나요 ?? // 원하는 Spec : 21Mbps (3.2Mbps 까지 전송속도 확인)
    다른 제품들의 전송 속도도 알고 싶습니다

SEND_OK는 Socket Memory를 실제 Ethernet PHY로 보낼 준비가 되었음을 알리는 flag 입니다.
즉 SEND_OK가 확인되었다 하더라도, 실제 데이타가 Ethernet을 통해 전송되었는 것은 아닙니다.
FSR의 경우 상대방이 패킷을 수신을 하였다는 Ack packet 패킷을 수신할 경우 Update됩니다.
따라서 SEND_OK와 FSR update에는 지연이 당연히 발생하며, 지연 값은 상수 값으로 정의할수 없습니다.(망 환경에 따라 그때 그때 다름.)

Socket TX buffer 크기를 8K로 설정하였는지 한번 확인하세요.
즉 sysinit(0xC0, 0x55)로 호출하나요?
Socket 0 Tx mem을 우선 8K로 할당하시고 나머지 Socket 1~7 의 Tx mem은 전부 0으로 설정하셔야 합니다.

위즈네트의 TCP/IP Chip 제품들은 전부 이상적으로 100Mbps 속도를 보장하지만, 이를 제어하고, 데이타를 Socket Buffer가 복사하거나 읽어들이는 Host의 성능에 땨라 전송 속도는 천차 만별이 될 수 있습니다. 즉 Host의 성능에 따라 또한 망 환경에 따라 속도가 정해집니다. 참고로 Local 망에서 ARM7 (50MHz) 테스트 시 정확히 기억나지는 않지만 30Mbps 정도까지는 나왔던 걸로 기억합니다.

여기 참고하시면 이해에 도움이 되실겁니다.
http://www.wizwiki.net/forum/viewtopic.php?f=50&t=810&hilit=*sendok*

빠른 답변 감사합니다.
3번에 대해서만 다시 질문합니다

Wiznet 사이트 Product 메뉴에 각 제품 별 Network Perpomance 에서
W5100은 25Mbps , W5300은 80Mbps로 돼있는데
단순히 8bit bus , 16bit bus로 인한 속도 차이 인가요?(Chip 내부 RX,TX Buffer에 copy하는 속도 차이?)
아니면 Network 전송속도도 차이가 있나요?

W5100에서는 chip 내부 TX Buffer에 copy 하는 지연시간을 제외하면
전송속도(SEND_OK + FSR )는 40Mbps가 나옵니다

W5300으로 하면 달라지는 점이 있을까요??

부품 선정 중이라 빠른 답변 주시면 감사하겠습니다

전송속도는 칩모두 동일합니다. 하지만, W5300인 경우 내부버퍼가 128KB로 W5100 16KB의 8배입니다.
Memory Copy 속도 역시 전적으로 MCU 성능에 좌우되는 부분입니다.

W5300인 경우 Ideal한 속도가 80Mbps인 것인지 전용선이 아닌 일반 인터넷 망에서 80Mbps가 나오지 않을 수도 있습니다.