domingo, 8 de enero de 2017

PRACTICA # 17 ETHERNET

OBJETIVO:
       Haremos uso del módulo ETHERNET con el que cuenta el MCU R5F562N8 de la tarjeta de evaluación YRDKRX62N. Configuraremos el stack uIP partiendo de la nota de aplicación de Renesas R01AN0586EU0100 y arrancaremos el sistema en modo web Server.
  •  Configuraremos stack del uIP
  •  Agregaremos librerías RPDL
  •  Se correrá web Server y se mostrará la IP de asignación vía LCD

DESARROLLO:

PASOS:
  • Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project / Renesas RXC ToolChain


3.- Seleccionar el target R5F562N8, debug hardware Segger jLink, después next


4.- Seleccionar C/C++ Source file y por ultimo Finish.


5.- Una vez agregado el stack uIPa las carpetas, el árbol de archivos queda de la siguiente manera:

Donde: 
  • bsp es a carpeta de inicialización y arranque del microcontrolador, librería lcd y configuración de RSPI. 
  • La carpeta Driver posee la capa física y registros del módulo ethernet. 
  • La carpeta RPDL contiene todos los archivos necesarios para la librería RX62N_library.lib y asi poder acceder de forma fácil al RSPI. 
  • La carpeta uip es el stack del ethernet. 
  • La carpeta user-app se define el arranque del tipo de aplicaciones a ejecutar sobre la capa del stack uip, es decir si es webserver, cliente, telnet, etc.6.-Agregrera las librerías GlyphLip_v2.lb y RX62N_library.lib La primera es para el LCD gráfico y la segunda para el control del módulo de comunicación RSPI.

6.-Agregrera las librerías GlyphLip_v2.lb y RX62N_library.lib La primera es para el LCD gráfico y la segunda para el control del módulo de comunicación RSPI.


7.- La sección de memoria queda como la siguiente imagen:

Nota: en la carpeta del proyecto se tiene el archivo linker.esi el cual puede exportar toda la configuración sin necesidad de agregarles manualmente.


8.- Incluir todas las carpetas de los directorios mostrados a continuación:


9.- La función principal main.c que se encuentra en la carpeta uIP queda de la siguiente forma:

int main(void)
{
  int i;
  // Renesas -- uip_ipaddr_t ipaddr;
  struct timer periodic_timer, arp_timer;
  uint32_t ch = 0;

  // Renesas ++
  InitialiseLCD();
  DisplayuIPDemo();

  timer_init();
  timer_set(&periodic_timer, CLOCK_SECOND / 2);
  timer_set(&arp_timer, CLOCK_SECOND * 10);

  // Renesas -- network_device_init();
  /* Wait until Ether device initailize succesfully.
     Make sure Ethernet cable is plugged in. */
  while (R_ETHER_ERROR == R_Ether_Open(ch, (uint8_t*)&my_mac.addr[0]));

  // Renesas ++ set Ethernet address
  uip_setethaddr(my_mac);
  uip_init();

  // Renesas --
  //uip_ipaddr(ipaddr, 192,168,0,2);
  //uip_sethostaddr(ipaddr);
  dhcpc_init(&my_mac.addr[0], 6);
  httpd_init();

  while (1)
  {
    // Renesas -- uip_len = network_device_read();
    uip_len = R_Ether_Read(ch, (void *)uip_buf);
    if (uip_len > 0)
    {
      if (BUF->type == htons(UIP_ETHTYPE_IP))
      {
        uip_arp_ipin();
        uip_input();
        /* If the above function invocation resulted in data that
           should be sent out on the network, the global variable
           uip_len is set to a value > 0. */
        if (uip_len > 0)
        {
          uip_arp_out();
          // Renesas -- network_device_send();
          R_Ether_Write(ch, (void *)uip_buf, (uint32_t)uip_len);
        }
      }
      else if (BUF->type == htons(UIP_ETHTYPE_ARP))
      {
        uip_arp_arpin();
        /* If the above function invocation resulted in data that
           should be sent out on the network, the global variable
           uip_len is set to a value > 0. */
        if (uip_len > 0)
        {
          // Renesas -- network_device_send();
          R_Ether_Write(ch, (void *)uip_buf, (uint32_t)uip_len);
        }
      }

    }
    else if (timer_expired(&periodic_timer))
    {
      timer_reset(&periodic_timer);
      for (i = 0; i < UIP_CONNS; i++)
      {
        uip_periodic(i);
        /* If the above function invocation resulted in data that
           should be sent out on the network, the global variable
           uip_len is set to a value > 0. */
        if (uip_len > 0)
        {
          uip_arp_out();
          // Renesas -- network_device_send();
          R_Ether_Write(ch, (void *)uip_buf, (uint32_t)uip_len);
        }
      }

#if UIP_UDP
      for (i = 0; i < UIP_UDP_CONNS; i++)
      {
        uip_udp_periodic(i);
        /* If the above function invocation resulted in data that
           should be sent out on the network, the global variable
           uip_len is set to a value > 0. */
        if (uip_len > 0)
        {
          uip_arp_out();
          // Renesas -- network_device_send();
          R_Ether_Write(ch, (void *)uip_buf, (uint32_t)uip_len);
        }
      }
#endif /* UIP_UDP */

      /* Call the ARP timer function every 10 seconds. */
      if (timer_expired(&arp_timer))
      {
        timer_reset(&arp_timer);
        uip_arp_timer();
      }
    }

    // Insert user aplications here.
    // Call WEB application that controls LEDs on the target board.
    user_app();
           
  }
  return 0;
}


  •  Agregar código, compilar y debug:
1.- Bajar el código de:


2.- Compilar con el icono del martillo y debug con el icono del insecto:


RESULTADOS:








No hay comentarios.:

Publicar un comentario