Знакомство с TCP стеком для микроконтроллеров фирмы Microchip

 

 


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

Взять контроль в свои руки, подключив к своему любимому контроллеру драйвер физического уровня (PHY), такой как микросхема ENC28J60 стандарта 10 Base-T, или микросхема ENC624J600 стандарта 10/100 Base-T от всё той-же фирмы Microchip, или же взять контроллер семейства PIC18FXXJXX со встроенным PHY, и программно реализовать все необходимые протоколы. Стек протоколов можно написать самому (не слишком тривиальная задача), или воспользоваться уже готовым стеком (существует довольно большой выбор TCP стеков для микроконтроллеров различных производителей разной степени бесплатности и качества). В этой статье будет представлен краткий обзор TCP стека фирмы Microchip, предназначенный для применения на микроконтроллерах этой фирмы.

Один из поддерживаемых этих стеком контроллеров. Если будем использовать внешнюю микросхему PHY, то практически любой МК производства Microchip, семейств PIC18 (8бит), PIC24 (16бит), и PIC32 (32бит). Если хотим обойтись без внешнего PHY, берём что-нибудь из семейства PIC18F67J60.

 

 

 

      TCP/IP стек Microchip. Cтек входит в состав Microchip Application Libraries (далее MAL). Библиотека бесплатная, поддерживает довольно широкий ряд контроллеров Microchip, и помимо TCP стека содержит так-же стек USB, библиотеку для работы с тач-скринами, смарт-картами и т.п. Последнюю версию библиотеки можно взять тут

Среда разработки. Бесплатные MPLab 8 (слегка устаревшая, но проверенная годами), или MPLab-X (вышедшая с Beta-стадии пару месяцев назад, основанная на Netbeans, перспективная, но пока не слишком стабильная среда разработки).

Компилятор. Официально поддерживаются C18, C30, и C32. Ознакомительную 60-и дневную версию можно скачать с сайта. Через 60 дней ознакомительная версия остаётся функциональной, но выключает режим оптимизации, в связи с чем код может потребовать больше места в ROM.

Программатор и (или) внутрисхемный отладчик. Рекомендую ICD3 или PICKIT3 (ICD2 тоже работает, но не поддерживается средой Mplab-X, и более медленная).

Вместо пайки своей платы, можно воспользоваться одним из многочисленных отладочных комплектов, как производства фирмы Microchip

PICDEM.net2

PIC18 Explorer с дочерней платой PICTail

Explorer 16 c дочерней платой PICTail+

PIC32 Starter Kit с платой расширения IO Expansion Board и PICTail+ (в этом случае не понадобится внешний отладчик, т.к. в PIC32 Starter Kit он уже встроен)

PIC32 Ethernet Starter Kit

 

Существуют и альтернативные решения от фирм Olimex (ENC28J60-H):

и «Тритон» (TRT-Ethernet):

Поддерживаемый функционал:



•Протоколы: ARP, IP, ICMP, UDP, TCP, DHCP, SNMP, SMTP, HTTP, FTP, TFTP
•Поддержка TCP и UDP
•Поддержка SSL
•Поддержка NetBIOS
•Поддержка DNS

Стек поддерживаемых протоколов:

Имеются исходники http-сервера, поддерживающего GET и POST запросы, SSL-аутентификацию и сжатие GZIP, клиент и сервер ICMP, клиент и сервер SNMP (версии 1, 2 и 3, в т.ч. SNMP TRAP), программный мост TCP2UART, сервер TELNET, клиент DynDNS, DNS, DHCP, и многое другое.

При всём при этом, стек занимает не так много памяти. Так, реальный проект, содержащий WEB-сервер, DHCP и DNS-клиент, мост Ethernet─Serial, сервер TFTP и SNMP, клиент SMTP, потребует порядка 33 килобайта памяти программ (ROM) и 2 килобайта памяти данных (RAM), при том, что типичный размер памяти PIC18F67J60 составляет 128кб.

 

Производительность стека:


Как видно, скорости не поражают воображение, однако не стоит забывать, что хостить на подобном устройстве «Facebook» вряд-ли кому-либо придёт в голову. А страница размером 30кБ с AJAX и парой небольших картинок загрузится менее чем за секунду (по локальной сети).

 

Дистрибутив MAL содержит ряд примеров, наиболее интересные из которых:

 

•TCPIP Internet Bootloader App — пример, реализующий обновление прошивки контроллера по протоколу TFTP.

 

•TCPIP Internet Radio App -играет mp3 поток с указанного сайта (используется внешняя микросхема-декодер mp3).

 

•TCPIP WebVend App – эмулятор торгового автомата с Web-интерфейсом (демонстрируется работа запросов GETPOST, Ajax)

 

Собираем проект


Всё это интересно, но пора бы уже собрать собственное приложение. Пусть это будет пример «Demo App» (из каталога Microchip Solutions v2011-12-05TCPIPDemo App). Переходим в эту папку, и видим кучу «сишных» файлов, вперемешку с файлами проектов от MPLAB (*.mcp, *.mcw). Ищем файл проекта, подходящий для нашей отладочной платы. Скажем, если у плата у нас называется «Ethernet Starter Kit», открываем проект C32-PIC32_ETH_SK_ETH795. Если плата пользовательская, можно создать проект с нуля, или открыть наиболее похожий проект и модифицировать под себя. Например, если плата будет с PIC18F67J60 со встроенным PHY, берём проект C18-PICDN2_ETH97, и дорабатываем напильником. Доработка заключается в следующем: Лезем в Project->Build options->Project->С18, и меняем C18-PICDN2_ETH97 на «YOUR_BOARD»:

Создаем файл HWP YOUR_BOARD.h на основе наиболее похожего. В этом файле прописаны номера портов для модулей, использующих какую-либо периферию. Скажем, модуль SPI_EEPROM.c берёт оттуда имена портов SPI для обмена данными с внешним EEPROM:

#define EEPROM_CS_TRIS (TRISCbits.TRISC0)
#define EEPROM_CS_IO (LATCbits.LATC0)
#define EEPROM_SCK_TRIS (TRISCbits.TRISC3)
#define EEPROM_SDI_TRIS (TRISCbits.TRISC4)
#define EEPROM_SDO_TRIS (TRISCbits.TRISC5)


Если в нашей пользовательской плане порты отличаются, устраняем несоответствие.
Такая избыточная сложность демонстрационных проектов связана с желанием фирмы-производителя сделать так, чтоб пример можно было запустить на максимально-возможном числе разнообразного «железа». В дальнейшем, при написании своего проекта «с чистого листа» всё это можно будет вычистить и получить простую и понятную структуру.
Второй интересный файл, это TCPConfig.h, который, в зависимости от выбранного типа отладочной платы, вызывает файл с параметрами IP-протокола. Для пользовательской платы с PIC18F87J60 этот файл будет называться TCPIP ETH97.h
В нём включаются и отключаются различные модули стека.

/* 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 MPFS_USE_EEPROM
//#define MPFS_USE_SPI_FLASH

Устанавливается IP-адрес по умолчанию:
#define MY_DEFAULT_IP_ADDR_BYTE1


Настраивается размер буферов, и многое другое. Можно так-же не править этот файл вручную, а воспользоваться визардом, поставляющимся вместе со стеком:

 

Для проверки можно выключить режим автоматического получения ip-адреса, закомментировав строчки #define STACK_USE_DHCP_CLIENT и #define STACK_USE_IP_GLEANING. Получив наконец пинг, пробуем ввести адрес платы в браузере. Видим  сообщение об ошибке.

Естественно, ведь мы ещё не загрузили никаких файлов на наш WEB-сервер. Исправляем этот недочёт. Для этого нам понадобится утилита «Microchip MPFS generator».

Утилита преобразует указанную папку с файлами в файл-образ, пригодный для загрузки на встраиваемый сервер. В качестве Source Directory ей надо указать каталог с файлами для загрузки. Формат же зависит от того, где мы собираемся хранить эти файлы. Если в качестве места для хранения файлов мы указали внутреннюю ROM контроллера, указываем формат C18/C32 Image, и получаем на выходе файл MPFSImg2.c, внутри которого будет объявлен большой массив двоичных данных. Этот файл нужно добавить к проекту, и перекомпилировать его.
Если же для хранения файлов используется внешняя микросхема FLASH или EEPROM, выбираем формат BIN Image. Полученный на выходе файл MPFSImg2.bin загружаем либо через форму загрузки на сервере, либо включив соответствующую опцию в MPFS generator. Загружаем, обновляем страницу, и видим…наш сервер работает !

Пара слов о том, как это работает


Статический текст выводится непосредственно в файле HTML.
Чтобы отобразить на web-странице сервера динамическую переменную, достаточно заключить её тильдами, в виде ~variable~, а в коде файла CustomHTPPApp.c создать функцию, вида HTTPPrint_variable()

 

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

Стек не использует какую либо ОС, и работает по принципу кооперативной многозадачности (впрочем, при желании можно прикрутить и ОС, см. AN1264). Выглядит это так:
В main() крутится бесконечный цикл, из которого вызываются функции, обслуживающие стек (StackTask и StackApplications) и пользовательские функции (в данном примере это user_task(), но может быть что угодно).

do
{
StackTask();
StackApplications();
user_task();
CLRWDT(); //сторожевой таймер
}while(1);


При этом нужно стараться, чтоб пользовательская функция не выполнялась слишком долго. К примеру, если в этой функции сработает «тупая» задержка вида while(delay); то функции стека не смогут обработать входящие Ethernet пакеты, и на время этой задержки связь с устройством пропадёт. Для организации различных таймаутов, необходимых для нормальной работы IP протокола, стек использует аппаратный таймер МК (timer0 или timer1), работающий по прерыванию (по переполнению таймера вызывается функция TickUpdate).
Помимо реализации WEB-интерфейса и отправки SNMP trap-ов, довольно удобно использовать Telnet для вывода отладочной информации вместо традиционного в таких случаях порта RS-232.

Заключение

Тема Ethernet весьма обширна, и в одной статье рассказать обо всём невозможно. Для заинтересовавшихся предлагаю ознакомиться с сайтом

Microchip Ethernet Design Center

Бюджетный Serial to Ethernet адаптер за один вечер

Подключение микроконтроллера к локальной сети

оригинал статьи  http://habrahabr.ru/blogs/controllers/138081/

 
Вход
close
РЕГИСТРАЦИЯ
Оставте поле пароля пустым, для автоматической генерации пароля
close
Восстановление пароля

close