Инструменты пользователя

Инструменты сайта


prog:ethernet:traffic_tx

Пример генерации трафика микроконтроллером по запросу от PC

Блок Ethernet доступен в различных микроконтроллерах Миландр и как правило он везде одинаков. В качестве примера работы с данным блоком реализуем небольшой проект для 1986ВЕ1Т, который с легкостью может быть запущен и на 1986ВЕ3Т при замене микроконтроллера в настройках проекта Keil.

В примере будем посылать в МК два 16-ти разрядных слова:

  1. Длину ответного фрейма, 100 байт.
  2. Количество ответных фреймов, 10 фреймов.

В ответ МК вышлет запрошенное количество фреймов заданного размера. Эти параметры могут быть любыми, текущие значения взяты для определенности.

Целиком рабочий проект доступен на GitHub. Его необходимо скачать и собрать при установленном PACK для Keil.

Проект можно рассматривать как стартовый. То-есть, сначала необходимо добиться работоспособности блока, а затем можно поварьировать параметры, чтобы попробовать разные режимы и настройки блока Ethernet.

Комментарии по проекту

Комментировать особо нечего, как всегда производится инициализация конфигурационной структуры, которая затем применяется в блок Ethernet. Код снабжен комментариями на русском и прост для самостоятельного разбора. Здесь приведу только некоторые комментарии и нюансы, необходимые для сборки проекта.

Ошибки в библиотеке SPL

В директории BugFix прилагаются исправленные библиотечные файлы MDR32F9Qx_eth.c и MDR32F9Qx_eth.h.

  1. В MDR32F9Qx_eth.h добавлена декларация функции ETH_GetFlagStatus(), в реализации которой исправлена ошибка в файле MDR32F9Qx_eth.c.
  2. Добавлен вызов ETH_DMAPrepare() для режима с FIFO в ETH_Init().

Эти файлы используются в проекте вместо библиотечных, пока библиотечные не исправит производитель.

Режим работы буферов

Режим работы буферов задается в функции Ethernet_Init(), необходимо лишь выбрать нужный вариант. Всю прочую обработку берут на себя функции SPL. В текущем варианте выбран режим с FIFO, поскольку этот режим использует DMA и вызывает наибольшие затруднения.

  //	Режим работы буферов
  ETH_InitStruct.ETH_Buffer_Mode = ETH_BUFFER_MODE_FIFO;
  //ETH_InitStruct.ETH_Buffer_Mode = ETH_BUFFER_MODE_LINEAR;  
  //ETH_InitStruct.ETH_Buffer_Mode = ETH_BUFFER_MODE_AUTOMATIC_CHANGE_POINTERS;

Режим FIFO и скаттер-файл

При работе в режиме FIFO используется DMA, поэтому массивы в которых происходит работа с буферами должны находиться в адресах начинающихся с 0х2010_0000. Только к этим адресам ОЗУ имеет доступ DMA.

uint8_t  FrameTx[MAX_ETH_TX_DATA_SIZE] __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (4)));
uint32_t FrameRx[MAX_ETH_RX_DATA_SIZE] __attribute__((section("EXECUTABLE_MEMORY_SECTION"))) __attribute__ ((aligned (4)));

Расположение этих массивов в памяти задается в скаттер файле. Скаттер файл Ethernet_TrafficTX.sct для проекта уже готов и лежит вместе с проектом в папке Objects. Так же, в папке проекта лежит копия файла - Ethernet_TrafficTX.sct_tmp, на тот случай, если файл в Objects будет затерт при сборке с неправильными настройками проекта. Зачем нужен данный файл и как его получить написано ниже.

Создание скаттер-файла с нуля

Массивы помечены атрибутом EXECUTABLE_MEMORY_SECTION, который необходимо указать в скаттер файле для линкера. Напомню, что скаттер файл создается автоматически при сборке проекта. Обычно мы ставим галочку в настройках проекта "Linker" - "Use Memory Layout from Target Dialog", но при этом скаттер файл при каждой сборке обновляется автоматически. Для того, чтобы внести ручные исправления необходимо:

  1. Собрать проект с галочкой - "Linker" - "Use Memory …", чтобы создался Objects\*.sct файл.
  2. Снять галочку и отредактировать секцию RW_IRAM2 в *.sct файле согласно ниже приведенному листингу, например в блокноте.

  RW_IRAM2 0x20100000 0x00004000  {
  *.o (EXECUTABLE_MEMORY_SECTION) 
   .ANY (+RW +ZI)
  }

Дописана строка: *.o (EXECUTABLE_MEMORY_SECTION)

Проверка работоспособности

Для проверки работоспособности примера необходимо прошить МК и подключить его к PC.

