Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UDP на ZYNQ
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
ilyaprok
Пытаюсь поднять echoserver данный из примеров.
Зависает на моменте:.
Цитата
-----lwIP TCP echo server ------
TCP packets sent to port 6001 will be echoed back
Start PHY autonegotiation

Кабель присоединен. Более того - пока проц не работает - мигают светодиоды на коннекторе ethernet. Как только стартует проц - огоньки пропадают. Не знаю является ли это каким то признаком неисправности.
В дебаге выяснил что виснет в функции get_Marvell_phy_speed, а именно зацикливается на моменте:
Код
    while (1) {
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        if (control & IEEE_CTRL_RESET_MASK)
            continue;
        else
            break;
    }

Более того, выяснил, что функция XEmacPs_PhyRead всегда возвращает 0xFFFF, даже в других местах, везде где она вызывается.
Проект пустой, к плате ничего не присоединено.
Может кто сталкивался или знает в чем причина?
Огурцов
может вы udp с tcp попутали ?
ilyaprok
Цитата(Огурцов @ Nov 22 2017, 00:05) *
может вы udp с tcp попутали ?

Да до самого протокола я не дошел, надо ж отчего то отталкиваться - взял пример готовый echoserver. То что там TCP - это сейчас не важно. Тут что то на низком уровне не стартует.
Огурцов
очевидно, вы сбрасываете phy не той полярностью
ilyaprok
Цитата(Огурцов @ Nov 22 2017, 00:43) *
очевидно, вы сбрасываете phy не той полярностью

Расскажите поподробнее пожалуйста. Где узнать какой полярностью идет сброс, и где конфигурация этого? Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно.
Вот скрин портов в Вивадо:
gosha-z
За код из первого сообщения в хороших домах убивают. Но сейчас не об этом.

Цитата(ilyaprok @ Nov 21 2017, 22:59) *
Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно.

А я вот не уверен за IO Type LVCMOS1.8.

UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой.
ilyaprok
Цитата(gosha-z @ Nov 22 2017, 01:33) *
За код из первого сообщения в хороших домах убивают. Но сейчас не об этом.

Почему? Этот код не мой - это код из BSP драйвера.
Цитата(gosha-z @ Nov 22 2017, 01:33) *
А я вот не уверен за IO Type LVCMOS1.8.

Ок, возьму на заметку, спасибо. Но вот циатата из даташита KSZ9031RN "RGMII with 3.3V/2.2V/1.8V tolerant I/O pins"
Цитата(gosha-z @ Nov 22 2017, 01:33) *
UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой.

Да Марвел не причем, суть не в том как функция называется, а в том, что в принципе функция низкого уровня XEmacPs_PhyRead не работает. Более того у меня на плате не AR8035, а KSZ9031RN. Нашел код для него:
вот
не работает.
делал как в этом видео, несмотря на то, что там AR8035, в вивадо он ничего не менял:
вот
А так спасибо все равно
Огурцов
Цитата(ilyaprok @ Nov 21 2017, 19:59) *
Где узнать какой полярностью идет сброс, и где конфигурация этого?

хороший вопрос, именно на него вам и нужно для начала ответить
плюс mdc, mdio как минимум
svedach
Посмотрите: https://forums.xilinx.com/t5/Embedded-Devel...ues/td-p/696975
На моей памяти (подробности не вспомню) были проблемы с автосогласованием скорости на некоторых МАС. Решалось установкой фиксированной скорости.
Вот мой код инициализиции модуля Eth0:
Код
int        EthTransceiver_Init(XScuGic* INTRCtrl)
{
    //============Конфигурируем системный таймер для обновления флагов TCP (требуется lwIP)=========
    u32                    Status            = XST_SUCCESS;
    XScuTimer_Config*    ConfigPtr;
    u32                    TimerLoadValue    = 0;

    LogFileCtrl_PrintF("=======Init Ethernet controller module.=======\n");

    ConfigPtr    = XScuTimer_LookupConfig(XPAR_SCUTIMER_DEVICE_ID);
    Status        = XScuTimer_CfgInitialize(&TimerInstance, ConfigPtr, ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS) {
        LogFileCtrl_PrintF("FAILED init Scutimer, status: %u32 .\n", Status);
        return XST_FAILURE;
    }

    Status        = XScuTimer_SelfTest(&TimerInstance);
    if (Status != XST_SUCCESS) {
        LogFileCtrl_PrintF("FAILED Scutimer selftest, status: %u32 .\n", Status);
        return XST_FAILURE;
    }
    XScuTimer_EnableAutoReload(&TimerInstance);
    /*
     * Set for 250 milli seconds timeout.
     */
    TimerLoadValue = XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 8;
    XScuTimer_LoadTimer(&TimerInstance, TimerLoadValue);
    //================================================================================
==============

    //============Конфигурируем прерывания от таймера===============================================
    XScuGic_Connect(INTRCtrl, XPAR_SCUTIMER_INTR, (Xil_InterruptHandler)EthTimer_Handler, (void *)&TimerInstance);
    XScuGic_Enable(INTRCtrl, XPAR_SCUTIMER_INTR);
    //================================================================================
==============

    //===========Инициализируем IP - адреса библиотеку Ethernet=====================================
    LogFileCtrl_PrintF("Init lwIP.\n");
    struct ip_addr        MyIP, MyNetMask, MyGW;
    IP4_ADDR(&MyIP,            Network_Config.IP[0],
                            Network_Config.IP[1],
                            Network_Config.IP[2],
                            Network_Config.IP[3]);
    IP4_ADDR(&MyNetMask,    Network_Config.Mask[0],
                            Network_Config.Mask[1],
                            Network_Config.Mask[2],
                            Network_Config.Mask[3]);
    IP4_ADDR(&MyGW,            Network_Config.Gateway[0],
                            Network_Config.Gateway[1],
                            Network_Config.Gateway[2],
                            Network_Config.Gateway[3]);

    lwip_init();
    if (!xemac_add(&NetItfs, &MyIP, &MyNetMask, &MyGW, (void*)Network_Config.MAC, XPAR_XEMACPS_0_BASEADDR))
    {
        LogFileCtrl_PrintF("FAILED adding network interface.\n");
        return XST_FAILURE;
    }
    netif_set_default(&NetItfs);
    //================================================================================
==============

    //===========Включаем контроллер Ethernet=======================================================
    netif_set_up(&NetItfs);
    //================================================================================
==============

    //===========Разрешаем прерывания===============================================================
    XScuTimer_EnableInterrupt(&TimerInstance);
    XScuTimer_Start(&TimerInstance);
    //================================================================================
==============

    LogFileCtrl_PrintF("Init lwIP result: OK.\n");
    LogFileCtrl_PrintF("=======Init Ethernet controller module result: OK.=======\n\n");
    return 0;
}


Вот код создания UDP PCB:
Код
//Создаем порты передачи данных
    struct    ip_addr        IpAddrPC;
    IP4_ADDR(&IpAddrPC,    Network_Config.Host_IP[0],
                        Network_Config.Host_IP[1],
                        Network_Config.Host_IP[2],
                    Network_Config.Host_IP[3]);
    pcbRcv                = udp_new();
    pcbVideoSnd            = udp_new();
    pcbDataSnd            = udp_new();

    udp_bind(pcbRcv,            IP_ADDR_ANY, Network_Config.ServiceCtrlPort);
    udp_bind(pcbVideoSnd,        IP_ADDR_ANY, Network_Config.Host_Video_Port);
    udp_bind(pcbDataSnd,        IP_ADDR_ANY, Network_Config.Host_Data_Port);
    udp_recv(pcbRcv, UDPRcv, NULL);
    udp_recv(pcbDataSnd, DataRcvHandler, NULL);
    udp_connect(pcbVideoSnd,     &IpAddrPC, Network_Config.Host_Video_Port);
    udp_connect(pcbDataSnd,        &IpAddrPC, Network_Config.Host_Data_Port);


