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

stm32F4 и ethernet

Всем доброго времени суток. Уже совсем измучился... есть 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 :(

И еще вопрос. В stm32F4 есть аппаратная поддержка PTP, но в HAL драйвере я нашел лишь то что она не поддерживается. Реализацию самому писать чтоли придется ? Но все сводится опять же к приему и отправке своих пакетов :(

Направьте на верный путь, что почитать ? как настроить нужно, что использовать ? или примеры может какие >_<

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


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

ведь мне не нужны TCP/IP, UDP и т.д.

А кто принимать будет ваши пакеты? А роутер пропустит ваши не ТСР и не UDP пакеты?

А вообще описание работы с lwip есть в папке Lwip/doc. Также примеры есть в пакете Lwip-contrib.

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


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

Решаю ту же задачу, но написал свой HAL, никаких кубов и кривых библиотек - вся кривизна собственная см. тут и известно что, где и кого винить.

Роутеру все до лампочки, пропускает 802.3 без проблем. Отлаживать и принимать можно с помощью wireshark и packEth.

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

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


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

Решаю ту же задачу, но написал свой HAL, никаких кубов и кривых библиотек - вся кривизна собственная см. тут и известно что, где и кого винить.

Роутеру все до лампочки, пропускает 802.3 без проблем. Отлаживать и принимать можно с помощью wireshark и packEth.

 

с вами можно как-то связаться, переговорить в реал тайме ? Все никак не решается проблема...

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


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

с вами можно как-то связаться, переговорить в реал тайме ? Все никак не решается проблема...

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

Т.е. Отдельно и прием и передача работают, а вот вместе... Пахнет проблемами в силиконе.

 

 

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


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

нашел функции low_level_output и low_level_input

Направьте на верный путь

Функция low_level_output является конечной точкой, где заканчивает работать

Lwip и начинает драйвер. Функция low_level_input наоборот, конечная точка

работы драйвера и начала работы Lwip.

Возьмите любой пример с Lwip, т.е с ТСР или UDP. Запустите и в отладке зайдете

в эти функции.

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


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

Функция low_level_output является конечной точкой, где заканчивает работать

Lwip и начинает драйвер. Функция low_level_input наоборот, конечная точка

работы драйвера и начала работы Lwip.

Возьмите любой пример с Lwip, т.е с ТСР или UDP. Запустите и в отладке зайдете

в эти функции.

 

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

 

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);

 

Но если убрать нулевой байт, то поле выворачивается и отправляется. Это такая оптимизация ? Не подскажете как бороться ? Извиняюсь сразу за возможно глупые вопросы, только начал разбираться с контроллерами)

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

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

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

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

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

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

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

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

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

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