Jump to content

    
Sign in to follow this  
somebody111

Конфигурирование LwIP для отправки UDP пакета на 255.255.255.255

Recommended Posts

Добрый день. Есть контроллер TM4C129ENCPDT13.

Задача: отправить udp пакет по широковещательному адресу 255.255.255.255 на заданный порт. После первой строчки udp_send (сконфиругирован на 255.255.255.255) контроллер уходит в FaultIsr. На любой другой - без проблем. Что-то где-то я не сконфигурировал...

Инициализация:

void EthernetUDPInit(uint32_t freq)
{
    uint32_t ui32User0, ui32User1;
    uint8_t pui8MACArray[8];

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    GPIOPinConfigure(GPIO_PK4_EN0LED0);
    GPIOPinConfigure(GPIO_PK6_EN0LED1);
    GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_4 | GPIO_PIN_6);


    ROM_FlashUserGet(&ui32User0, &ui32User1);

    pui8MACArray[0] = ((ui32User0 >>  0) & 0xff);
    pui8MACArray[1] = ((ui32User0 >>  8) & 0xff);
    pui8MACArray[2] = ((ui32User0 >> 16) & 0xff);
    pui8MACArray[3] = ((ui32User1 >>  0) & 0xff);
    pui8MACArray[4] = ((ui32User1 >>  8) & 0xff);
    pui8MACArray[5] = ((ui32User1 >> 16) & 0xff);

    lwIPInit(freq, pui8MACArray, 0, 0, 0, IPADDR_USE_AUTOIP);
    udp_init();
    ROM_IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY);
    ROM_IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY);

}

Тестовая программа:

    char buf [512];
    char buf1 [512];
    g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                             SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                                             SYSCTL_CFG_VCO_480), 120000000);
    // Configure the device pins.
    //

    //EthernetPing configure

    // Configure SysTick for a periodic interrupt.
    //
    ROM_SysTickPeriodSet(g_ui32SysClock);
    ROM_SysTickEnable();

    gpio_init();
    EthernetUDPInit(g_ui32SysClock);

    buf[0] = 'A';
    buf[1] = 'B';
    buf[2] = 'C';
    buf[3] = 'D';
    buf[4] = 'E';


    struct udp_pcb *UDPSock1 = udp_new();
    ip_set_option(UDPSock1, SOF_BROADCAST);
    struct udp_pcb *UDPSock2 = udp_new();
    struct udp_pcb *UDPSock3 = udp_new();

    udp_recv(UDPSock1, UDPIntHandler, NULL);
    udp_bind(UDPSock1, IP_ADDR_BROADCAST, 7070);

    udp_recv(UDPSock2, UDPIntHandler, NULL);
    udp_bind(UDPSock2, IP_ADDR_ANY, 7071);

    udp_recv(UDPSock3, UDPIntHandler, NULL);
    udp_bind(UDPSock3, IP_ADDR_ANY, 7072);

    //
    // Loop forever.  All the work is done in interrupt handlers.
    //

     struct pbuf* pbuf1= pbuf_alloc(PBUF_POOL, 1500, PBUF_ROM);
     pbuf1->payload = (void*)buf;
     pbuf1->tot_len = 1400; //data length
     pbuf1->len = 1400;
     ROM_SysTickIntEnable();

     static bool flag=false;
     uint32_t port_temp=0;

    while(1)
    {
//        udp_sendto(UDPSock1,pbuf1,(u32_t)0xffffffff,7070);
        udp_send(UDPSock1,pbuf1);
        udp_send(UDPSock2,pbuf1);
        udp_send(UDPSock3,pbuf1);

        //pbuf_free(pbuf1);
        SysCtlDelay(40000000);
            }
}

Укажите, что не так?

 

Edited by somebody111

Share this post


Link to post
Share on other sites
31 minutes ago, somebody111 said:

Укажите, что не так?

err_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p,
                                 ip_addr_t *dst_ip, u16_t dst_port);

А вы ему u32 скармливаете. Сделайте так:

udp_sendto(UDPSock1,pbuf1,IP_ADDRESS_BROADCAST,7070);

 

Share this post


Link to post
Share on other sites

Спасибо. Подскажите тогда еще. Вот строчки из примера:

     struct pbuf* pbuf1= pbuf_alloc(PBUF_TRANSPORT, 1500, PBUF_ROM);
     pbuf1->payload = (void*)buf;
     pbuf1->tot_len = 1400; //data length
     pbuf1->len = 1400;

Чем отличается tot_len от len

И что означает 1500?

Вообщем, можете прокомментировать смысл последних двух строчек?

Edited by somebody111

Share this post


Link to post
Share on other sites
16 часов назад, somebody111 сказал:

Вообщем, можете прокомментировать смысл последних двух строчек?

Один пакет может храниться частями в цепочке из нескольких pbuf.

pbuf1->len это размер части, которая храниться в этом pbuf, а

pbuf1->tot_len это размер всего пакета.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this