Перейти к содержанию
    

Пытаюсь поднять 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, даже в других местах, везде где она вызывается.

Проект пустой, к плате ничего не присоединено.

Может кто сталкивался или знает в чем причина?

Изменено пользователем ilyaprok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может вы udp с tcp попутали ?

Да до самого протокола я не дошел, надо ж отчего то отталкиваться - взял пример готовый echoserver. То что там TCP - это сейчас не важно. Тут что то на низком уровне не стартует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

очевидно, вы сбрасываете phy не той полярностью

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

Вот скрин портов в Вивадо:

o_QzDp6mSM2aHtHd0XwZpg.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За код из первого сообщения в хороших домах убивают. Но сейчас не об этом.

 

Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно.

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

 

UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За код из первого сообщения в хороших домах убивают. Но сейчас не об этом.

Почему? Этот код не мой - это код из BSP драйвера.

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

Ок, возьму на заметку, спасибо. Но вот циатата из даташита KSZ9031RN "RGMII with 3.3V/2.2V/1.8V tolerant I/O pins"

UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой.

Да Марвел не причем, суть не в том как функция называется, а в том, что в принципе функция низкого уровня XEmacPs_PhyRead не работает. Более того у меня на плате не AR8035, а KSZ9031RN. Нашел код для него:

вот

не работает.

делал как в этом видео, несмотря на то, что там AR8035, в вивадо он ничего не менял:

вот

А так спасибо все равно

Изменено пользователем ilyaprok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где узнать какой полярностью идет сброс, и где конфигурация этого?

хороший вопрос, именно на него вам и нужно для начала ответить

плюс mdc, mdio как минимум

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите: 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();
        }
}

 

Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хороший вопрос, именно на него вам и нужно для начала ответить

плюс mdc, mdio как минимум

Да правильное направление. Действительно с RESET было не порядок. Спасибо :)

В Vivado подключил порт RESET_PHY, подтянул к PULLUP. Низкий уровень заработал.

Буду дальше пытать.

 

Посмотрите: https://forums.xilinx.com/t5/Embedded-Devel...ues/td-p/696975

На моей памяти (подробности не вспомню) были проблемы с автосогласованием скорости на некоторых МАС. Решалось установкой фиксированной скорости.

Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!

Вам большое спасибо, что всегда помогаете)) Да попробую поиграться с инициализацией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго дня! Уважаемые Форумчане!

Я пытаюсь отправить по udp слово, но при использовании функции udp_send() все время отправляются ARP-запросы.

Подскажите, пожалуйста, как от этого избавиться. Благодарю за внимание.

P.S. Не ругайте, я новичок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 AntLip:

От этого не надо избавлятся - чтобы отправить UDP пакет, стеку нужно знать не только UDP port + IPv4 но ещё и MAC-addr. Видимо для вашего IPv4 нет MAC-addr записи в таблице, вот стек и ищет через ARP у кого есть такой IPv4 чтобы этот товарищ ему сказал какой у него MAC-addr.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Kuzmi4:

Дело в том, что плата постоянно запрашивает MAC, компьютер отвечает.А данные не идут.

Вот так это выглядит в Wireshark:

111.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Когда-то пытался выяснить какую примерно скорость передачи можно получить:

lwip.c.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...