Приветствую Вас, Гость
Ethernet модуль на PIC18F67J60

      На сайте корпорации Microchip есть набор библиотек, "Microchip Application Libraries" который включает в себя библиотеки работы с USB , Memory Disk Drive (MDD) , mTouchCap Library , библиотеки работы с графикой и TCP/IP стек. На основе TCP/IP стека из этого набора библиотек и реализован ниже описанный Ethernet модуль .
      Изначально модуль разрабатывался для ознакомления с возможностями PIC18F67J60 и PIC18F67J90. Эти микроконтроллеры имеют встроенный 10Base-T Ethernet контроллер с интегрированным MAC и PHY что позволяет реализовать подключение микроконтролера к сети Ethernet с минимальным числом дополнительных деталей. В дальнейшем , на основе этого модуля были созданы несколько весьма полезных устройств, например: сетевой тестер, для проверки работы локальной сети и устройство удаленного управления, проще говоря надо было управлять парой реле по локальной сети. В процессе использования нашлось еще много полезных применений данного модуля например сервер времени с синхронизацией по GPS и электронное табло с возможностью изменять информацию по сети.

      На приведенной ниже электрической схеме показан один из вариантов использования модуля "Сетевой тестер" клавиатура и светодиоды LED0-LED5 конструктивно выполнены на отдельной плате, т.е. в конфигурации "устройство удаленного управления " вместо платы с клавиатурой просто подключается плата с транзисторными ключами и реле.



      Как уже говорилось за основу взят пример "TCPIP Demo App" из "Microchip Application Libraries" все настройки портов в этом примере находятся в файле "HardwareProfile.h ". Данный файл содержит настройки портов под разные демо платы и разные компиляторы , за основу была взята конфигурация демо платы "PICDEMNET2". Для приведенной нижне печатной платы необходимо изменить порты к которым подключены светодиоды и добавить определения портов для клавиатуры.
      Затем надо настроить файл TCPIPConfig.h в этом файле можно включать и выключать различные сетевые службы менять IP адреса по умолчанию , пароли и многие другие функции. Для начала это лучше делать с помощью утилиты TCPIPConfig.exe.

      Наличие 128 килобайт памяти программ позволяет разместить небольшой сайт прямо в память контролера, можно использовать и внешнюю память на ЕЕPROM или MMC карту. При использовании MMC карты объем сайта может быть довольно большой но у меня пока в этом необходимости не возникало, для сетевого тестера достаточно сайта с сообщением вроде "It Works" , а для удаленного управления достаточно сайта из микрочиповского примера .
      Чтобы разместить свой сайт в память контролера или в ЕЕPROM необходимо сконвертировать ваш сайт в *.С, для размещения в память контролера или *.BIN для размещения в ЕЕPROM. Для конвертации своей страницы в .c или в .bin файл в комплекте идет утилита MPFSImg.exe при ее использовании обнаружилось несколько нюансов:
      Конвертер кроме создания MPFSImg еще меняет фаилы HTTPPrint.h, HTTPPrint.idx. Если вы по каким либо причинам не станните пользоваться Convert WebPages to MPFS.bat Или поменяете структуру каталогов проекта то для MPFS2.exe, в качестве Project Directory указывайте путь где находится проект.
      MPFSImg в имидж кидает все подряд в месте с комментариями ,а их например в файле mchp.js чуть меньше половины, 2 с копейками килобайта. Комментарии хороши в исходниках но в контролере они лежат мертвым грузом.
      Чтобы отобразить на web-странице сервера динамическую переменную, достаточно заключить её тильдами, в виде ~variable~, а в коде файла CustomHTPPApp.c создать функцию, вида HTTPPrint_variable()

void HTTPPrint_config_ip(void)
{
 HTTPPrintIP(AppConfig.MyIPAddr);
 return;
}

void HTTPPrint_config_gw(void)
{
 HTTPPrintIP(AppConfig.MyGateway);
 return;
}

void HTTPPrint_config_subnet(void)
{
 HTTPPrintIP(AppConfig.MyMask);
 return;
}
      Переменные на Ajax создаются похожим образом, только динамическая переменная создается в отдельном XML файле, в виде: ~var1~, а в коде HTML-страницы вызывается функция их обновления: document.getElementById('var1').innerHTML = getXMLValue(xmlData, 'var1');

Конфигурация сетевых служб.

В данном примере реализованы многие сетевые службы, включение/выключение сетевых служб производится в файле "TCPIPConfig.h " (строки 70-97). Для включения или выключения соответствующей сетевой службы достаточно убрать или поставить двойной слеш перед соответствующей строкой.
В приведенной ниже прошивке конфигурация сетевых служб такая:


// =======================================================================
// Application Options
// =======================================================================

/* Application Level Module Selection
 * Uncomment or comment the following lines to enable or
 * disabled the following high-level application modules.
 */
//#define STACK_USE_UART // Application demo using UART 
 //for IP address display and stack configuration
//#define STACK_USE_UART2TCP_BRIDGE // UART to TCP Bridge application example
//#define STACK_USE_IP_GLEANING 
#define STACK_USE_ICMP_SERVER // Ping query and response capability
#define STACK_USE_ICMP_CLIENT // Ping transmission capability
//#define STACK_USE_HTTP_SERVER // Old HTTP server
#define STACK_USE_HTTP2_SERVER // New HTTP server with POST, Cookies, Authentication, etc.
//#define STACK_USE_SSL_SERVER // SSL server socket support (Requires SW300052)
//#define STACK_USE_SSL_CLIENT // SSL client socket support (Requires SW300052)
#define STACK_USE_AUTO_IP // Dynamic link-layer IP address 
 // automatic configuration protocol