Вот код отправки данных:
Код
while(1)
    {
        EthTransceiver_ProcInput();

        //================================================================================
==================
        //====================Проверяем флаг готовности кадрового буффера===================================
        if ((FrameReady != 0) & (Streams_Config.Video_En != 0))
        {
            for (LineIdx = 0; LineIdx < LinesInFrame; LineIdx = LineIdx + 1)
            {
                memcpy(VideoBuff_Tx->payload, Frame[LineIdx], Streams_Config.Video_PacketSize);
                udp_send(pcbVideoSnd, VideoBuff_Tx);
            }
            //Данные из буффера 1 отправлены, снимаем флаг готовности
            FrameReady        = 0;
            //Запускаем первый трансфер
            SensorDriver_ReceiveFrame();
        }
}


Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!
ilyaprok
Цитата(Огурцов @ Nov 22 2017, 02:53) *
хороший вопрос, именно на него вам и нужно для начала ответить
плюс mdc, mdio как минимум

Да правильное направление. Действительно с RESET было не порядок. Спасибо sm.gif
В Vivado подключил порт RESET_PHY, подтянул к PULLUP. Низкий уровень заработал.
Буду дальше пытать.

Цитата(svedach @ Nov 22 2017, 11:06) *
Посмотрите: https://forums.xilinx.com/t5/Embedded-Devel...ues/td-p/696975
На моей памяти (подробности не вспомню) были проблемы с автосогласованием скорости на некоторых МАС. Решалось установкой фиксированной скорости.
Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!

Вам большое спасибо, что всегда помогаете)) Да попробую поиграться с инициализацией.
AntLip
Доброго дня! Уважаемые Форумчане!
Я пытаюсь отправить по udp слово, но при использовании функции udp_send() все время отправляются ARP-запросы.
Подскажите, пожалуйста, как от этого избавиться. Благодарю за внимание.
P.S. Не ругайте, я новичок.
Kuzmi4
2 AntLip:
От этого не надо избавлятся - чтобы отправить UDP пакет, стеку нужно знать не только UDP port + IPv4 но ещё и MAC-addr. Видимо для вашего IPv4 нет MAC-addr записи в таблице, вот стек и ищет через ARP у кого есть такой IPv4 чтобы этот товарищ ему сказал какой у него MAC-addr.
AntLip
Kuzmi4:
Дело в том, что плата постоянно запрашивает MAC, компьютер отвечает.А данные не идут.
Вот так это выглядит в Wireshark:

doom13
Вероятно, проблема с приёмником, заходит ли в обработчик приёма сообщения. Бродкасты на плату побросайте, примет ли их плата.

Ну и это если правильно выполнена инициализация LwIP.

Когда-то пытался выяснить какую примерно скорость передачи можно получить:
AntLip
doom13: Спасибо за советы, сейчас буду пробовать.
Kuzmi4
2 AntLip
судя по логу - скорей всего у вас проблема с приёмом пакетов , что вам уже и написал doom13..
+ включите полное логирование того что происходит в стеке, тогда добавится информативности того что именно там внутри происходит.
AntLip
Бродкасты на плату я отправляю, но она не отвечает. Получается что плата не обрабатывает входящие пакеты, вот только как от это решить?
Спасибо за ответы.
Kuzmi4
Цитата(AntLip @ Jan 12 2018, 16:20) *
..как от это решить?

Посмотрите внимательно вот эту тему:
send UDP packets with LwIP
И этот документ с его "Reference Design Files":
XAPP1026

Ну и конечно же "вику":
http://www.wiki.xilinx.com/Standalone+LWIP+library
AntLip
Спасибо за помощь!
Информация пошла, правда нюансы остались))
(к конкретному IP не могу привязать, пакеты идут только при udp_connect(udppcb, IP_ADDR_ANY, tx_port).
Если вместо IP_ADDR_ANY поставить &PCaddr, то картина будет прежней).
Видимо еще какую-то ошибку не могу увидеть.
Kuzmi4
2 AntLip
Если использовать поиск по форуму, то можно найти например вот это:
Как правильно использовать LwIP UDP?
AntLip
Спасибо всем за помощь! Заработало!)
Kuzmi4
2 AntLip
так вы просветите общественность что именно надо было делать в вашем случае / чтобы потом если у народа будут похожие симптомы - народ смог бы решить проблему /
AntLip
Так в том и дело, что стыдно признаться.
Сидел, ничего не работало. Потом пересмотрел примеры, вставил оттуда куски кода из примеров и заработало.
Что бы толком что-то объяснить или рассказать - нечего.
Еще раз спасибо за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.