Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32F4 и ethernet
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Fobes
Всем доброго времени суток. Уже совсем измучился... есть stm32F4 discovery и DP83848, подключил. Зашел в stm32 cube, настроил ethernet на RMII, подцепил LwIp. Залил код, запустил, DHCP запустилось, в подключения роутера появилось новое устройство с маком, который в cube задавался... Но теперь главная проблема. Вроде бы банальная задача, найти место где начинается обработка принятого кадра, в итоге я запутался... нашел функции low_level_output и low_level_input, но отладчик в них никогда не попадает, нашел буферы DMA Tx_Buff и Rx_Buff, вывел их в watch(keil), а они вроде как статичны, как-будто дма ждет что я следующую передачу разрешу.
Главная задача, научиться принимать и отправлять свои пакеты(в LwIp таковых нет) как это сделать ? куда копать ? По сути ведь можно обойтись стандартным драйвером, без LwIp, ведь мне не нужны TCP/IP, UDP и т.д. примеров никаких не нашел, только то что было до HAL sad.gif
И еще вопрос. В stm32F4 есть аппаратная поддержка PTP, но в HAL драйвере я нашел лишь то что она не поддерживается. Реализацию самому писать чтоли придется ? Но все сводится опять же к приему и отправке своих пакетов sad.gif
Направьте на верный путь, что почитать ? как настроить нужно, что использовать ? или примеры может какие >_<
alag57
Цитата(Fobes @ Jan 20 2016, 00:51) *
ведь мне не нужны TCP/IP, UDP и т.д.

А кто принимать будет ваши пакеты? А роутер пропустит ваши не ТСР и не UDP пакеты?
А вообще описание работы с lwip есть в папке Lwip/doc. Также примеры есть в пакете Lwip-contrib.
pitt
Решаю ту же задачу, но написал свой HAL, никаких кубов и кривых библиотек - вся кривизна собственная см. тут и известно что, где и кого винить.
Роутеру все до лампочки, пропускает 802.3 без проблем. Отлаживать и принимать можно с помощью wireshark и packEth.
Fobes
Цитата(pitt @ Jan 20 2016, 14:18) *
Решаю ту же задачу, но написал свой HAL, никаких кубов и кривых библиотек - вся кривизна собственная см. тут и известно что, где и кого винить.
Роутеру все до лампочки, пропускает 802.3 без проблем. Отлаживать и принимать можно с помощью wireshark и packEth.


с вами можно как-то связаться, переговорить в реал тайме ? Все никак не решается проблема...
pitt
Цитата(Fobes @ Jan 20 2016, 13:49) *
с вами можно как-то связаться, переговорить в реал тайме ? Все никак не решается проблема...

Дык и у меня тоже. Сегодня гонял тестовую программу: принимаю фрейм и тут же переправляю назад. Никакого переключения контекста, ничего не делаю. Через несколько секунд TxDMA умирает как я и описал. Несколько сотем фреймов пропутешествовало как и требовалось. Просто отсылаю фрейм: подыхает wireshark на PC с линухом...
Т.е. Отдельно и прием и передача работают, а вот вместе... Пахнет проблемами в силиконе.

alag57
Цитата(Fobes @ Jan 20 2016, 00:51) *
нашел функции low_level_output и low_level_input
Направьте на верный путь

Функция low_level_output является конечной точкой, где заканчивает работать
Lwip и начинает драйвер. Функция low_level_input наоборот, конечная точка
работы драйвера и начала работы Lwip.
Возьмите любой пример с Lwip, т.е с ТСР или UDP. Запустите и в отладке зайдете
в эти функции.
Fobes
Цитата(alag57 @ Jan 21 2016, 05:36) *
Функция low_level_output является конечной точкой, где заканчивает работать
Lwip и начинает драйвер. Функция low_level_input наоборот, конечная точка
работы драйвера и начала работы Lwip.
Возьмите любой пример с Lwip, т.е с ТСР или UDP. Запустите и в отладке зайдете
в эти функции.


Уже так и сделал, но все равно спасибо что откликнулись))) Собственно с отправкой разобрался и приемом. Теперь другой вопрос.

CODE

struct ethernet_header
{
uint64_t dstAdr:48;
uint64_t srcAdr:48;
uint16_t type;
} __attribute__((packed));

struct ethernet_header eth_hdr;

eth_hdr.dstAdr = 0x010CCD040001;
eth_hdr.srcAdr = 0x0001010000FF;
eth_hdr.type = 0x8100;



Собственно при отправке все поля структуры выворачиваются. нашел lwip_htons

Код
eth_hdr.type     =    lwip_htons (0x8100);


При таком раскладе поле type просто не отправляется.

Код
eth_hdr.type     =    lwip_htons (0x8101);


Но если убрать нулевой байт, то поле выворачивается и отправляется. Это такая оптимизация ? Не подскажете как бороться ? Извиняюсь сразу за возможно глупые вопросы, только начал разбираться с контроллерами)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.