|
Ethernet+TCP/IP, Самое дешевое решение |
|
|
|
Mar 5 2008, 11:51
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Решил поделиться с народом своим проектом. Положу в отдельную тему, а не в "Исходники...", потому как скорее всего надо будет обсудить  Предыстория такова - давно хотел сделать дешевое и простое подключение своего устройства к Ethernet, естественно с поддержкой TCP/IP. Сначала рассматривались общеизвестные варианты типа RTL8019, Wiznet и т.д. - первый отпал по причине слишком уж камня большого, второй - дорого. Была попытка реализовать PHY-уровень при помощи USART в режиме SPI на Mega88/168, однако оказалось, что если с передачей нет проблем, с приемом все хуже - слишком уж сложной получается схема синхронизации тактовой частоты проца с синхросигналом, выделенном из манчестера, в единичном экземпляре оно конечно поднимается, но о серийном повторении - ну никак. Потом взгляд переместился на микросхемы PHY, и, при внимательном изучении, оказалось, что довольно просто обеспечить работу с PHY при тактовой проца 20МГц. Да и со стоимостью нет вопросов - Realtek'овский RTL8201BL стоит всего около 1$ (как заметил zltigo, Realtek вообще славится экстремально дешевыми решениями в области Ethernet). Была сделана тестовая платка (схему и pcb прилагаю) и на ней все запущено. Не обошлось без подводных камней, но они были успешно обойдены  .SCH и .PCB файлы в архиве - это схема и разводка тестовой платы. Проц используется ATMega168-20AI, PHY - уже упомянутый RTL8201BL, 74HCT547 - буферный регистр, заодно и преобразование уровней 3.3-5В (только не всех линий, по науке надо было еще кое-что преобразовать, но было лень. Вдруг будете использовать в более-менее серийном устройстве - не забудьте все выполнить как положено) Сами исходники - под EWAVR5.10. Код 1 960 arp.h - заголовочник для ARP-пакетов 6 404 eeprom_3.s90 - работа с троированным eeprom 1 668 ethernet.h - заголовочник для Ethernet-пакетов <DIR> HTMLsource - каталог с исходными HTML-файлами и компрессором, который генерирует файл pages.c, запустите generate.cmd и посмотрите 831 icmp.h - заголовочник для ICMP-пакетов 2 400 ip.h - заголовочник для IP-пакетов 3 487 mac.c - передатчик Ethernet-пакетов 3 365 macros.m90 - вот не помню, файл из стандартного иаровского комплекта, зачем перенес в проект - хоть убейте не помню 6 240 mac_rx.asm - прием Ethernet-пакетов 21 591 main.c - HTTP-сервер 4 188 md5cheat.c - MD5 для Digest-авторизации 16 690 network.c - собственно TCP/IP-стек 102 network_addr.h - адреса по умолчанию 5 728 network_routines_avr.c - оптимизированные под AVR всякие процедурки, используемые стеком 52 023 NikeE.ewp - проект 159 NikeE.eww - воркспейс 2 890 nike_e.h - заголовочник всего проекта 4 993 pages.c - запакованные HTML-странички 1 159 pages.h - заголовочник от страничек <DIR> PCAD - схема/плата 204 prog.bat - прошиватель 1 733 stdafx.h - типы данных 2 731 stuff.asm - тут быстрый i2a (для AVR) и таблица CRC32 6 256 tcp.h - заголовочник для TCP-пакетов Заголовочники написаны на основе заголовочников из стека Prottoss'а, за что ему и спасибо. Есть пара маленьких тонкостей - прием пакета написан на ассемблере, а вот передача - на Си, но я посматривал в листинг, посему исправления нужно вносить очень аккуратно, а вообще-то желательно переписать на ассемблере и посылку пакета. По простому можно заставить IAR сгенерить не листинг, а исходный текст (есть там галочка) и подключить его к проекту вместо mac.c. На MAC-уровне реализовано управление входящим потоком при помощи метода, среднего между Back-pressure и Collision-Based. При переполненом внутреннем буфере на первый входящий пакет генерируется встречный пакет (как в Collision-Based) из 0x55, который оканчивается, когда буфер освобождается (Back-pressure). Внутренние буфера 2*256 байт, поэтому, например, ICMP-пакет пинга с -l 209 дропается, а с -l 208 - нормально обрабатывается. Для TCP это не мешает (хотя, конечно, и падает скорость передачи), т.к. максимальный размер пакета регулируется окном. Интерфейс стека с пользовательским софтом выполнен как вызов CallBack-функции, которая должна обрабатывать события TCP_EVENT_CONREQ (запрос соединения), TCP_EVENT_CONNECTED (соеденино), TCP_EVENT_CLOSE (закрыто), TCP_EVENT_ABORT (прервано), TCP_EVENT_ACK (подтверждение ранее переданных данных), TCP_EVENT_DATA (принята новая порция данных), TCP_EVENT_REGENERATE (повтор посылки с начала), TCP_EVENT_SEND (посылка следующей порции). Непосредственно разбор этих сообщений выполняется в HTTP_hook, который вызывает HTTP_hook_DATA_RX для обработки новых данных (например, собственно запроса GET/POST) и HTTP_hook_DATA_TX (генерация данных для передачи). На данный момент реализованы только слушающие (серверные) сокеты, но нетрудно сделать и клиентские. В HTTP-сервере реализована digest-авторизация. Соответственно пришлось пободаться с MD5 в плане уменьшения занимаемого места, удалось поместить его в 1100 байт, больше его под AVR не ужмешь видимо (хотя, конечно, пару байт всегда можно сэкономить, я имею в виду глобальное ужимание). Само наполнение HTTP-сервера сейчас банальное - управление портом С, вывод значений АЦП и отдельная страничка настроек IP/MAC-адресов и задания новых login/pass. Ну а вот так выглядит спаяное устройство
Ну и о скорости. wget в зависимости от погоды показывает 130-160 КБайт/с (порядка 1 Мбита/с). Теоретический предел приема - гдето под 4Мбита/с. Т.е. дропать пакеты он сможет именно с такой скоростью  (и даже быстрее, потому что сначала я проверяю, мой ли пакет, а только потом считаю CRC32, этот расчет выполняется медленнее приема пакета, тут ничего не попишешь)
Прикрепленные файлы
NikeE.zip ( 106.73 килобайт )
Кол-во скачиваний: 11119
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
 |
