Передаем Ethernet-пакет

Подключение платы Марсоход к сети Ethernetf

Подключение к локальной сети может понадобится для различных задач.
В этой статье хочу рассмотреть самую простую операцию - передачу пакета Ethernet UDP платой Марсоход.

Для начала немного о стандарте Ethernet 10baseT.
Скорость передачи данных в этом режиме - 10Мбит.
Передача и прием данных происходят по двум разным парам кабеля UTP CAT5. В нашем случае понадобится только одна пара, предназначенная для передачи. В разъеме эта пара подключена к ножкам 1, 2.  Для того чтобы сообщить хабу или сетевой карте, к которой мы хотим подключить наше устройство, с какой скоростью мы будем передавать данные, существует специальный механизм - "Autonegotiation".
Для скорости 10Мбит нужно с периодичностью 16ms (+/- 8ms)  передавать в линию однополярный положительный импульс длительностью от 100 до 200ns. В результате этого на хабе (сетевой карте) должна загореться специальная лампочка, обозначающая, что к нему подключено 10Мбитное устройство.
Метод кодирования данных называется "Manchester". В нем каждый бит передаваемых данных кодируется последовательностью из двух бит несущей частоты. Для передачи "0" используется последовательность "1,0" а для "1" - "0,1". Для реализации такого алгоритма достаточно одного элемента XOR:
Логический элемент XOR
Кодирование кодом "Манчестер"

Данные передаются младшими битами вперед. Сам пакет должен начинаться со специального 8 - байтного префикса: 55h, 55h, 55h, 55h, 55h, 55h, 55h, D5h. Получается 63 бита - пилот и последний бит - это стартбит. Далее идут уже полезные данные, адрес получателя,отправителя и т.д. Более подробную информацию о различных типах  пакетов и их структуре, а также о том, какие пакеты реально "ходят" в вашей локальной сети можно узнать при помощи программы "Ethereal" (Теперь эта программа называется Wireshark).

Заканчивается пакет четырехбайтной контрольной суммой ( CRC32 ).
Кроме того существуют ограничения на минимальную и максимальную длину пакета, минимальная - 60 байт ( без префикса и CRC32 ).

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

Для подключения к сети, как уже ранее было сказано, нам понадобится всего одна пара. На плате Марсоход мы подключаем ее с пинам DP и DN.

К пинам f0..f5 мы будем подключать шесть датчиков температуры (DS18B20). Об измерении температуры этим датчиком у нас уже была статья.

Кроме того, нужна тактовая частота 10Мгц (меандр).  Для ее получения мы установили внешний кварцевый генератор на 80Мгц (можно какой-нибудь другой, из которого, целочисленным делением, можно получить 10Мгц ).

Подключение внешнего генератора к плате Марсоход

Для простоты, чтобы самим не изобретать значения различных полей в пакете, мы взяли за основу реальный пакет, отправленный программкой vdomsg.exe . Эта программка отправляет на IP-адрес, указанный в качестве параметра, тестовую строку.

Воспользовавшись программой Wireshark, мы перенесли все значения в константу C64X8.V - это файл на языке Verilog.

Таким образом, наш посылаемый пакет, до начала UDP-данных, будет всегда одинаковым.

Следующие четыре байта будут нести полезную нагрузку:
0    - Номер опрашиваемого датчика температуры
1    - Состояние кнопок key[3..0] (Для контроля дверей холодильника)
2,3 -  Результат измерения температуры одного из датчиков.

Созданый нами проект для платы Марсоход для Altera Quartus II можно взять здесь:

В этом же архиве есть исходный текст программы (MS Visual C++ 6.0) udp-marsohod.exe, которая используется для приема наших пакетов. Там же есть и уже скомпилированные утилиты.

Зашиваем проект программатором Quartus II и приступаем к лабораторным испытаниям:

Для приема пакетов мы использовали программу udp-mаrsohod.exe, которая показывает принятые данные на экране.

Опишу, что тут видно на этом видео.

Первый столбец это номер датчика температуры, от которого пришла информация, пакет UDP. Второй это состояние кнопочек на плате. Видно как поочередно нажимаем кнопочки и приходят числа 8, 4, 2, 1. Следующие два байта - значение температуры. Видно как оно меняется когда к датчику прикасаемся пальцами.

В лабораторных условиях мы опробовали два разных датчика температуры DS18B20 и DS1820. Кроме того, мы пробовали отнести датчик на расстояние 10м от устройства и увеличивали длину сетевого кабеля до 80м - все работает.

О результатах испытаний и эксплуатации на реальном объекте мы сообщим дополнительно.

 


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