안녕하세요
W5100 에 관해 질문드립니다
- 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 설정 상태임
- 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];
}
}
}
- TCP 통신의 경우 W5100 전송송도 Spec이 어떻게 되나요 ?? // 원하는 Spec : 21Mbps (3.2Mbps 까지 전송속도 확인)
다른 제품들의 전송 속도도 알고 싶습니다