реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> UDP на ZYNQ, MYIR Z-Turn
ilyaprok
сообщение Nov 21 2017, 18:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Пытаюсь поднять 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 - Nov 21 2017, 18:54
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 21 2017, 19:05
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



может вы udp с tcp попутали ?
Go to the top of the page
 
+Quote Post
ilyaprok
сообщение Nov 21 2017, 19:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Цитата(Огурцов @ Nov 22 2017, 00:05) *
может вы udp с tcp попутали ?

Да до самого протокола я не дошел, надо ж отчего то отталкиваться - взял пример готовый echoserver. То что там TCP - это сейчас не важно. Тут что то на низком уровне не стартует.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 21 2017, 19:43
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



очевидно, вы сбрасываете phy не той полярностью
Go to the top of the page
 
+Quote Post
ilyaprok
сообщение Nov 21 2017, 19:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Цитата(Огурцов @ Nov 22 2017, 00:43) *
очевидно, вы сбрасываете phy не той полярностью

Расскажите поподробнее пожалуйста. Где узнать какой полярностью идет сброс, и где конфигурация этого? Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно.
Вот скрин портов в Вивадо:
Go to the top of the page
 
+Quote Post
gosha-z
сообщение Nov 21 2017, 20:33
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288



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

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

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

UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой.
Go to the top of the page
 
+Quote Post
ilyaprok
сообщение Nov 21 2017, 20:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Цитата(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, 21:01
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 21 2017, 21:53
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(ilyaprok @ Nov 21 2017, 19:59) *
Где узнать какой полярностью идет сброс, и где конфигурация этого?

хороший вопрос, именно на него вам и нужно для начала ответить
плюс mdc, mdio как минимум
Go to the top of the page
 
+Quote Post
svedach
сообщение Nov 22 2017, 06:06
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 8-01-12
Из: Беларусь
Пользователь №: 69 226



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


Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!
Go to the top of the page
 
+Quote Post
ilyaprok
сообщение Nov 22 2017, 12:20
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 29-10-17
Пользователь №: 99 964



Цитата(Огурцов @ 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
На моей памяти (подробности не вспомню) были проблемы с автосогласованием скорости на некоторых МАС. Решалось установкой фиксированной скорости.
Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его!

Вам большое спасибо, что всегда помогаете)) Да попробую поиграться с инициализацией.
Go to the top of the page
 
+Quote Post
AntLip
сообщение Jan 10 2018, 08:49
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 26-10-17
Из: Беларусь
Пользователь №: 99 927



Доброго дня! Уважаемые Форумчане!
Я пытаюсь отправить по udp слово, но при использовании функции udp_send() все время отправляются ARP-запросы.
Подскажите, пожалуйста, как от этого избавиться. Благодарю за внимание.
P.S. Не ругайте, я новичок.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jan 10 2018, 09:31
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 AntLip:
От этого не надо избавлятся - чтобы отправить UDP пакет, стеку нужно знать не только UDP port + IPv4 но ещё и MAC-addr. Видимо для вашего IPv4 нет MAC-addr записи в таблице, вот стек и ищет через ARP у кого есть такой IPv4 чтобы этот товарищ ему сказал какой у него MAC-addr.
Go to the top of the page
 
+Quote Post
AntLip
сообщение Jan 11 2018, 11:47
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 26-10-17
Из: Беларусь
Пользователь №: 99 927



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

Go to the top of the page
 
+Quote Post
doom13
сообщение Jan 11 2018, 12:31
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



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

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

Когда-то пытался выяснить какую примерно скорость передачи можно получить:
Прикрепленные файлы
Прикрепленный файл  lwip.c.txt ( 5.32 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
AntLip
сообщение Jan 11 2018, 12:51
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 26-10-17
Из: Беларусь
Пользователь №: 99 927



doom13: Спасибо за советы, сейчас буду пробовать.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 00:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016