AnsweredAssumed Answered

Hello , im having the follwing problem using my FRDM K64F platform, Im developing a Gateway that synchronizes its RTC with an SNTP server.

Question asked by javier verde on Jun 10, 2016
Latest reply on Jul 7, 2016 by javier verde

When using any of the IP binding functions (ipcfg_bind_staticip, auto or DHCP) i don´t get a result, the system gets halted there, waiting for the function to finish ( it can be with an error or with the binding done succesfully) . This does not happen every time, but very frecuently. The code im using is the following ( the ip config and binding its highlighted in the end ) ( sorry for the comments in spanish , im from argentina )  :


void main_task (uint32_t initial_data)


  IPCFG_IP_ADDRESS_DATA ip_data; //Estructura de datos de ip.

  _enet_address mac_address; //Definition for ENET six-byte Mac type. Vector de 6 uchar.

  uint32_t error; //Captura código de error

  uint8_t lastIp[4][4] = {0}; //Almaceno últimos valores. 0: Ip Servidor. 1: Ip Frdm. 2: MaskFrdm. 3: GtyFrdm.

  uint8_t verparamIp[4][4] = {0}; //Idem anterior pero utilizado para el comando verparam. Así si estoy cargando IPs y en el medio quiero ver parámetros no sobreescribe los valores ya cargados.

  uint8_t estampa[8] = {0}; //Buffer para escribir en pantalla luego de un itoa

  uint32_t lastIpaddr[4] = {0}; //Buffer donde se guardan los IPADDR luego de una leerIPdeFlash()

  uint32_t * checkIP = BASE_IPS_FLASH; //Dirección base 0xFB000. Se usa para revisar si la flash está vacía

  uint8_t i;

  uint16_t tiempo_poleo; //Almaceno el tiempo de poleo

  uint16_t verparam_tiempo_poleo; //Lo utilizo para leerlo en el menú verparam (idem verparamIp)

  uart_state_t uartState, consoleState;


  _queue_id maintask_qid;

  uint16_t __ram_func[LAUNCH_CMD_SIZE/2]; //array to copy __Launch_Command func to RAM



  /* Inicialización de pines de entrada/salida */


  /* Inicialización de UART0 y UART3 */

  //Uart 3

  PORT_HAL_SetMuxMode((PORT_Type *)PORTC_BASE,16u,kPortMuxAlt3); // UART3_TX

  PORT_HAL_SetMuxMode((PORT_Type *)PORTC_BASE,17u,kPortMuxAlt3); // UART3_RX

  UART_DRV_Init(UART_INSTANCE, &uartState, &uartConfig);

  UART_DRV_InstallRxCallback(UART_INSTANCE, intPidenhora, NULL, NULL, true);

  //Uart 0

  UART_DRV_Deinit(CONSOLE_INSTANCE); //Elimino la UART abierta por MQX

  UART_DRV_Init(CONSOLE_INSTANCE, &consoleState, &consoleConfig); //Vuelvo a inicializarla



  /* Instalación de interrupciones en el vector */

  OSA_InstallIntHandler(PORTD_IRQn, (osa_int_handler_t)intTimestamp); //Int para PTD3. Evento externo.

  OSA_InstallIntHandler(UART3_RX_TX_IRQn, MQX_UART3_RX_TX_IRQHandler); //Int para UART3. Envío de time al CV.

  OSA_InstallIntHandler(UART0_RX_TX_IRQn, MQX_UART0_RX_TX_IRQHandler); //Int para UART0. Programa de consola.


/* Seteo de prioridades de las interrupciones: 0x70 (Prioridad 7 > 2*MQX_MAX_LEVEL_INTERRUPT = 2*2 */

  NVIC_SetPriority(UART3_RX_TX_IRQn, 112U);

  NVIC_SetPriority(UART0_RX_TX_IRQn, 112u);//112U


  /* Creación de RTCS */

  _RTCSTASK_priority = 6;//6


  error = RTCS_create();


  { enviar_cadena("Error tarea RTC",3);

  //printf("\nFailed to create RTCS, error = %X", (unsigned int)error);





  /* Inicialización de cola de mensajes para recibir IPs desde la tarea de consola */

  maintask_qid = _msgq_open(/*(_queue_number)*/MAIN_TASK_QUEUE, 0);



  /* Inicialización de FLASH para guardar IPs (no volatil) */

  error = FlashInit(&flashSSDConfig);

  if (FTFx_OK != error)


  enviar_cadena("Error al iniciar la Flash",3);


  //This function provides a facility to relocate a function in RAM

  g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)__ram_func , LAUNCH_CMD_SIZE ,(uint32_t)FlashCommandSequence);



  /**** INICIO de inicialización valores por default en la flash si está limpia ****/

  enviar_cadena("Iniciando GTW-NL...",3);

  enviar_cadena("Restableciendo parámetros de red...",2);

  if((*(checkIP) == 0xFFFFFFFF) && (*(checkIP+1) == 0xFFFFFFFF) && (*(checkIP+2) == 0xFFFFFFFF) && (*(checkIP+3) == 0xFFFFFFFF))


  lastIp[0][0] = 66; lastIp[0][1] = 60; lastIp[0][2] = 22; lastIp[0][3] = 202; //IpServ por default:

  lastIp[1][0] = 192; lastIp[1][1] = 168; lastIp[1][2] = 1; lastIp[1][3] = 141; //IpFrdm por default

  lastIp[2][0] = 255; lastIp[2][1] = 255; lastIp[2][2] = 255; lastIp[2][3] = 0; //Mask por default:

  lastIp[3][0] = 192; lastIp[3][1] = 168; lastIp[3][2] = 1; lastIp[3][3] = 1; //gateway por default:

  guardarIPenFlash((uint8_t *)lastIp);

  tiempo_poleo = SNTP_POLL_SEC;

  guardarPolltimeEnFlash((uint8_t *)&tiempo_poleo);


  enviar_cadena("Paso IF",3);


  leerIPdeFlash((uint8_t *)lastIp, (uint32_t *)lastIpaddr);

  ip_data.ip = lastIpaddr[1];

  ip_data.mask = lastIpaddr[2];

ip_data.gateway = lastIpaddr[3];

  ENET_get_mac_address(BSP_DEFAULT_ENET_DEVICE, ip_data.ip, mac_address); //Obtiene dirección MAC de un dispositivo no inicializado. La guarda en mac_address.

  enviar_cadena("Paso MAC",3);

  ipcfg_init_device(BSP_DEFAULT_ENET_DEVICE, mac_address); //Initializes given enet device and associated ip interface

  enviar_cadena("Paso init ip",3);

  _task_create(0, WATCHDOG_TASK, 0);

  ipcfg_unbind (BSP_DEFAULT_ENET_DEVICE);

  error = ipcfg_bind_dhcp_wait(BSP_DEFAULT_ENET_DEVICE,TRUE, &ip_data);

  //error = ipcfg_bind_staticip(BSP_DEFAULT_ENET_DEVICE, &ip_data);

  enviar_cadena("Paso ip bind",3);

  error =SNTP_init(HOSTNAME, SNTP_PRIORITY, SNTP_STACKSIZE, lastIpaddr[0], tiempo_poleo); //7 //crea un nuevo cliente sntp


  enviar_cadena("Error SNTP",3);

  itoa(error, (char *) estampa);

  enviar_cadena((char *)estampa, 2);


  enviar_cadena("Inicialización exitosa.",2);

  /**** FIN de inicialización de valores por default ****/


Is anyone else having the same problem ? i dont get an error code , so could it be a problem of my router ?