jueves, 9 de febrero de 2017

PRACTICA # 18 ETHERNET (WEB SERVER)

OBJETIVO:
       Haremos uso del módulo ETHERNET con el que cuenta el MCU R5F563NB de la tarjeta de evaluación YRDKRX63N. 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
  • Se configura el driver RSPI
  • Se correrá web Server y se mostrará la IP de asignación vía LCD

DESARROLLO:
  • Del documento Renesas RX63N RDK User's Manual mostramos los pines asignados para la interfaz Ethernet.

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


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


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


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

Donde bsp es a carpeta de inicialización y arranque del microcontrolador.
La carpeta Driver posee la capa física y registros del módulo ethernet.
La carpeta r_rspi_rx600 contiene todos los archivos necesarios para así poder acceder de forma fácil al RSPI.
La carpeta uip es el stack del ethernet.
La carpeta r_glyph contiene los archivos driver para el control de la LCD gráfica.
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.- 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.

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


8.- 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;
    struct uip_eth_addr mac_addr;
    uint32_t ch = 0;

    lcd_initialize();
    display_uip_demo();

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

    /* Retrieve the MAC address and display result. */
    if (!get_mac(&mac_addr))
    {
        lcd_display(LCD_LINE5, "Using Default MAC:");   
    }  
    else
    {
        lcd_display(LCD_LINE5, "MAC Address = ");        
    }
    display_mac_address(mac_addr.addr);   

    // 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*) &mac_addr.addr[0]));

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

    // Renesas --
    //uip_ipaddr(ipaddr, 192,168,0,2);
    //uip_sethostaddr(ipaddr);
    dhcpc_init(&mac_addr.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:
Practica #18

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



RESULTADOS:







No hay comentarios.:

Publicar un comentario