ilyaprok 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 (изменено) · Жалоба Пытаюсь поднять 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, даже в других местах, везде где она вызывается. Проект пустой, к плате ничего не присоединено. Может кто сталкивался или знает в чем причина? Изменено 21 ноября, 2017 пользователем ilyaprok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба может вы udp с tcp попутали ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilyaprok 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба может вы udp с tcp попутали ? Да до самого протокола я не дошел, надо ж отчего то отталкиваться - взял пример готовый echoserver. То что там TCP - это сейчас не важно. Тут что то на низком уровне не стартует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба очевидно, вы сбрасываете phy не той полярностью Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilyaprok 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба очевидно, вы сбрасываете phy не той полярностью Расскажите поподробнее пожалуйста. Где узнать какой полярностью идет сброс, и где конфигурация этого? Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно. Вот скрин портов в Вивадо: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба За код из первого сообщения в хороших домах убивают. Но сейчас не об этом. Это же стандартный пример, я ничего не менял. По логике - загвоздка где то в Vivado. Но это не точно. А я вот не уверен за IO Type LVCMOS1.8. UPD: А причем тут Марвел, если там AR8035? Читать, например, сюда. Ну и плюс остальные нюансы работы с этой физикой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilyaprok 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 (изменено) · Жалоба За код из первого сообщения в хороших домах убивают. Но сейчас не об этом. Почему? Этот код не мой - это код из 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, в вивадо он ничего не менял: вот А так спасибо все равно Изменено 21 ноября, 2017 пользователем ilyaprok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 21 ноября, 2017 Опубликовано 21 ноября, 2017 · Жалоба Где узнать какой полярностью идет сброс, и где конфигурация этого? хороший вопрос, именно на него вам и нужно для начала ответить плюс mdc, mdio как минимум Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svedach 0 22 ноября, 2017 Опубликовано 22 ноября, 2017 · Жалоба Посмотрите: 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 0 22 ноября, 2017 Опубликовано 22 ноября, 2017 · Жалоба хороший вопрос, именно на него вам и нужно для начала ответить плюс mdc, mdio как минимум Да правильное направление. Действительно с RESET было не порядок. Спасибо :) В Vivado подключил порт RESET_PHY, подтянул к PULLUP. Низкий уровень заработал. Буду дальше пытать. Посмотрите: https://forums.xilinx.com/t5/Embedded-Devel...ues/td-p/696975 На моей памяти (подробности не вспомню) были проблемы с автосогласованием скорости на некоторых МАС. Решалось установкой фиксированной скорости. Вот только пакеты (мой заголовок+данные) у меня формируются в логике и по ДМА отправляются в ДДР. Т.е. в ДДР лежит не картинка, а набор пакетов - так удается существенно увеличить траффик от Цинка и разгрузить его! Вам большое спасибо, что всегда помогаете)) Да попробую поиграться с инициализацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AntLip 0 10 января, 2018 Опубликовано 10 января, 2018 · Жалоба Доброго дня! Уважаемые Форумчане! Я пытаюсь отправить по udp слово, но при использовании функции udp_send() все время отправляются ARP-запросы. Подскажите, пожалуйста, как от этого избавиться. Благодарю за внимание. P.S. Не ругайте, я новичок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 10 января, 2018 Опубликовано 10 января, 2018 · Жалоба 2 AntLip: От этого не надо избавлятся - чтобы отправить UDP пакет, стеку нужно знать не только UDP port + IPv4 но ещё и MAC-addr. Видимо для вашего IPv4 нет MAC-addr записи в таблице, вот стек и ищет через ARP у кого есть такой IPv4 чтобы этот товарищ ему сказал какой у него MAC-addr. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AntLip 0 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба Kuzmi4: Дело в том, что плата постоянно запрашивает MAC, компьютер отвечает.А данные не идут. Вот так это выглядит в Wireshark: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба Вероятно, проблема с приёмником, заходит ли в обработчик приёма сообщения. Бродкасты на плату побросайте, примет ли их плата. Ну и это если правильно выполнена инициализация LwIP. Когда-то пытался выяснить какую примерно скорость передачи можно получить: lwip.c.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AntLip 0 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба doom13: Спасибо за советы, сейчас буду пробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться