Hi,
I am using STM32F407 with uvision4, RL-TCPnet from keil and I have a problem in the Ethernet inicialization.
When I turn on the PC and turn on the board at the same time the Ethernet doesn’t work , but if I turn on the PC and after that I turn on the board the communication works.
I have two client sockets and one server socket. I have no hub, just the ethernet cable direct.
Do anyone already have this kind of problem?
The code is:
int main (void){ ... //INICIALIZA TCP NET init_TcpNet (); socket_tcp_cliente = tcp_get_socket (TCP_TYPE_CLIENT, 0, 5, tcp_callback_OSC); socket_tcp = tcp_get_socket (TCP_TYPE_CLIENT, 0, 5, tcp_callback_OSC); /* Initialize TCP Socket and start listening */ socket_tcp_escrita = tcp_get_socket (TCP_TYPE_SERVER, 0, 30, tcp_callback); if (socket_tcp_escrita != 0) { tcp_listen (socket_tcp_escrita, 2002); } os_sys_init (task_init); /* Inicializa Sistema Operacional */ }
__task void timer_task (void){ os_itv_set (100); while (1) { timer_tick (); tick = __TRUE; os_itv_wait (); } }
__task void task_Resposta (void){ char estado_tcp = 0; unsigned int indice = 0; // os_itv_set(100); for(;;){ estado_tcp = tcp_get_state(socket_tcp_cliente); switch (estado_tcp) { case TCP_STATE_FREE: break; case TCP_STATE_CLOSED: Rem_IP[3] = 62; if (tcp_connect (socket_tcp_cliente, Rem_IP, 5001, 0)){ delay_oscilografia = 100; }else{ delay_oscilografia = 1000; } break; case TCP_STATE_CONNECT: if (tcp_check_send (socket_tcp_cliente) == __TRUE) { sendbuf_Resposta = tcp_get_buf(1206); sendbuf_Resposta[0] = 'O'; sendbuf_Resposta[1] = 'S'; sendbuf_Resposta[2] = 'C'; for (indice = 0; indice < 1200; indice++) sendbuf_Resposta[indice + 3] = Oscilografia_IHM[indice]; sendbuf_Resposta[indice + 3] = 'O'; sendbuf_Resposta[indice + 4] = 'S'; sendbuf_Resposta[indice + 5] = 'C'; cont_teste_IHM ++; tcp_send (socket_tcp_cliente, sendbuf_Resposta, 1206); } break; } // os_itv_wait(); os_dly_wait(delay_oscilografia); } }
/*---------------------------------------------------------------------------- * Task 5: Ethernet Tcp Task *---------------------------------------------------------------------------*/ __task void tcp_task(void){ while (1) { main_TcpNet(); os_tsk_pass(); } }
U16 tcp_callback_OSC (U8 soc, U8 evt, U8 *ptr, U16 par) { if (soc == socket_tcp) { switch (evt) { case TCP_EVT_CONREQ: /* Remote host is trying to connect to our TCP socket. */ /* 'ptr' points to Remote IP, 'par' holds the remote port. */ /* Return 1 to accept connection, or 0 to reject connection */ return (1); case TCP_EVT_ABORT: /* Connection was aborted */ break; case TCP_EVT_CONNECT: /* Socket is connected to remote peer. */ break; case TCP_EVT_CLOSE: /* Connection has been closed */ break; case TCP_EVT_ACK: /* Our sent data has been acknowledged by remote peer */ break; case TCP_EVT_DATA: /* TCP data frame has been received, 'ptr' points to data */ /* Data length is 'par' bytes */ break; } } return (0); }
1) Static.
2) I tried it but only work if I call the init_tcpnet with the tcp_get_socket again. The function init_tcpnet take a lot of time to run and its not cool for me (3 seconds with the arm doing only it). Any idea about what I can do?
3) Ok.
4) Ok.
Thank you for the response!!