#define STACK_USE_DHCP_CLIENT // Dynamic Host Configuration Protocol 
 // client for obtaining IP address
#define STACK_USE_DHCP_SERVER // Single host DHCP server
//#define STACK_USE_FTP_SERVER // File Transfer Protocol (old)
//#define STACK_USE_SMTP_CLIENT // Simple Mail Transfer Protocol for sending email
//#define STACK_USE_SNMP_SERVER // Simple Network Management Protocol v2C Community Agent
//#define STACK_USE_TFTP_CLIENT // Trivial File Transfer Protocol client
//#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP Client example in GenericTCPClient.c
//#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE // ToUpper server example in GenericTCPServer.c
//#define STACK_USE_TELNET_SERVER // Telnet server
//#define STACK_USE_ANNOUNCE // Microchip Embedded Ethernet Device Discoverer server/client
//#define STACK_USE_DNS // Domain Name Service 
 // Client for resolving hostname strings to IP addresses
//#define STACK_USE_NBNS // NetBIOS Name Service 
 // Server for repsonding to NBNS hostname broadcast queries
//#define STACK_USE_REBOOT_SERVER // Module for resetting this PIC remotely. 
 // Primarily useful for a Bootloader.
//#define STACK_USE_SNTP_CLIENT // Simple Network Time Protocol 
 // for obtaining current date/time from Internet
//#define STACK_USE_UDP_PERFORMANCE_TEST// Module for testing UDP TX performance characteristics. 
//#define STACK_USE_TCP_PERFORMANCE_TEST// Module for testing TCP TX performance characteristics
//#define STACK_USE_DYNAMICDNS_CLIENT // Dynamic DNS client updater module
//#define STACK_USE_BERKELEY_API // Berekely Sockets APIs are available

Включены:
ICMP SERVER и ICMP CLIENT - что позволяет модулю отвечать на Ping-и и пинговать другие узлы.
Dynamic link-layer IP address - что позволяет плате автоматически выбрать IP из заданного диапазона, если IP небыл назначен DHCP Сервером
DHCP CLIENT - Пытается получить IP адрес у DHCP севера при наличии такового в сети.
DHCP SERVER - Раздает IP адреса клиентам
HTTP SERVER - модуль содержит в себе маленький сайт с демонстрацией POST, Cookies, Authentication.

Печатная плата.

      Печатная плата изначально разрабатывалась не для какой то конкретной цели, а просто для ознакомления с PIC18F67J60. Наличие небольшего участка для макетирования позволяет быстро переделать плату под любую задачу.
Печатная плата разведена под разъем SI-50152 или JFM24110, причем линии входа и выхода поменяны местами. Это сделано для того что бы с помощью стандартного патчкорда можно было подключить плату как к компютеру так и к свитчу.       Печатную плату в sprintlayout-50 можно скачать здесь.Проект и прошивка под данную печатную плату здесь.


Подключаемся.

      Подключаем плату к компьютеру ,как уже говорилось, с помощью стандартного патчкорда. Плата пытается получить IP адрес у внешнего DHCP. если это удается то IP адрес платы будет тот что назначит DHCP в противном случае должно стать что-то из этого 169.254.1.0 - 169.254.254.255. IP адрес который будет присвоен в случае отсутствия DHCP определяется функцией AutoIPTasks в файле AutoIP.c

 if (AutoIPClient.flags.bits.checkAddress == FALSE)
 {
 AutoIPClient.flags.bits.checkAddress = TRUE;

 AppConfig.MyMask.Val = 0x00000000;

 // Generate a random IP address (based on the MAC address) to try and claim.
 // Dynamic link-local addresses can fall within the range:
 // 169.254.1.0 - 169.254.254.255
 AutoIPClient.packet.TargetIPAddr.byte.MB = AutoIPRand(i) % 256;
 AutoIPClient.packet.TargetIPAddr.byte.UB = (AutoIPRand(i) % 254) + 1;
 AutoIPClient.packet.TargetIPAddr.word.LW = 0xFEA9;
 
 ARPResolve (&AutoIPClient.packet.TargetIPAddr);

 AutoIPClient.eventTime = TickGet();
 }
и если в конфигурации включен DHCP сервер, #define STACK_USE_DHCP_SERVER в TCPIPConfig.h не должна быть закоменированна и в настойках TCP/IP вашего компьютера включено "Получить IP адрес автоматически" то вашему компьютеру будет назначен IP адрес.

В свойствах TCPIP должно быть "Получить IP адрес автоматически" далее после включения платы смотрим "подключение по локальной сети" закладка "Поддержка" должно быть
Тип адреса: Присвоен DHCP
IP ххх.ххх.ххх.ххх
Маска ххх.ххх.ххх.ххх
Основной шлюз ххх.ххх.хх.хх
Собственно основной шлюз и будет адресом нашей платы

Можно попробовать пропинговать нашу плату

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

      Назначение кнопок в режиме "сетевой тестер" :
"F1" позволяет в ручную задать IP адрес платы
"F2" ввод IP адреса для пинга , модуль пингует введенный ip адрес после нажатия "Enter"
"F3" Изменетие MAK адреса модуля
"Shift" Дополнительные функции кнопок , ввод букв A,B,C,D,E,F, удаление ошибочно введенного имвола "Shift" "0 <-"

Задавать вопросы можно здесь


РадиоЛоцман - Медиа