/** *@brief TCP模式初始化 客户端 默认连接三次,三次连接不上,返回Fail *@param 无 *@return 无 */ u8 RJ45_1_TCP_ClientInit(void) { u8 i,j=0; RJ45_1_Write_Register(SIMR,1<<0); //允许SOCKET0产生中断 RJ45_1_Write_Register(Sn_IMR(0) ,Sn_IR_RECV|Sn_IR_DISCON|Sn_IR_CON); //设置中断屏蔽寄存器 CloseSocket_RJ45_1(); RJ45_1_Write_Register(Sn_MR(0),Sn_MR_TCP|Sn_MR_ND); //tcp模式,无延时 WriteTem[0]=RJ45_1_Loc_Potr/256; WriteTem[1]=RJ45_1_Loc_Potr%256; RJ45_1_Write_Buf(Sn_PORT0(0),WriteTem,2); //设置端口号 WriteTem[0]=RJ45_1_Dir_Port/256; WriteTem[1]=RJ45_1_Dir_Port%256; RJ45_1_Write_Buf(Sn_DPORT0(0),WriteTem,2); //设置目标服务器端口号 RJ45_1_Write_Buf(Sn_DIPR0(0),RJ45_1_DirIP,4); //目标服务器IP地址 RJ45_1_Write_Register(Sn_KPALVTR(0),1); //每5s自动检测一次连接状态 Init1: RJ45_1_Write_Register(Sn_CR(0),Sn_CR_OPEN); for(i=0;i<20;i++); while(RJ45_1_Read_Register(Sn_CR(0))) /*Wait to process the command*/ { for(i=0;i<20;i++); } if(RJ45_1_Read_Register(Sn_SR(0))!=SOCK_INIT) //检测网口开启状态 { j++; if(j<10) { CloseSocket_RJ45_1(); goto Init1; } else { CloseSocket_RJ45_1(); return Fail; } } RJ45_1_Write_Register(Sn_CR(0),Sn_CR_CONNECT); //开启连接 RJ45_1_Read_Buf(Sn_DIPR0(0),RJ45_1_DirIP,4); while(RJ45_1_Read_Register(Sn_CR(0))) /*Wait to process the command*/ { } while(RJ45_1_Read_Register(Sn_SR(0))!=SOCK_SYNSENT) { if(RJ45_1_Read_Register(Sn_SR(0))==SOCK_ESTABLISHED) { return Success; } if(RJ45_1_Read_Register(Sn_IR(0))& Sn_IR_TIMEOUT) { RJ45_1_Write_Register(Sn_IR(0),Sn_IR_TIMEOUT); return Fail; } } }
/** @brief This function established the connection for the channel in Active (client) mode. This function waits for the untill the connection is established. @return 1 for success else 0. */ uint8 connect(SOCKET s, uint8 * addr, uint16 port) { uint8 ret; #ifdef __DEF_IINCHIP_DBG__ printf("connect()\r\n"); #endif if ( ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || (port == 0x00) ) { ret = 0; #ifdef __DEF_IINCHIP_DBG__ printf("Fail[invalid ip,port]\r\n"); #endif } else { ret = 1; // set destination IP wiz_write_buf(Sn_DIPR0(s), addr,4); wiz_write_word(Sn_DPORT0(s),port); wiz_write_byte(Sn_CR(s),Sn_CR_CONNECT); /* m2008.01 [bj] : wait for completion */ while ( wiz_read_byte(Sn_CR(s)) ) ; } return ret; }
// return values: // 1 on success // 0 otherwise int EthernetDNSClass::_startDNSSession() { (void)this->_closeDNSSession(); int i; for (i = NUM_SOCKETS-1; i>=0; i--) if (SOCK_CLOSED == IINCHIP_READ(Sn_SR(i))) { if (socket(i, Sn_MR_UDP, DNS_CLIENT_PORT, 0) > 0) { this->_socket = i; break; } } if (this->_socket < 0) return 0; uint16 port = DNS_SERVER_PORT; for (i=0; i<4; i++) IINCHIP_WRITE((Sn_DIPR0(this->_socket) + i), this->_dnsData.serverIpAddr[i]); IINCHIP_WRITE(Sn_DPORT0(this->_socket), (uint8)((port & 0xff00) >> 8)); IINCHIP_WRITE((Sn_DPORT0(this->_socket) + 1), (uint8)(port & 0x00ff)); return 1; }
/*----------- TCP Server Routine ------------*/ void ProcessTcpServer(SOCKET mSocket, uint16 port) { // if len is not volatile, it will overflow // and causes 'cstack' overstack error volatile uint16_t len; getSn = getSn_SR(mSocket); switch (getSn_SR(mSocket)) { case SOCK_ESTABLISHED: if(ch_status[mSocket] == 0) { printf("\r\n------------------------"); printf("\r\nSocket No. %d : Connected", mSocket); printf("\r\n - Peer IP : %d.%d.%d.%d", IINCHIP_READ(Sn_DIPR0(mSocket)+0), IINCHIP_READ(Sn_DIPR0(mSocket)+1), IINCHIP_READ(Sn_DIPR0(mSocket)+2), IINCHIP_READ(Sn_DIPR0(mSocket)+3)); printf("\r\n - Peer Port : %d", ( (uint16)(IINCHIP_READ(Sn_DPORT0(mSocket)+0)<<8) + (uint16)IINCHIP_READ(Sn_DPORT0(mSocket)+1)) ); printf("\r\n - Source Port : %d", IINCHIP_READ(Sn_PORT0(mSocket))); ch_status[mSocket] = 1; } /* check Rx data and set flags only when there's valid character recognized */ if ((len = getSn_RX_RSR(mSocket)) > 0) { /* if Rx data size is lager than TX_RX_MAX_BUF_SIZE */ /* the data size to read is MAX_BUF_SIZE. */ if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; switch(mSocket) { case SOCK_ZERO : E1Flag = true; break; // EQ-DAQ-01 board case SOCK_ONE : E2Flag = true; break; // EQ-DAQ-02 board case SOCK_TWO : PCFlag = true; break; // PC Client default : break; } /* prevent from overflowing */ len = recv(mSocket, RX_BUF, len); } break; case SOCK_CLOSE_WAIT: E1Flag = false; // Reset E1 flag E2Flag = false; // Reset E2 flag PCFlag = false; // Reset PC flag printf("\r\nSocket No. %d : CLOSE_WAIT", mSocket); // disconnect and set status disconnect(mSocket); ch_status[mSocket] = 0; break; case SOCK_INIT: lis = listen(mSocket); break; case SOCK_CLOSED: //reinitialize the socket if(socket(mSocket, Sn_MR_TCP, port ,0x00) == 0) { printf("Fail to create socket."); } else { E1Flag = false; // Reset E1 flag E2Flag = false; // Reset E2 flag PCFlag = false; // Reset PC flag lis = listen(mSocket); } break; } }
/*----------- TCP Server Routine ------------*/ void ProcessTcpSever(SOCKET mSocket, uint16 port) { // if len is not volatile, it will overflow // and causes 'cstack' overstack error volatile uint16_t len; getSn = getSn_SR(mSocket); switch (getSn_SR(mSocket)) { case SOCK_ESTABLISHED: if(ch_status[mSocket] == 0) { printf("\r\n------------------------"); printf("\r\nSocket No. %d : Connected", mSocket); printf("\r\n - Peer IP : %d.%d.%d.%d", IINCHIP_READ(Sn_DIPR0(mSocket)+0), IINCHIP_READ(Sn_DIPR0(mSocket)+1), IINCHIP_READ(Sn_DIPR0(mSocket)+2), IINCHIP_READ(Sn_DIPR0(mSocket)+3)); printf("\r\n - Peer Port : %d", ( (uint16)(IINCHIP_READ(Sn_DPORT0(mSocket)+0)<<8) + (uint16)IINCHIP_READ(Sn_DPORT0(mSocket)+1)) ); printf("\r\n - Source Port : %d", IINCHIP_READ(Sn_PORT0(mSocket))); ch_status[mSocket] = 1; } /* check Rx data */ if ((len = getSn_RX_RSR(mSocket)) > 0) { /* if Rx data size is lager than TX_RX_MAX_BUF_SIZE */ /* the data size to read is MAX_BUF_SIZE. */ if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; /* read the received data */ len = recv(mSocket, RX_BUF, len); RSR_len = len; if(mSocket == EQ_ONE) { } // start send those data SendFlag = True; /* send the received data */ //send(mSocket, RX_BUF, len, (bool)False); } /* send the received data */ //send(SOCK_TCPS, data_buf, len); break; case SOCK_CLOSE_WAIT: SendFlag = False; // Reset flag printf("\r\nSocket No. %d : CLOSE_WAIT", mSocket); // disconnect and set status disconnect(mSocket); ch_status[mSocket] = 0; break; case SOCK_INIT: lis = listen(mSocket); break; case SOCK_CLOSED: //reinitialize the socket if(socket(mSocket, Sn_MR_TCP, port ,0x00) == 0) { printf("Fail to create socket."); } else { SendFlag = False; // Reset flag lis = listen(mSocket); } break; } }
/** @brief This function is an application I/F function which is used to send the data for other then TCP mode. Unlike TCP transmission, The peer's destination address and the port is needed. @return This function return send data size for success else -1. */ uint16 sendto( SOCKET s, /**< socket index */ const uint8 * buf, /**< a pointer to the data */ uint16 len, /**< the data size to send */ uint8 * addr, /**< the peer's Destination IP address */ uint16 port /**< the peer's destination port number */ ) { uint16 ret=0; if (len > IINCHIP_TxMAX) ret = IINCHIP_TxMAX; // check size not to exceed MAX size. else ret = len; if ( ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || ((port == 0x00)) ||(ret == 0) ) { /* +2008.01 [bj] : added return value */ ret = 0; } else { wiz_write_buf(Sn_DIPR0(s),addr,4); wiz_write_word(Sn_DPORT0(s),port); send_data_processing(s, (uint8 *)buf, ret); /* +2008.01 bj */ #ifdef __DEF_IINCHIP_INT__ while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) #else while ( (wiz_read_byte(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) #endif { #ifdef __DEF_IINCHIP_INT__ if (getISR(s) & Sn_IR_TIMEOUT) #else if (wiz_read_byte(Sn_IR(s)) & Sn_IR_TIMEOUT) #endif { #ifdef __DEF_IINCHIP_DBG__ printf("send fail.\r\n"); #endif /* +2008.01 [bj]: clear interrupt */ #ifdef __DEF_IINCHIP_INT__ putISR(s, getISR(s) & ~(Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ #else wiz_write_byte(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ #endif return 0; } } /* +2008.01 bj */ #ifdef __DEF_IINCHIP_INT__ putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); #else wiz_write_byte(Sn_IR(s), Sn_IR_SEND_OK); #endif } return ret; }