Теперь стоит задача послать от РС пакет и отследить какие пакеты приходят в ответ. Необходимо установить программы, которые позволят нам это сделать. Активность на линии удобно смотреть программной WareShark, а для посылки пакетов я выбрал Ostinato. Обе программы можно было поставить бесплатно на момент когда это делал я, летом 2017 года. Но возможно сейчас положение дел изменилось и необходимо найти другие бесплатные инструменты.

Настраиваем WareShark 2.2.6

Программу необходимо запускать с имени администратора, при этом откроется такое окно:

Далее, необходимо двойным кликом выбрать подключение по локальной сети. Откроется окно в котором будут видны все пакеты которые видит РС на линии. Пакетов много и все они от разных источников и постоянно обновляются. Нам необходимо применить фильтр, чтобы видеть только пакеты связанные с нашим микроконтроллером. Для этого вбиваем в поле ввода фильтр на МАС адрес нашего микроконтроллера и жмем Enter. После этого поле с пакетами будет пустое, все лишние пакеты просто не отображаются.

Теперь наш сниффер готов отображать интересующие нас пакеты. Мы увидим их, когда будем посылать запросы в МК и получать обратные.

Настраиваем Ostinato 0.7.1

Описание того, как настроить фрейм для отправки с нуля перенесено в статью - Настройка программы Ostinato для посылки пакетов. Это сделано для того, чтобы не перегружать информацией описание данного примера. Там же описано, как узнать МАС адрес текущего компьютера, что потребуется ниже в данной статье.

Для запуска Ostinato так-же нужны администраторские права. При запуске программы видим окно, в котором содержится порт с нашим сетевым адаптером.

Выбираем порт и затем в меню File выбираем Open Streams. В диалоге необходимо выбрать прилагающийся к проекту файл Ostinato/Sent_10_By100.txt. При этом создается стрим с фреймом, настроенным для нашего примера. Все настройки в нем уже готовы, но необходимо изменить МАС адрес РС на котором происходит запуск теста. Сейчас в настройках остался мой адрес.

Кликаем правой клавишей мыши на появившемся стриме и выбираем Edit Stream.

В открывшемся окне выбираем закладку Protocol Data и меняем значение Source (2) на текущий МАС адрес компьютера. Для этого можно вызвать команду ipconfig -all, в командном окне Windows, запускаемом командой cmd в окне поиска в разделе Пуск. Мас адрес микроконтроллера (1) прописан в коде проекта и соответствует указанному в данной форме, поэтому его менять не нужно.

При выборе пункта Hex Dump (3), откроется поле, где мы видно, что мы передаем в МК два 16-ти разрядных значения в формате hex.

  • 0064 - длина ответного фрейма 100 байт
  • 000A - количество ответных фреймов 10 штук.

Значения в данной форме вводятся несколько неудобно. При редактировании бывает проще стереть все значения и ввести необходимые данные заново. Можно менять эти параметры, для генерации небходимого трафика со стороны МК.

Нажимаем ОК и выходим из настроек нашего стрима. Для того чтобы применить настройки теперь следует нажать кнопку Apply (2) убедившись, что наш стрим активен (1). Позднее, для посылки фрейма нам понадобится выбрать столбец в окне ниже, кликнув на него (3). Для посылки фрейма необходимо будет нажать кнопку Start (4).

Проверяем обмен

Итак, микроконтроллер 1986ВЕ1Т с прошитой программой подключаем кабелем к РС. При этом происходит Auto-negotiation - автонастройка скорости и дуплекса обмена. Установившуюся скорость подключения можно посмотреть в свойствах сетевого адаптера. Штатных средств узнать какой выбран дуплекс в Windows нет, необходимо использовать утилиты от производителя сетевых карт.

Программы Wareshark и Ostinato у нас запущены и настроены, осталось послать пакет. Нажимаем кнопку старт в Ostinato и смотрим в окно Wareshark. Если все настроено правильно, оно должно выглядеть так:

На картинке видно, что РС послал один пакет в МК. В ответ МК выслал 10 пакетов с размером по 100 байт. Первым 16-битным словом возвращается индекс пакета. На картинке выбран 4-й ответный фрейм и виден его индекс, равный 3. Остальные данные в Payload заполнены индексными значениями.

Пояснение: Заполнение индексами шло с первой ячейки, но в программе мы добавили вывод индекса текущего фрейма. Индекс фрейма записывается после заполнения Payload индексами, поэтому значения индекса 0 и 1 в первых двух байтах переписались значением индекса фрейма.

В директории проекта Ostinato, вместе с файлом настроек стрима, сохранен лог-файл данного теста (запущенного дважды) - WareLog_10_By100.pcapng. Его можно открыть в Wareshark в оффлайн режиме и изучить содержимое пакетов.

prog/ethernet/traffic_tx.txt · Последние изменения: 2018/09/24 15:41 — katya