네 감사합니다. 이제 ping 문제도 해결되었고 소켓 접속과 종료까지는 되고 받는 데이터를 그대로 UART로 쏘게 했는데요 아마 데이터 사이즈 많큼 다 보내는것 같습니다. 그리고 이 뒤에는 소켓 접속 하고 종료도 잘 되고 그러는데 데이터는 쓰레기 값이 계속 올라옵니다.
제가 보내는 데이터는 "1"인데 FC 든 A0 든 이런 쓰레기값을 계속 보내는거 같습니다. 보내는 데이터를 바꿔도 같은값이 올라올때도 있고요…
MCU가 쓰레기값을 보내는동안 SPI 통신에서 MOSI와 MISO핀에서도 일정한 데이터가 계속 올라오고 그럽니다.
아마 MCU에서 보내서 그런거 같은데 RCR 레지스터를 수동으로 클리어 해줘야 하나요?
void InitWiznet(void)
{
u8 gw[4], sn[4], sip[4];
u8 mac[6];
#if (DEF_IINCHIP_BUS == DEF_IINCHIP_SPI_MODE)
//SPI Initialize
IINCHIP_SpiInit();
IINCHIP_CSInit();
IINCHIP_CSon();
#endif
getSHAR(mac);
getGAR(gw); getSUBR(sn); getSIPR(sip);
setMR(MR_RST);
IINCHIP_READ(MR);
setSHAR(mac);
setGAR(gw);
setSUBR(sn);
setSIPR(sip);
sysinit(0x55, 0x55);
}
void sysinit(
uint8 tx_size, /< tx_size Tx memory size (00 - 1KByte, 01- 2KBtye, 10 - 4KByte, 11 - 8KByte) */
uint8 rx_size /< rx_size Rx memory size (00 - 1KByte, 01- 2KBtye, 10 - 4KByte, 11 - 8KByte) */
)
{
int16 i;
int16 ssum,rsum;
#ifdef DEF_IINCHIP_DBG
printf(“sysinit()\r\n”);
#endif
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 */
#ifdef DEF_IINCHIP_DBG
printf(“Channel : SEND MEM SIZE : RECV MEM SIZE\r\n”);
#endif
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 >> i2) & 0x03) // Set Tx memory size
{
case 0:
SSIZE[i] = (int16)(1024);
SMASK[i] = (uint16)(0x07FF);
break;
case 1:
SSIZE[i] = (int16)(2048);
SMASK[i] = (uint16)(0x07FF);
break;
case 2:
SSIZE[i] = (int16)(4096);
SMASK[i] = (uint16)(0x07FF);
break;
case 3:
SSIZE[i] = (int16)(8192);
SMASK[i] = (uint16)(0x07FF);
break;
}
}
if (rsum < 8192)
{
switch((rx_size >> i2) & 0x03) // Set Rx memory size
{
case 0:
RSIZE[i] = (int16)(1024);
RMASK[i] = (uint16)(0x07FF);
break;
case 1:
RSIZE[i] = (int16)(2048);
RMASK[i] = (uint16)(0x07FF);
break;
case 2:
RSIZE[i] = (int16)(4096);
RMASK[i] = (uint16)(0x07FF);
break;
case 3:
RSIZE[i] = (int16)(8192);
RMASK[i] = (uint16)(0x07FF);
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];
}
#ifdef DEF_IINCHIP_DBG
printf(“%d : %.4x : %.4x : %.4x : %.4x\r\n”, i, (uint16)SBUFBASEADDRESS[i], (uint16)RBUFBASEADDRESS[i], SSIZE[i], RSIZE[i]);
#endif
}
}
void ProcessTcpSever(void)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
u8 text5[20] = " ";
int len;
unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
unsigned int port = MY_LISTEN_PORT;
switch(getSn_SR(SOCK_TCPS))
{
case SOCK_ESTABLISHED :
if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)
{
GR_LED = 1;
IINCHIP_WRITE(Sn_IR(SOCK_TCPS),Sn_IR_CON);
}
if((size = getSn_RX_RSR(SOCK_TCPS)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
{
if(size > TX_RX_MAX_BUF_SIZE) size = TX_RX_MAX_BUF_SIZE;
ret = recv(SOCK_TCPS,data_buf, size);
//if(data_buf[0] == 0xDA) WH_LED ^= 1;
//else RE_LED ^= 1;
//if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
sentsize = 0;
/*
if(RE_LED == 1)
{
sprintf(text5,“%d %d”,data_buf[0],data_buf[1]);
LCD_Display(7,text5,0,0,0,0,1);
Deletestr(text5,text5,0,strlen(text5));
RE_LED = 0;
}
*/ UART0_PUT_BYTE(data_buf[0]);
while(size != sentsize)
{
ret = send(SOCK_TCPS, data_buf+sentsize, size-sentsize);
if(ret < 0)
{
close(SOCK_TCPS);
// return ret;
}
sentsize += ret; // Don’t care SOCKERR_BUSY, because it is zero.
}
//RE_LED = 1;
//UART0_PUT_BYTE(size >> 8);
//UART0_PUT_BYTE(size & 0x00FF);
}
break;
case SOCK_CLOSE_WAIT :
disconnect(SOCK_TCPS);
// RE_LED =1; //return ret;
break;
case SOCK_INIT :
ret = listen(SOCK_TCPS);
// WH_LED =1;
break;
case SOCK_CLOSED:
ret = socket(SOCK_TCPS, Sn_MR_TCP, port, 0x00);
//GR_LED =0;
//RE_LED = 1;
break;
default:
break;
}