STM Урок 68. LAN. ENC28J60. Часть 10



 

Урок 68

 

Часть 10

 

LAN. ENC28J60

 

В предыдущей части нашего урока мы изучили протокол ICMP и написали код для приёма пакетов данного уровня.

 

Вызовем данную функцию  отправки IP-пакета в функции icmp_read

 

  icmp_pkt->cs=checksum((void*)icmp_pkt,len);

  ip_send(frame,len+sizeof(ip_pkt_ptr));

}

 

 

Вернёмся теперь в функцию ip_send и установим указатель на пакет IP

 

uint8_t res=0;

ip_pkt_ptr *ip_pkt = (void*)frame->data;

 

Заполним заголовок IP

 

ip_pkt_ptr *ip_pkt = (void*)frame->data;

//Заполним заголовок пакета IP

ip_pkt->len=be16toword(len);

ip_pkt->fl_frg_of=0;

ip_pkt->ttl=128;

ip_pkt->cs = 0;

memcpy(ip_pkt->ipaddr_dst,ip_pkt->ipaddr_src,4);

memcpy(ip_pkt->ipaddr_src,ipaddr,4);

ip_pkt->cs = checksum((void*)ip_pkt,sizeof(ip_pkt_ptr));

 

 

И отправим фрейм

 

ip_pkt->cs = checksum((void*)ip_pkt,sizeof(ip_pkt_ptr));

//отправим фрейм

eth_send(frame,len);

return res;

 

Соберём код. Прошьём контроллер. Посмотрим результат

 

image41

 

Всё работает!

Остальные протоколы мы поизучаем когда-нибудь позже, а то уже и так наше изучение затянулось. Возможно, будет UDP, TCP, DHCP.

А пока всем творческих успехов. Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Техническая документация:

Документация на микросхему ENC28J60

Перечень ошибок ENC28J60 (Errata)

 

 

Отладочную плату можно приобрести здесь STM32F103C8T6

Ethernet LAN Сетевой Модуль можно купить здесь ENC28J60 Ethernet LAN

Переходник USB to TTL можно приобрести здесь USB to TTL ftdi ft232rl

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LAN. ENC28J60

 

11 комментариев на “STM Урок 68. LAN. ENC28J60. Часть 10
  1. Слава:

    Здравствуйте! Переделывал этот проект под stm32f3 discovery, но не удачно — горит светодиод ошбки. Как-то неправильно конфигурируется SPI1.Могли бы вы помочь разобраться?

    • Здравствуйте!
      Да я вроде уже помог, записав и выложив данную серию уроков.

      А зачем переделывать?

      Лучше начните заново и создайте проект и напишите его. Причём быстрее даже получится.

      • Слава:

        Я переделал проект под stm32f303VCT — настроил переферию через CubeMX.

        Проект запустился , ловились пакеты в WIreShark от enc28j60 ,работала утилита ping, arp- запросы.Проект с udp-протоколом не заработал. Откат к 68 уроку не помог. 

        Постоянно загорается светодиод ошибки. Мак адрес устройства не виден компьютеру. То есть начальная инициализация модуля enc28j60 не проходит.

        Аналогичный проект на AVR отлично работает, это работа протоколов ip и udp.

         

  2. Vi Thanh:

    Спасибо большой. Всё работает,я работал STM32F4

  3. Ilya:

    Подлключил ENC28J60 к Bluepill согласно описанию. Подключил так же USB-UART. В описании не понятно что такое FDI — STM32F103RCT6 . Я так понял — это питание, потому что у меня USB-UART конвертере есть 5V, 3.3V, RXD, TXD, GND. Скачал исходник. В нём не хватает ряда библиотек. Добросил в проект. Ругнулся на одну их констант, которая почему-то не определена. Я её ввёл жёстко, как в определении. Потом началось, что «ENC28J60\ENC28J60.axf: Error: L6200E: Symbol HAL_SPI_Init multiply defined (by stm32f1xx_hal_spi.o and stm32f1xx_hal_spi_ex.o).» То есть функция HAL_SPI_Init одинаково определена как в модуле stm32f1xx_hal_spi.c так и в модуле stm32f1xx_hal_spi_ex.c. В модуле stm32f1xx_hal_spi_ex.c переменовал эту функцию. Компилится. Прошил прямо через встроенный загрузчик как раз через подключенный USB-UART. При попыткие пинговать 192.168.1.197 4-ре раза выдаёт «Превышен интервал ожидания запроса». В терминале разумеется ничего нет. В ПК три сетевых платы. Одна смотрит в инет, другая свободная с динамисекой раздачей адресов, третья со статическим IP. Ни где не работает. Кто-то может прислать полностью рабочий проект?

  4. Ilya:

    Да, забыл добавить, что визуально моя плата ENC28J60 немного отличается от той, что в указанном примере. Моя поуже немного. Нет по краям отверсий, но я думаю, что это не принципиально и управляется она так же. Но, что-то не работает. Хотелось бы получить тестовый проект под keil, где будут все необходимые файлы, а так же рекомендация настройки сети на ПК. Ну и разъяснение, что означает на USB-UART соединение «FDI — STM32F103RCT6». Я этого так и не понял. Н о по этому USB-UART контроллер вполне прошивается, значит подключен он верно. И всё питание идёт от него же. То есть сначала от него питается плата Bluepill, потом уже от Bluepill по 3.3 вольт питается ENC28J60. При включении на ней загорается красный светодиод. И так же диод на Bluepill, если вставить код его зажигания. Собрано всё правильно, но не работает. Не отправляются ни пакеты, ни в терминале так же нет ничего.

  5. Ilya:

    Возможно кабель Ethernet нужен специфический. Например сross кабель.

  6. Ilya:

    Проверил осциллографом SPI,- он работает. То есть проблема или в том, что не так настроил сеть на ПК или что-то с прошивкой. Она, как есть, не компилировалась и в итоге одноимённую функцию инициализации SPI пришлось переименовать и одну из констант вбить в явном виде. Кто-то тут может дать дельный совет? Хотелось бы идеально услышать так же автора.

  7. Ilya:

    Да, и по проекту кристалл работает на 40 мгц, а не на 72, как он может. Видимо, это сделано специально.

  8. Ilya:

    Ни кто так и не ответил.

    • Андрей:

      Скорее всего у вас ip адрес не совпадает. То есть вы пингуете 192.168.1.197, а сеть у вас из адресов 192.168.0….
      Для вас мой ответ неактуален скорее всего, а кому-нибудь вдруг и поможет.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*