Ответов
|
Mar 16 2008, 19:18
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Я понял, что Вы про RXC в первую очередь. Да, безусловно. Описался. Цитата Практически >= 1 секунды.Если посмотреть на те же преобразователи частоты - от 100мс до 10 секунд. А не дофига ли? Это же если пару-тройку девайсов отпали, то на круг будет добавка по пол-минуты... Цитата Это уже плохо. Медленно. Может, альтернативы есть? Да там единственная альтернатива - опрос не по прерываниям, причем в отдельном цикле и внутри приема/передачи пакета из/в эзернет. Иначе - никак, ведь пакет длинной 254 байта из эзернета (а на самом деле 254+8(преамбула макс.)+4(возможный тег VLAN)) = 212мкс да плюс еще выход из прерывания - больше 2х байт на скорости 115200 - значит может пропускать байты. Короче, код там хитрый получается, но получается. Думаю, до конца недели по вечерам асилю. Кстати, вопрос про тестовые терминальные програмки еще открыт.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 18 2008, 08:12
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(_Pasha @ Mar 17 2008, 18:15)  Особенно добавляет пессимизма то , что UART находится черт знает где по адресам. Ну это не проблема - 1 такт добавляется. Цитата(_Pasha @ Mar 17 2008, 18:15)  Кстати, про передачу - надо обеспечивать, чтобы пауза между посылками было меньше 3.5 символа. Не 3.5, а 0.5 символа. А некоторые требуют вообще 1 бит. Иначе запрос игнорируют. Цитата(_Pasha @ Mar 17 2008, 18:15)  При приеме езера и RS485 одновременно поллинг UART можно сделать 2-3 раза. Етого хватит. В общем, решаемо. Решаемо, но надо помнить, что любой байт из эзернета может последним в пакете оказаться. В этом случае и кол-во вариантов завершения приёма из эзернета соответственно возрастает. Поэтому я про ATmega164 думаю. Если FLASH не хватит - можно 324 поставить. По ножкам совпадает. И ОЗУ без фиксатора адреса подключается - ног хватает. И USART 2 шт. И стоит стоко-же если не дешевле почему-то. Цитата(Rst7 @ Mar 16 2008, 22:18)  Кстати, вопрос про тестовые терминальные програмки еще открыт. А мне кажется, что наилучшим тестером для этого устройства будет ещё одно такое-же устройство. Таким образом мы и приём и передачу одновременно оттестим. Хотя посложней конечно сделать будет. А может я и ерунду конечно написал т.к. в эзернете профан. А у меня такой вопрос - сколько тактов у нас есть с момента появления прерывания от эзернета до того, как мы первый нибблл данных прочесть ОБЯЗАНЫ? Если это 8 тактов - не вложимся. Т.к. из-за асинхронности 1 такт добавляется, потом 4 такта команды которую прерываем (макс), 4 такта переход на саму таблицу прерываний и в самой-же таблице чтение с данных с порта 1 такт. Итого 10 тактов получается. Или у нас 15 тактов есть? Или больше из-за преамбул и т.п.? Цитата(alexander55 @ Mar 18 2008, 09:06)  В АСУТП есть: - коммутационный процессор -КП (это мост между различными интерфейсами и изером) А тут у меня такой вопрос - если нам на запрос по модбас (мы мастер) не ответили или ответ с ошибкой CRC пришёл - надо-ли запрос повторять? И если надо, то скоко раз?
|
|
|
|
|
Mar 18 2008, 12:07
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(galjoen @ Mar 18 2008, 11:12)  А тут у меня такой вопрос - если нам на запрос по модбас (мы мастер) не ответили или ответ с ошибкой CRC пришёл - надо-ли запрос повторять? И если надо, то скоко раз? Зависит от требований. Modbus обеспечивает только правильность принятой информации, а достоверность прихода не гарантирована. Это уже вопрос второй, надпротокола. Например, IP обеспесчивает правильность принятой информации, а уже TCP - гарантирует приход (а для примера, UDP - не гарантирует).
|
|
|
|
Сообщений в этой теме
Rst7 Ethernet+TCP/IP Mar 5 2008, 11:51 A.l.e.x. А не проще ли на ENC28J60, как реализовано здесь h... Mar 5 2008, 12:01 zltigo Цитата(A.l.e.x. @ Mar 5 2008, 15:01) А не... Mar 5 2008, 12:09 Rst7 ЦитатаА не проще ли на ENC28J60
Дороже и жрет бол... Mar 5 2008, 12:05 A.l.e.x. Цитата(Rst7 @ Mar 5 2008, 14:05) Дороже и... Mar 5 2008, 12:26  alexander55 Цитата(A.l.e.x. @ Mar 5 2008, 15:26) Со с... Mar 5 2008, 12:44 Rst7 Цитатана борту имеет...
На борту еще имеет 6 стра... Mar 5 2008, 12:15 zltigo Цитата(Rst7 @ Mar 5 2008, 15:15) На борту... Mar 5 2008, 12:26 A.l.e.x. Я слышал, что у каждого ethernet-устройства должен... Mar 5 2008, 12:49 Rst7 ЦитатаА можно ли на этой плате сделать переходник ... Mar 5 2008, 13:23 defunct Rst7
ЗачОт! Mar 5 2008, 13:48  Dog Pawlowa Цитата(defunct @ Mar 5 2008, 17:48) Rst7
... Mar 5 2008, 14:51 bzx Если вести разговор о самом дешёвом решении, то PI... Mar 5 2008, 15:30 defunct Цитата(bzx @ Mar 5 2008, 17:30) Если вест... Mar 5 2008, 16:26 Rst7 ЦитатаЦена вопроса ~4-5?
Незащитано. Тут цена воп... Mar 5 2008, 16:58 Mc_off RESPECT !!!
Спасибо огромное ! Mar 5 2008, 17:33 aaarrr На LPC и SAM портировать можно, но смысла большого... Mar 5 2008, 17:25 Rst7 Цитатамладшие кристаллы с MAC стоят достаточно деш... Mar 5 2008, 17:42 zltigo Цитата(Rst7 @ Mar 5 2008, 20:42) zltigo в... Mar 5 2008, 22:15  singlskv Цитата(zltigo @ Mar 6 2008, 01:15) А прос... Mar 5 2008, 22:30  alexander55 Цитата(zltigo @ Mar 6 2008, 01:15) Что-то... Mar 6 2008, 08:37 singlskv Немного не по теме основного топика, но начал смот... Mar 5 2008, 21:27 Rst7 Цитатану а потом просто понял что здесь 16бит защи... Mar 6 2008, 06:10 GDI Идея очень хорошая и ее по праву можно поставить в... Mar 6 2008, 07:16 Rst7 ЦитатаPS. Если удастся подключать через OPC-драйве... Mar 6 2008, 10:02 alexander55 Цитата(Rst7 @ Mar 6 2008, 13:02) Я так по... Mar 6 2008, 10:53 A.l.e.x. Цитата(Rst7 @ Mar 6 2008, 12:02) Я так по... Mar 6 2008, 10:54  alexander55 Цитата(A.l.e.x. @ Mar 6 2008, 13:54)
Это... Mar 6 2008, 11:49  _Pasha Цитата(A.l.e.x. @ Mar 6 2008, 13:54) Возм... Mar 12 2008, 08:12  defunct Цитата(A.l.e.x. @ Mar 6 2008, 12:54) Макс... Mar 12 2008, 15:07   _Pasha Цитата(defunct @ Mar 12 2008, 18:07) Отку... Mar 12 2008, 16:08   A.l.e.x. Цитата(defunct @ Mar 12 2008, 17:07) Отку... Mar 13 2008, 13:49 Erv&Sed RST7 я вас правильно понял, у вас реализован в том... Mar 6 2008, 17:48 Rst7 Цитатау вас реализован в том числе и HTTP протокол... Mar 7 2008, 07:55 cornflyer msp430 + ENC28J60 Mar 12 2008, 07:50 Rst7 Цитатаmsp430 + ENC28J60
Ну это ничем не отличаетс... Mar 12 2008, 08:30 _Pasha Цитата(Rst7 @ Mar 12 2008, 11:30) Регистр... Mar 12 2008, 08:48 Rst7 ЦитатаСторона, отправившая плохой пакет, должна зн... Mar 12 2008, 09:31 _Pasha Цитата(Rst7 @ Mar 12 2008, 12:31) Чето я ... Mar 12 2008, 10:53 Rst7 ЦитатаТ.е. application layer нужен?
Ну не целиком... Mar 12 2008, 11:06 _Pasha Цитата(Rst7 @ Mar 12 2008, 14:06) Хотя, а... Mar 12 2008, 11:35 Rst7 ЦитатаПоговорили. Я этот случай и имел ввиду.
Объ... Mar 12 2008, 12:26 Rst7 Падаждытэ
Насколько я понимаю, есть спецификация... Mar 13 2008, 06:13 sensor_ua Цитатаесть спецификация Modbus over TCP
это не пов... Mar 13 2008, 06:42 Rst7 ЦитатаРечь же вроде шла о туннелировании пакетов M... Mar 13 2008, 06:49 sensor_ua Хм... думаю, что речь всё же шла об туннелировании... Mar 13 2008, 07:49 _Pasha Цитата(sensor_ua @ Mar 13 2008, 11:49) Хм... Mar 13 2008, 10:47 defunct Цитата(_Pasha @ Mar 13 2008, 12:47) Хочет... Mar 13 2008, 11:29 Rst7 Цитата(_Pasha @ Mar 13 2008, 12:47) Хочет... Mar 13 2008, 13:23 galjoen А что вы всё в Модбас упёрлись? На мой взгляд это ... Mar 13 2008, 11:10 Rst7 Цитата(galjoen @ Mar 13 2008, 13:10) И ту... Mar 13 2008, 15:03  galjoen Цитата(Rst7 @ Mar 13 2008, 18:03) Могу на... Mar 13 2008, 16:30   _Pasha Цитата(galjoen @ Mar 13 2008, 20:30) В ZH... Mar 13 2008, 22:22    galjoen Цитата(_Pasha @ Mar 14 2008, 01:22) Пока ... Mar 13 2008, 23:24    galjoen Цитата(_Pasha @ Mar 14 2008, 01:22) Бухга... Mar 15 2008, 12:06     _Pasha Цитата(galjoen @ Mar 15 2008, 16:06) ... ... Mar 15 2008, 21:34      galjoen Цитата(_Pasha @ Mar 16 2008, 00:34) А есл... Mar 16 2008, 13:49 _Pasha Цитата(galjoen @ Mar 13 2008, 15:10) А чт... Mar 13 2008, 11:45 AlexG Цитата(_Pasha @ Mar 13 2008, 17:45) Слухи... Mar 13 2008, 19:26 SasaVitebsk А для меня, было бы интересно COM порт виртуальный... Mar 13 2008, 20:59 Rst7 Цитата1. Какое преимущество даст подсчет CRC32 на ... Mar 15 2008, 14:08 _Pasha Цитата(galjoen @ Mar 16 2008, 16:49) Быст... Mar 16 2008, 14:42 galjoen Цитата(_Pasha @ Mar 16 2008, 17:42) Дык э... Mar 16 2008, 15:05  _Pasha Цитата(galjoen @ Mar 16 2008, 18:05) мы п... Mar 16 2008, 16:55 Rst7 Цитатаrxc_isr: sei
Вот так делать нел... Mar 16 2008, 17:58 _Pasha MODBUS over serial line specification and implemen... Mar 16 2008, 18:24 _Pasha Цитата(Rst7 @ Mar 16 2008, 22:18) А не до... Mar 16 2008, 19:38  alexander55 Цитата(_Pasha @ Mar 16 2008, 22:38) Я в P... Mar 18 2008, 06:06 galjoen Цитата(Rst7 @ Mar 16 2008, 22:18) Да там ... Mar 17 2008, 12:12  prottoss Цитата(galjoen @ Mar 17 2008, 19:12) Где ... Mar 17 2008, 12:16  _Pasha Цитата(galjoen @ Mar 17 2008, 15:12) С пр... Mar 17 2008, 15:15  _Pasha Цитата(galjoen @ Mar 18 2008, 11:12) Не 3... Mar 18 2008, 11:24    alexander55 Цитата(zltigo @ Mar 18 2008, 22:09) Не га... Mar 20 2008, 05:59     alexander55 Для автора темы.
Варианты конвертора Ethernet-RS48... Mar 27 2008, 06:02      MrYuran Цитата(alexander55 @ Mar 27 2008, 09:02) ... Mar 27 2008, 06:11       alexander55 Цитата(MrYuran @ Mar 27 2008, 09:11) Насч... Mar 27 2008, 06:32        MrYuran Цитата(alexander55 @ Mar 27 2008, 09:32) ... Mar 27 2008, 07:03         alexander55 Цитата(MrYuran @ Mar 27 2008, 10:03)
На ... Mar 27 2008, 08:00 Rst7 ЦитатаА мне кажется, что наилучшим тестером для эт... Mar 18 2008, 08:33 galjoen Цитата(Rst7 @ Mar 18 2008, 11:33) Не, не ... Mar 18 2008, 09:05 Rst7 ЦитатаНапример, IP обеспесчивает правильность прин... Mar 18 2008, 12:21 alexander55 Цитата(Rst7 @ Mar 18 2008, 15:21) Не гара... Mar 20 2008, 05:34 Rst7 ЦитатаIP - интернет прококол. Содержит IP адреса п... Mar 20 2008, 05:47 Rst7 ЦитатаДля автора темы.
Варианты конвертора Etherne... Mar 27 2008, 12:00 alexander55 Цитата(Rst7 @ Mar 27 2008, 15:00) Хоть уб... Mar 27 2008, 12:20 prottoss Не помню сайт, откуда скачивал
Еще бы посоветов... Mar 27 2008, 12:15 Rst7 ЦитатаЕще бы посоветовал, для отладки со стороны с... Mar 27 2008, 12:44 alexander55 Цитата(Rst7 @ Mar 27 2008, 15:44) О да, б... Mar 27 2008, 13:21  galjoen Под Win невозможно слейв сделать (или какой-то стр... Mar 27 2008, 14:33 A.l.e.x. Цитата(Rst7 @ Mar 27 2008, 14:44) О да, б... Mar 27 2008, 14:59 sensor_ua В NModbus был эмулятор слейва Mar 27 2008, 13:15 Rst7 ЦитатаВ NModbus был эмулятор слейва
А можно мордо... Mar 27 2008, 13:51 alexander55 Цитата(Rst7 @ Mar 27 2008, 16:51)
Mar 27 2008, 14:06 sensor_ua www.nmodbus.com Mar 27 2008, 13:55 sensor_ua Цитатаесли слейв СРАЗУ-ЖЕ отвечать начнёт
Зачем-то... Mar 27 2008, 14:48 galjoen Цитата(sensor_ua @ Mar 27 2008, 17:48) За... Mar 27 2008, 15:10
3 страниц
1 2 3 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|