В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MSP430
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Соединение с интернет MSP430

Резюме

Компьютерные коммуникационные системы и особенно Internet играют все более и более важную роль в нашей повседневной жизни. Но сегодня это не только домены персональных компьютеров или рабочих станций. Все чаще и чаще доступ необходим и к небольшим сетевым узлам. Вообразите применения, когда доступ к контрольным устройствам осуществляется через стандартный браузер Internet. Они позволяют вести обмен данными с удаленными устройствами и посылать электронную почту, информирующую управляющую систему о возникновении аварийной ситуации или несанкционированном доступе к охраняемым объектам.

В данном примере применения подробно описывается создание встроенного Web сервера на основе низкопотребляющего микроконтроллера MSP430 производства компании Texas Instruments. Также приведено описание аппаратной (схема и перечень элементов) и программной (исходный текст на C) частей. Контроллер Ethernet ЛВС обеспечивает подключение к Internet на физическом уровне. Здесь используется уменьшенный стек TCP/IP протокола. Его функциональные возможности определяются простым в использовании прикладным программным интерфейсом (API). При использовании API создание новых приложений и модификация существующих становятся весьма простыми задачами. В качестве примера реализован динамический HTTP сервер.

1 Введение

Как известно, при использовании в компьютерных сетях Ethernet обеспечивает устойчивую и понятую технологию для сетевых устройств, не входящих в состав настольных персональных компьютеров (ПК). Цель этой разработки состоит в том, чтобы показать, как просто реализовать TCP/IP стек и Ethernet интерфейс для MSP430. Пример применения содержит исходный текст и принципиальную схему с описанием.

Желательно до ознакомления с данным примером применения разобраться с TCP/IP протоколом. Во втором разделе содержится некоторая общая информация об используемых протоколах. Для более детального изучения упомянутых протоколов следует обратиться к соответствующим источникам информации. В третьем и четвертом разделах описаны аппаратная часть и программное обеспечение демонстрационной платы описываемого в данном примере применения устройства.

На основе этой демонстрационной платы можно изготовить различные устройства типа интеллектуальных бытовых систем, охранных систем, ридеров и т.д., которыми можно будет легко управлять при помощи специализированной программы или стандартного Internet браузера из любой точки мира. Особое преимущество встроенного HTTP сервера состоит в том, что web-браузер управляется целостным пользовательским интерфейсом. Визуализация информации может быть просто осуществлена путем передачи ASCII строк (HTML кода) клиенту, что приведет к тому, что потребуются минимальные ресурсы.

2 Важные основы протокола

Обычно описание стеков протокола осуществляется на основе многоуровневой модели. Каждый из этих уровней обеспечивает свои собственные функции с протоколами верхнего уровня и используется для облегчения получения сервисных функций от протоколов нижнего уровня. Детали работы протоколов нижнего уровня скрыты от протоколов верхнего уровня. Это упрощает и программную разработку и техническое обслуживание. Например, был создан новый транспортный уровень, использующий другую транспортную среду. При таком подходе нет необходимости изменять программное обеспечение верхнего уровня. Обычно для описания архитектуры Internet используется семиуровневая ISO/OSI модель. На рисунке 1 показана зависимость между функциями этой модели и эталонной модели Internet, описанной в таблице 1.


Рисунок 1. Связь между ISO/OSI моделью и эталонной моделью Internet

На каждом уровне, на котором происходит передача данных, происходит добавление к сегменту собственного заголовка. Это приводит к формированию пакетов данных (см. рисунок 2). Например, при приеме данных из Ethernet сети, TCP/IP стек должен шаг за шагом извлечь данные проколов разного уровня.


Рисунок 2. Формирование пакета данных

2.1 Ethernet

На сегодняшний день Ethernet является самой распространенной средой передачи данных в ЛВС. В эталонной модели Internet он относится к сетевому уровню. Стандарт IEEE 802.3 определяет возможные скорости передачи данных, физическую реализацию кодирования бит и используемый формат кадров. В Ethernet осуществляется разделение шины, а каждый узел сети имеет одинаковые права при обращении к данным при помощи (CSMA/CD) метода. Если обнаруживается коллизия, то узлы прекращают передачу данных и используя специальный алгоритм для ретрансляции. Данные передаются манчестерским кодом по двухпроводным линиям (витая пара, RJ45) или коаксиальным кабелям (RG58, BNC).

Каждый узел сети имеет свой уникальный физический адрес. Он состоит из 48 бит и называется MAC адресом. Максимальная длина кадра в Ethernet - 1518 байт. В эту величину не входит преамбула. Преамбула состоит из чередующихся нулей и единиц и используется для синхронизации. Присутствует она в каждом реальном кадре. Первые передаваемые 48 бит - это адрес получателя, а вторые - адрес источника. После этого передается двухбайтное значение, указывающее тип передаваемого кадра. Поле типа используется стеком приемника для того, чтобы определить какому типу протокола верхнего уровня будут передаваться данные. Далее передаются данные (не более 1500 байт), сопровождаемые 4- байтовым проверочным словом CRC кода. Этот циклический код гарантирует целостность передачи данных.

2.2 Протокол разрешения адреса

В сетях Ethernet обычно используется протокол разрешения адреса (ARP). Его основная цель состоит в том, чтобы отделить физический адрес сетевого узла (например, Ethernet/MAC адрес) от логической единицы (например, IP адреса) при пересылке пакетов на более высокие уровни. При обмене данными с другими равноправными устройствами осуществляется посылка широковещательного запроса в сеть. Если устройство распознает свой TCP/IP адрес, то оно посылает ответный пакет. После этого запрашивающее устройство знает его MAC адрес и может продолжить обмен пакетами напрямую.

2.3 Протокол маршрутизации в среде Интернет

Протокол маршрутизации в среде Интернет (IP) разработан для использования в сетях передачи данных при помощи пакетов. Он определяет механизмы передачи данных от источника к адресату и, при необходимости, алгоритм измельчения пакетов. Описываемая демонстрационная схема использует наиболее общую на сегодняшний день четвертую версию протокола (IPv4).

Идентификация передатчика и приемника осуществляется по IP адресам. Но этот протокол не гарантирует надежную передачу данных от источника к приемнику. Если необходимо гарантировать прохождение данных, то должен использоваться протокол более высокого уровня, например TCP. Целостность данных в IP протоколе не гарантируется, однако IP заголовок защищен контрольной суммой. Каждый IP пакет имеет поле протокола, содержащее информацию о том, какому протоколу верхнего уровня принадлежат передаваемые данные.

Каждый Internet блок данных обрабатывается как полностью независимый объект, не связанный с любым другим блоком данных, и поэтому IP протокол допускает разрыв связи. Блок данных может быть не в состоянии достигать адресата по различным причинам:

  • Главный компьютер адресата не подключен к сети
  • Блок данных был поврежден
  • Маршрутизатор неверно направил блок данных
  • Протоколы верхнего уровня (например, TCP) могут компенсировать эти недостатки.

2.4 Протокол контроля сообщений Internet

Протокол контроля сообщений Internet (ICMP) обеспечивает механизм, позволяющий сообщать об ошибках и формировать диагностические сообщения. Он позволяет обеспечить более высокую надежность связи. В основном ICMP используется для поддержки IP. Таким образом, он является неотъемлемой частью IP уровня.

Для данного примера применения интересны только два сообщения: ECHO и ECHO REPLY. Главным образом они используются операционной системой при запуске командной утилиты PING. Она посылает сообщение ECHO другому ведущему устройству, которое в ответ посылает сообщение ECHO REPLY и возвращает полученные данные. Утилита PING отображает информацию о времени прохождения сигнала в обоих направлениях (RTT) и надежности сети.

2.5 Протокол управления передачей

Протокол управления передачей (TCP) - протокол транспортного уровня стека TCP/IP сети. Это очень надежный, ориентированный на установления соединения между ведущими компьютерами, протокол, используемый в сетях с пакетной коммутацией. Это наиболее стабильный транспортный уровень из обычно используемых протоколов маршрутизации в среде Интернет (таких как HTTP, SMTP, FTP и telnet). Простого потенциально ненадежного обслуживания блока данных протокола низшего уровня (типа IP) вполне достаточно для обеспечения обслуживания TCP. Для обеспечения этого сервиса реализованы следующие механизмы:

Передача основных данных: TCP разбивает непрерывный поток байт на сегменты и отсылает их подобно IP кадрам.

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

Управление потоками информации: Каждый раз, когда TCP принимает кадр, он говорит другому TCP, сколько байт можно послать в дальнейшем.

Мультиплексирование: TCP предоставляет номера портов, которые позволяют объединять IP адреса. Любая комбинация IP адреса и номера порта называется сокетом (socket). Уникальное TCP соединение определяется парой сокетов.

Соединения: До передачи данных должно быть установлено соединение между главным компьютером и клиентом. Это выполняется при помощи трехполосного установления связи. При этом установлении синхронизируются порядковые номера. После этого может вестись нормальная передача данных.

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

2.6 Протокол передачи гипертекста

Протокол передачи гипертекста (HTTP) - протокол прикладного уровня. Это универсальный, не имеющий состояния, объектно-ориентированный протокол, который может использоваться для многих задач, типа обращения к серверам и распределенным управляющим системам при помощи запросов. Он использует взаимосвязь клиент-сервер и основан на потоковом транспортном протоколе типа TCP. Сегодня наиболее важным применением его является перенос HTML документов, содержащих мультимедийные данные, между Internet серверами и клиентами (всемирная сеть). В основу этого протокола положен принцип запросов и ответов. Самый простой случай - это когда клиент устанавливает соединение с сервером и запрашивает содержание, передаваемое уникальным идентификатором ресурса (URI), которое определяет канал и название ресурса. Обычно, это выполняется при помощи web-браузера. Эти URI структурированы подобно путям доступа к файлам. После декодирования запроса, сервер начинает передавать клиенту ресурс. Запросы (также называемые методами), передаются в виде простых ASCII строк с символами возврата каретки (CR) и перевода строки (LF). Наиболее важные методы приведены в таблице 2.

Таблица 2. Наиболее важные методы HTTP

Метод Описание
GET Клиент запрашивает от сервера ресурс. После этого сервер посылает клиенту поле заголовка и ресурс.
HEAD Подобен методу GET, но при этом сервер возвращает только заголовок без ресурса.
POST Используется для передачи информации от клиента к серверу (например, нажатие на кнопку на web-странице).

Ответ от сервера содержит несколько строк заголовка. Каждая строка заканчивается символами CR и LF. Дополнительные символы CR и LF в конце последней строки указывают на то, что далее идут данные. В большинстве случаев это будет HTML страницей или графическим файлом. После передачи содержания соединение обычно закрывается.

3 Описания аппаратной части

Демонстрационная плата содержит два основных элемента - микроконтроллер MSP430F149 производства компании Texas Instruments и Ethernet контроллер CS8900A производства корпорации Crystal Semiconductor.

MSP430F149, используемый в демонстрационной плате, имеет 60 Кбайт Flash памяти и 2 Кбайтное ОЗУ. Это позволяет ему сохранять и передавать web-страницы. Также микроконтроллер имеет также шесть универсальных портов ввода-вывода, которые могут использоваться не только для формирования интерфейса с LAN контроллером, но и под пользовательские задачи.

CS8900A - дешевый Ethernet контроллер, оптимизированный для персональных компьютеров с архитектурой промышленного стандарта (ISA). Характеристики, которые делают его весьма подходящим для использования в данном примере применения это высокая степень интеграции, которая позволяет снизить количество и стоимость внешних компонентов, а также очень удобная интерфейсная шина. Большинство LAN контроллеров, которые присутствуют на рынке, имеют PCI интерфейс. Микроконтроллер может быть подключен непосредственно к интерфейсной шине CS8900A. Для обеспечения этого интерфейса MSP430 использует линии портов ввода-вывода общего назначения. Другим преимуществом этого контроллера является 3 В питание.


Рисунок 3. Структурная схема аппаратной части

3.1 Интерфейс с LAN контроллером

Самая интересная часть демонстрационной платы - интерфейс между LAN контроллером (IC2) и микроконтроллером (IC1). CS8900A может работать в трех различных режимах: режим ввода-вывода, режим хранения и режим подчиненного DMA устройства. Все эти режимы имеют свои преимущества и недостатки. Для описываемого устройства больше всего подходит режим ввода-вывода. Этот режим является режимом работы по умолчанию и всегда доступен. Самый важный факт – это то, что имеется возможность использовать 8 битную шину данных. Эта шина данных подключается к пятому порту ввода-вывода микроконтроллера MSP430. В режиме ввода-вывода доступны восемь шестнадцатиразрядных портов ввода-вывода CS8900A, которые организованы в виде 16 регистров. Для обращения к ним используется четырехразрядная шина адреса. Также имеется два вывода управления: IOR и IOW. Сигналы на этих выходах имеют низкий активный уровень и индицируют протекание циклов считывания и записи. Полностью интерфейс состоит из 14 линий. Все остальные незадействованные выводы CS8900A используются для установки режима работы и конфигурирования интерфейса. Например, после любого сброса CS8900A устанавливает адрес ввода-вывода, равный 0x300. После установки правильного адреса и подачи на один из входов IOR или IOW низкого сигнала можно осуществлять обмен данными.

3.2 Описание схемы

Принципиальная схема приведена в приложении А. CS8900A включен по типовой схеме. 20 МГц кварцевый резонатор подключен к выводам XTAL1 (97 вывод) и XTAL2 (98 вывод) CS8900A. Выводы XTAL имеют встроенные нагрузочные конденсаторы. Сигнал сброса формируется RC цепочкой R9/C17. LAN контроллер, в отличие от MSP430, имеет высокий активный уровень сигнала сброса. Также Ethernet контроллер имеет выходы управления светодиодами. На 100 выходе (LANLED) устанавливается низкий уровень в те моменты, когда CS8900A передает или принимает данные. К этому выходу подключен красный светодиод (D1). Желтый светодиод (D2) подключен к 99 выводу (LINKLED), на котором устанавливается низкий активный уровень при обнаружении правильных 10Base-T импульсов.

Кроме интерфейса LAN контроллера к MSP430F149 подключен JTAG интерфейс, кварцевый генератор и схема сброса. JTAG интерфейс предназначен для программирования и отладки. Он может использоваться для непосредственного подключения MSP430 к эмулятору. Все необходимые сигналы (например TCK, TDI, TDO/TDI, TMS) доступны на 14 выводном разъеме X6. При необходимости после некоторых программных доработок может быть добавлен RS232 интерфейс. В качестве преобразователя уровней может быть использован преобразователь уровней MAX3221 производства компании Texas Instruments. Он работает от однополярного 3.3 В питания, а для функционирования ему необходимы только четыре внешних 0.1 мкФ конденсатора. Этот преобразователь уровней имеет один приемник, один передатчик и очень низкое потребление, что идеально подходит для описываемого устройства. Для получения максимально возможных параметров микроконтроллер работает от 8 МГц кварцевого резонатора. К автогенератору микроконтроллера подключены два 15 пФ конденсатора.

Питание схемы осуществляется подачей 3.3 В на разъем X3. Индикацию поданного питания осуществляет зеленый светодиод D4.

Все неиспользованные выводы микроконтроллера выведены на разъемы X3 и X4. Они могут использоваться для расширения функциональных возможностей демонстрационной платы.

При разработке печатной платы собственного устройства убедитесь, что конденсаторы фильтров питания расположены непосредственно возле корпусов MSP430 и CS8900A. Также необходимо обратить особое внимание на расположение аналоговых устройств возле LAN контроллера. Для снижения уровня паразитных ЭМИ рекомендуется использовать четырехслойную печатную плату. На рисунке 4 показан внешний вид демонстрационной платы.


Рисунок 4. Демонстрационная плата с установленными элементами

В приложении А приведена схема электрическая принципиальная демонстрационной платы, а в приложении В приведен перечень элементов к ней.

3.3 Подключение к сети

CS8900A содержит встроенный 10Base-T приемопередатчик. Он содержит все необходимые аналоговые и цифровые узлы, необходимые для подключения к ЛВС при помощи простого разделительного трансформатора (IND1). Описывать этот трансформатор в данном примере применения не имеет смысла. Следует только заметить, что при использовании 3.3 В питания коэффициент преобразования передающего трансформатора должен быть равен 1:2.5, а приемного трансформатора - 1:1. Резисторы R1, R2 и R3 используются для согласования полных сопротивлений. Если необходимо заземлить разъем RJ45, то конденсаторы C24 и C25 могут иметь любой номинал. В этом случае сигнал GNDA также должен быть выведен на экран.

Для подключения устройства к 100 Мбит/с или 10 Мбит/с концентратору может использоваться любой соединительный кабель с разъемами RJ45. 100 Мбит/с концентратор автоматически снизит скорость передачи до 10 Мбит/с при обнаружении CS8900A, работающего на скорости 10 Мбит/с.

4 Описание программы

В данной главе описывается реализация TCP/IP стека, драйвера Ethernet и сервера HTTP. Прикладная программа написана на языке С, и поэтому адаптация ее для другого микроконтроллера не составит труда. Для облегчения понимания этой программы она разделена на модули, краткий обзор которых приведен в таблице 3.

Таблица 3. Краткий обзор программных модулей

Применение
  • Передает данных через Ethernet и TCP/IP
  • Использует API функции TCP/IP модуля
  • TCP/IP модуль (tcpip.c, tcpip.h)
    Является библиотекой для прикладной программы
  • Реализует протоколы ARP, ICMP, IP и TCP
  • Реагирует на события (прием кадра, API вызовы пользователя)
  • Модуль Ethernet (cs8900.c, cs8900.h)
  • Аппаратный драйвер для использования LAN контроллера CS8900A
  • Предназначен для конфигурирования регистров записи и чтения и приема и передачи кадров
  • Ethernet
  • Физический уровень, на котором осуществляется обмен данными с LAN контроллером


  • Примечание: При разработке собственного изделия рекомендуется использовать монитор сети (например, Microsoft ™ Netmon ™).

    4.1 Модуль Ethernet

    Основная задача модуля Ethernet cs8900.c - формирование пакета функций для передачи данных при помощи легких в использовании C функций. Также модуль Ethernet формирует синхроимпульсы, используемые для обеспечения доступа к внутренним регистрам CS8900A.

    В заголовке файла cs8900.h можно настроить некоторые параметры интерфейса. Самая важная установка - MAC адрес сетевого интерфейса. Этот 48 битный адрес устанавливается при помощи 6 символьных констант MYMAC_1 - MYMAC_6. Пользователь может изменить этот адрес, но он должен гарантировать уникальность этого адреса в сети. Использование адреса FFFF FFFF FFFF не допускается, так как он зарезервирован в качестве широковещательного адреса и поэтому не может быть использован как индивидуальный.

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

    Таблица 4. Функции модуля Ethernet

    Название, параметры Описание
    пусто Init8900 (пусто) Инициализирует основные выводы микроконтроллера и устанавливает МАС интерфейс с LAN контроллером.
    пусто Write8900 (беззнаковый символьный адрес, беззнаковые целочисленные данные) Записывает 16- разрядные данные в один из восьми доступных регистров CS8900A (адрес). Данным записываются в память LAN контроллера начиная с младшего.
    пусто WriteFrame8900 (беззнаковые целочисленные данные) Записывает 16-разрядные данные в порт TX_FRAME_PORT CS8900A. Используется для передачи слова в передающий буфер.
    целочисленное беззнаковое значение Read8900 (беззнаковый целочисленный адрес) Считывает 16-разрядные данные по полученному адресу. Байты считываются начиная с младшего.
    целочисленное беззнаковое значение ReadFrame8900 (пусто) Считывает 16-разрядные данные по адресу RX_FRAME_PORT. Используется для приема данных микроконтроллером. Байты считываются начиная с младшего.
    целочисленное беззнаковое значение ReadHB1ST8900 (беззнаковый символьный адрес) Считывает 16-разрядные данные по полученному адресу, при этом байт с самым большим адресом считывается первым. Эта функция может использоваться для обращения к регистрам CS8900A. Байты считываются начиная с младшего.
    целочисленное беззнаковое значение ReadFrameBE8900 (пусто) Считывает 16-разрядные данные по адресу RX_FRAME_PORT. Используется для приема данных микроконтроллером. Байты считываются начиная с младшего. Используется для считывания данных протоколов верхнего уровня.
    пусто CopyToFrame8900 (пусто *Source, беззнаковое целочисленное значение размера) Копирует байты размера начиная со адреса источника из микроконтроллера в CS8900A TX_FRAME_PORT. Используется для передачи целого кадра.
    пусто CopyFromFrame8900 (пусто *Dest, беззнаковое целочисленное значение размера) Считывает безразмерные байты из LAN контроллера в микроконтроллер.
    пусто DummyReadFrame8900 (беззнаковое целочисленное значение размера) Считывает и отбраковывает байты размера из CS8900A RX_FRAME_PORT. Используется для формирования пропуска кадра. Размер должен быть целочисленным числом.
    пусто RequestSend (беззнаковое целочисленное значение размера кадра) Запрашивает байты размера кадра из буферного регистра LAN контроллера. Эта функция должна вызываться перед записью данных в TX_FRAME_PORT.
    беззнаковое целочисленное значение Rdy4Tx (пусто) Проверяет наличие свободного места в буфере LAN контроллера.

    Сначала Ethernet контроллер должен быть сконфигурирован. Это осуществляется при вызове функции Init8900 (). Ethernet контроллер перезапускается и настраивается в соответствии с данными, записанными в константе InitSequ []. Каждый объект этой константы состоит из адреса и данных. После выполнения этих действий можно осуществлять передачу данных.


    Рисунок 5. Использование модуля Ethernet

    4.2 TCP/IP Модуль

    Этот программный модуль является самой важной частью управляющей программы микроконтроллера демонстрационной платы так как для передачи данных она использует TCP/IP протокол. Он использует функции Ethernet модуля для передачи данных и обеспечивает простой, легкий в использовании API интерфейс для обмена данными с протоколами верхнего уровня.

    Основу модуля tcpip.c составляет набор процедур обработки событий и вспомогательных функций. В TCP/IP стеке может произойти одно из следующих событий:

    • По сети получен кадр.
    • Произошло изменение состояния (например открыто соединение, переданы данные и т.д.).
    • Истекло время ожидания.
    • Произошла ошибка (ошибка сети, соединение сброшено внешним пользователем)

    Программа обеспечивает выполнение функция в соответствии со стандартами RFC 791, 792 и 793. Самая важная функция этого модуля функция DoNetworkStuff (). Эта функция должна периодически вызываться пользовательским приложением. Она выполняет обработку событий TCP. Кроме того, LAN контроллер и микроконтроллер обслуживают различные флаги. В соответствии со значениями этих флагов функция выполняет переход к соответствующему обработчику события. Чем чаще вызывается эта функция - тем лучше параметры TCP. Набор специальных обработчиков событий обрабатывает пользовательские события. Они изменяются при вызове функций стека непосредственно приложением. Эти функции описаны в Разделе 4.3.


    Рисунок 6. Блок-схема процедуры DoNetworkStuff ()

    4

    .2.1 Буферная память

    Для обработки поступающих кадров в SRAM памяти микроконтроллера зарезервирована область под три буферных регистра. Размер этих буферных регистров может быть изменен при помощи соответствующих символьных констант в программном модуле tcpip.h. Увеличение размера буферных регистров проводит к существенному снижению скорости передачи, так как прикладная программа демонстрационной платы поддерживает только один буферный регистр для передачи и один буферный регистр для приема данных по TCP/IP. Этот буферный регистр может быть загружен новыми данными только после того, как получатель подтвердит прием последнего сегмента. Уменьшение скорости передачи является результатом увеличения времени прохождения сигнала в обоих направлениях (RTT) в широковещательной локальной сети (WAN).


    Рисунок 7. Концепция буферизации

    4.2.2 Глобальные переменные

    Вся информация о текущем состоянии TCP, локальные и удаленные IP адреса и номера портов, порядковые номера, таймеры и счетчики хранятся в глобальных переменных, которые доступны всем внутренним функциям стека.

    4.2.3 Разделение каналов и обработка принятых кадров

    Функция DoNetworkStuff () контролирует прием кадров. После проверки адреса кадра (для определения идет ли обращение непосредственно к модулю или широковещательное обращение) вызывается функция ProcessEthIAFrame () или ProcessEthBroadcastFrame (). На рисунке 8 приведена блок-схема алгоритма разделения принятых кадров в зависимости от типа. Если принят широковещательный кадр, который имеет тип ARP запроса, то формируется кадр ARP ответа, который записывается буфер TxFrame2.


    Рисунок 8. Алгоритм разделения каналов принятых кадров

    Если кадр имеет индивидуальный адрес, то сначала проверяется, был ли передан ARP ответ на ранее посланный ARP запрос. Если да, то извлекается МАС адрес. Этот механизм используется для выполнения открытия активного соединения. Если принятый кадр имеет тип IP и его адрес получателя соответствует локальному TCP адресу устройства, то в зависимости от номера протокола IP выполняется функция ProcessICMPFrame () или ProcessTCPFrame ().

    Процедура ProcessICMPFrame () запускается для детектирования ICMP echo запроса и формирования ICMP echo ответа. Другие типы ICMP сообщений игнорируются и отвергаются.

    Если кадр имеет тип TCP, то выполняются шаги, рекомендованные в RFC 793. Сначала с целью определения активности TCP сеанса связи и принадлежности принятого кадра этому сеансу проверяется кадр. После этого состояние переменной TCPStateMachine изменяется в соответствии с установленными флагами принятого сегмента. Если принят сегмент и приемный регистр пуст, то данные записываются в область памяти RxTCPBuffer. При получении правильных сегментов посылается подтверждение. Программа принимает только те сегменты, порядковый номер которых соответствует порядковому номеру последнего признанного сегмента. Подготовку TCP сегментов, не содержащих данные, выполняет функция PrepareTCPFrame (). При вызове ее комбинация флагов передается в качестве параметров. Полный кадр (включая заголовки) формируется в буфере TxFrame2. Например, при вызове процедуры PrepareTCPFrame (TCP _CODE_ACK) будет создан сегмент подтверждения.

    Для предотвращения повреждения принятых данных существует механизм установления связи. Этот механизм использует флаг SOCK_DATA_AVAILABLE в регистре SocketStatus. TCP стек только копирует данные в RxTCPBuffer если сброшен флаг SOCK_DATA_ AVAILABLE. Если RxTCPBuffer пуст и стек записал новые данные в него, то устанавливается флаг SOCK_DATA_AVAILABLE. Если приемный буфер не пуст, то входящие сегменты отвергаются и не подтверждаются. Но данные не теряются так как передатчик TCP будет повторять их пока не получит подтверждение о приеме. Для избежания постоянных ретрансляций данных локальное приложение должно освободит буфер как можно быстрее, вызвав API функцию TCPReleaseRxBuffer () (см. Раздел 4.3).

    4.2.4 Открытие соединения

    Соединение может быть открыто в пассивном или активном режиме путем вызова соответствующей API функции TCPPassiveOpen () или TCPActiveOpen (). Функция TCPPassiveOpen () устанавливает стек в режим, в котором он пытается обнаруживать входящее соединение. Переменная TCPLocalPort определяет номер сканируемого порта.

    Перед выполнением активного открытия, должен быть установлен IP адрес удаленного TCP и локальный и удаленный номер порта. После вызова функции TCPActiveOpen () стек сначала пробует определять MAC адрес оппонента путем посылки ARP запроса. Стек контролирует IP адрес для определения, является ли другой TCP элементом подсети (см. обозначения SUBMASK_1 … 4), и если это так, то адресует этот TCP непосредственно. Если другой TCP - не является элементом подсети, то выполняется запрос протокола разрешения адреса для заданного по умолчанию шлюза (обозначения GWIP_1 … 4), а после этого передача данных происходит по шлюзу.

    После обнаружения MAC адреса для установления связи стек посылает TCP сегмент, содержащий флаг SYN и TCP опцию максимального размера сегмента (MSS). Кроме того, для установления соединения пересылаются еще начальный номер последовательности и размер приемного буфера. Это гарантирует, что входящие сегменты не превысят размер приемного буфера. Подготовка этого кадра осуществляется функцией PrepareTCPFrame ().

    4.2.5 Передача данных

    Сразу после установки соединения (TCPStateMachine изменяется на ESTABLISHED) может производиться передача данных. Фактическое состояние соединения может быть определено путем чтения API флага регистра SocketStatus (см. раздел 4.3). Прием и перенос данных в приемный буфер выполняет процедура ProcessTCPFrame (). Количество принятых байт сохраняется в глобальной переменной TCPRxDataCount. Новые данные могут быть получены только после освобождения буфера. Для этого используется функция TCPReleaseRxBuffer ().

    Для отправки данных другому TCP прикладная программа должна записать их область памяти данных буфера TxFrame1. Для прямого доступа к этой области может использоваться указатель TCP _TX_BUF. Отправка данных инициализируется пользователем путем вызова функции TCPTransmitTxBuffer (). Эта функция проверяет, разрешена ли отправка и устанавливает флаг SEND_FRAME1 в регистре TransmitControl. При выполнении функции DoNetWorkStuff () этот флаг инициализирует передачу кадра. Если получен сегмент подтверждения, то передающий буфер освобождается автоматически. После этого прикладная программа может заполнять буфер новыми данными.

    4.2.6 Закрытие соединения

    TCP соединение может быть закрыто по различным событиям. Обычно это выполняется после вызова функции TCPClose () или дистанционно другим TCP. При закрытии производится обмен сегментами, содержащими флаг FIN. Также соединение закрывается при переполнении ретрансляционного счетчика или при получении сегмента, содержащего RST флаг. Это ошибочные ситуации, которые отображаются соответствующим кодом ошибки в регистре SocketStatus.

    4.2.7 Использование таймеров

    При выполнении TCP может возникать необходимость выполнения и других задач, контролирующих временные интервалы. Стек использует модуль таймера Timer_A MSP430, который настраивается функцией TCPLowLevelInit (). Технические требования протокола для TCP (RFC 793) требуют 32- разрядный счетчик, работающий в свободном режиме от синхроимпульсов с частотой 250 кГц. Он используется для получения начального номера последовательности (ISN), необходимого для открытия соединения. Формируются эти синхроимпульсы 8 МГц кварцевым генератором MSP430. Эти высокочастотные импульсы делятся на 32 и подаются на счетчик, работающий в свободном режиме (TAR). Этот счетчик с периодичностью 0.262 с формирует сигнал прерывания по переполнению. В этом случае подпрограмма обработки прерывания TCPClockHandler () увеличивает 16-разрядный номер ISNGenHigh. Эта переменная является верхним словом ISN. Также при каждом прерывании происходит увеличение переменной TCPTimer. Она используется для формирования событий таймера, необходимых для TCP.

    4.2.8 Ретрансляция данных

    Чтобы избежать разрыва TCP, вызванного потерей переданных данных, реализован механизм временного контроля. TCP стек сохраняет тип переданных данных в LastFrameSent регистре. Если время простоя превышает заданное время RETRY_TIMEOUT (символьная константа в tcpip.h), то кадр посылается снова путем вызова функции TCPHandleRetransmission (). Максимальное количество ретрансляций задается в константе MAX_RETRYS. Если это количество превышается, то происходит закрытие соединения и выдается ошибка. Этот механизм не используется при передаче сегментов, содержащих только флаг подтверждения.

    4.2.9 Резюме

    Несмотря на то, что при разработке программного обеспечения пошли на некоторые компромиссы, совместимость стека с другими коммуникационными устройствами очень велика. В таблице 5 приведен список компьютеров и операционных систем, с которыми возможен обмен данными по TCP/IP протоколу.

    Основные технические недостатки:

    • Одновременно может выполняться только один сеанс связи
    • Не собираются разбитые IP кадры
    • Не буферизируются поврежденные TCP сегменты
    • Не проверяется контрольная сумма входящих данных
    • Отсутствие поддержки IP TOS и опций охраны
    • Игнорирование любых TCP опций

    Совместимость достигнута только с основными требованиями протокола. Устройству требуется 4.2 КБ программной Flash памяти, 100 байт Flash памяти данных и 700 байт ОЗУ.

    Максимальная скорость передачи модуля не может быть точно определена так в значительной степени она зависит от другого TCP. Обычно, TCP, который полностью отвечает техническим требованиям протокола, способен принять и буферный регистр более одного сегмента одновременно. Поскольку MSP430 имеет относительно маленький объем памяти по сравнению с, например, персональным компьютером, он может поддержать только один приемный и один передающий буфер. Из-за большого времени прохождения сигнала в обоих направлениях (RTT) и запаздывания обработки сегментов некоторыми протоколами управления передачей, скорость передачи значительно изменяется. При замере скорости обмена данными между двумя точками несколько раз получались значения несколько кбит/с. Но в большинстве случаев скорость была несколько Мбит/с.

    4.3 API

    Основной целью данной разработки являлось обеспечение существующих и новых устройств возможностью подключения к Internet. Не тратя время на подробное изучение TCP/IP протокола, разработчик может обеспечить подключение к Internet путем простого вызова функций, описанных в данном примере применения. API состоит из набора подпрограмм для передачи и приема данных и набора регистров, содержащих флаги состояния стека.

    Для правильной работы стека очень важно периодически вызывать функцию DoNetworkStuff (). Типовая блок - схема программы, использующей этот TCP/IP API показана на рисунке 9.


    Рисунок 9. Использование функции DoNetworkStuff ()

    Модули прикладной программы не должны блокировать периодический вызов функции DoNetworkStuff (). Для избежания наложения различных модулей программы необходимо опираться на состояния таймеров и счетчиков. Примером применения данной программы является реализация HTTP сервера, который описан в разделе 4.4.

    4.3.1 Функции

    пусто TCPLowLevelInit (пусто)

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

    пусто TCPPassiveOpen (пусто)

    Вызов этой функции приведет к переключению стека в режим сервера, в котором производится обнаружение входящего соединения. Флаг SOCK_ACTIVE устанавливается, показывая, что стек занят. Перед вызовом этой функции должен быть настроен локальный TCP порт. Локальный IP адрес определяется константой, объявленной в файле tcpip.h. Нижеследующий пример показывает как открыть соединение.

    TCPLocalPort = 80;   // установка порта HTTP - сервера
    TCPPassiveOpen ();   // прослушивание входящих соединений
    (…)
    

    Если клиент успешно устанавливает соединение с сервером, то устанавливается флаг SOCK_CONNECTED в регистре SocketStatus.

    пусто TCPActiveOpen (пусто)

    Эта процедура осуществляет попытку установления соединения с удаленным TCP сервером. Она устанавливает флаг SOCK_ACTIVE и посылает ARP запрос с целью выяснения MAC адреса другого TCP. Если адрес IP адресата не принадлежит фактической подсети, то используется IP адрес шлюза. Перед открытием соединения должен быть установлен IP адрес. После открытия соединения, синхронизации и изменения состояния устанавливается флаг SOCK_CONNECTED, и при помощи соответствующих API функций можно осуществлять передачу данных. Если при открытии соединения происходит ошибка, то соединение сбрасывается, а в код ошибки сохраняется в переменной SocketStatus.

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

    * (беззнаковое символьное значение *) RemoteIP = 24;      // IP адресат: 24.8.69.7
    * ((беззнаковое символьное значение *) RemoteIP + 1) = 8;
    * ((беззнаковое символьное значение *) RemoteIP + 2) = 69;
    * ((беззнаковое символьное значение *) RemoteIP + 3) = 7;
    TCPLocalPort = 2025;                 // локальный TCP порт не имеет значения (> 1024)
    TCPRemotePort = 17;                  // стандартный порт: "указатель суток"
    TCPActiveOpen ();
    while (SocketStatus & SOCK_ACTIVE)   // ожидание закрытия соединения 
    {                                    // другим  TCP
    DoNetworkStuff ();
    }
    	

    пусто TCPClose (пусто)

    Используйте эту API функцию для закрытия открытого соединения. Перед отключением стек проверяет был ли отправлен последний пакет и было ли получено подтверждение о его приеме. После закрытия соединения приложение может перестроить IP адрес, переназначить номера портов и открыть новое соединение.

    пусто TCPReleaseRxBuffer (пусто) Вызов этой функции после считывания приемного буфера сообщает стеку, что содержимое буфера больше не нужно и можно записывать новые данные. Также эта функция сбрасывает флаг SOCK_TX_BUF_RELEASED, используемый для индикации приема новых данных.

    пусто TCPTransmitTxBuffer (пусто)

    При использовании этой функции приложение может отправлять данные при установленном уже соединении. Сначала приложение должно проверить, можно ли записывать данные в буфер передатчика. Выполняется это путем проверки флага SOCK_TX_BUF_RELEASED регистра SocketStatus. Если этот флаг установлен, то приложение может записать в регистр передатчика не более MAX_TCP_TX_DATA_SIZE байт начиная с адреса TCP _TX_BUF. После этого количество байт должно быть записано в регистр TCPTXDATACOUNT. После всего этого вызов функции TCPTransmitTxBuffer () проводит к передаче данных (рисунок 10).


    Рисунок 10. Передача данных

    4.3.2 Флаги

    Флаги состояния API сохраняются в 8 битной глобальной переменной SocketStatus. Этот регистр доступен только для чтения. Расположение битов в регистре показано на рисунке 11.


    Рисунок 11. Регистр SocketStatus

    SOCK_ACTIVE (Бит 0)

    Этот флаг устанавливается когда TCP занят открытием соединения. При установленном бите не допускается вызов никаких других функций. Если произошел сбой открытия соединения или соединение было успешно завершено, то стек сбрасывает этот флаг. При возникновении ошибки устанавливается соответствующий флаг ошибки.

    SOCK_CONNECTED (Бит 1)

    Этот флаг указывает на то, что состояние конечного автомата TCP установлено. Если он установлен, то можно осуществлять передачу данных. При включении и сбросе этот флаг сбрасывается.

    SOCK_DATA_AVAILABLE (Бит 2)

    Этот флаг указывает на то, что был принят новый TCP сегмент, и его можно считать из приемного буфера. Для получения доступа к этому буферу должен использоваться указатель TCP _RX_BUF. Переменная TCPRxDataCount содержит количество полученных данных. После считывания содержимого приемного буфера приложение должно немедленно очистить буфер путем вызова API функции TCPReleaseRxBuffer (), что позволит вести прием новых данных (см. рисунок 12). Если буфер не будет очищен, то последующие TCP сегменты будут отвергнуты и соединение может быть закрыто другим TCP.


    Рисунок 12. Прием данных

    SOCK_TX_BUF_RELEASED (Бит 3)

    Этот флаг указывает, может ли приложение изменять содержимое передающего буфера и переменную TCPTxDataCount. Этот флаг устанавливается стеком после правильного распознавания предыдущего пакета. При этом осуществляется алгоритм защиты передающего регистра от перезаписи содержимого до окончания передачи данных.

    SOCK_ERROR (Биты 4 - 7)

    Если произошла ошибка при инициализации соединения или приеме данных, то стек записывает код ошибки в старшую тетраду регистра SocketStatus. Считывание этих бит позволяет определить тип произошедшей ошибки. Сразу после возникновения ошибки бит SOCK_ERR_OK закрывает соединение. В таблице 6 приведены краткие описания кодов ошибок.

    Таблица 6. Описание кодов ошибок стека

    Код ошибки Причина
    SOCK_ERR_OK Нет ошибки.
    SOCK_ERR_ARP_TIMEOUT Ошибка при выполнении ARP запроса. MAC адрес другого TCP не был найден. Другой главный компьютер не подключен к сети или не может ответить.
    SOCK_ERR_TCP_TIMEOUT Ошибка времени ожидания TCP сеанса связи. TCP сегменты посылались несколько раз, но не были приняты другим TCP. Может произойти при очень ненадежном или разорванном соединении.
    SOCK_ERR_CONN_RESET Запрос на открытие соединение или уже открытое соединение было сброшено другим TCP. Другой TCP не может работать по данному порту или прикладная программа другого TCP разорвала соединение (например была нажата кнопка "Остановить" в броузере Internet).
    SOCK_ERR_REMOTE Неустранимая ошибка дистанционного TCP привела к посылке недопустимого сегмента.
    SOCK_ERR_ETHERNET TCP/IP стек не способен послать данные через Ethernet сеть (LAN контроллер не имеет свободного буферного пространства для посланных кадров). Эта ошибка происходит при обрыве сетевого кабеля.

    4.4 Пример применения HTTP сервера

    В качестве примера применения описанный TCP/IP стек был использован как HTTP сервер. Этот сервер обеспечивает HTML web-страницу, которая сохранена во Flash памяти микроконтроллера. Модуль ожидает входящего соединения, передает web-страницу, закрывает соединение и ждет другого клиента. Содержание этой web-страницы может динамически обновляться. На ней отображаются два значения АЦП микроконтроллера.

    4.4.1 Описание программы

    Этот демонстрационный HTTP сервер, как было описано в параграфе API (раздел 4.3), периодически вызывает функцию DoNetworkStuff (). Название исходного файла - easyweb.c, а его самая важная функция - HTTPServer (). На рисунке 13 показана блок-схема этого модуля.


    Рисунок 13. Блок-схема основного модуля Web- сервера

    После непосредственной инициализации аппаратной части и стека, устанавливается 80 локальный TCP порт (значение по умолчанию для HTTP сервера). Теперь сервер ждет клиента. При первом переходе к процедуре HTTPServer () после соединения сбрасывается флаг HTTP _SEND_PAGE в регистре HTTPStatus. Он используется для выполнения некоторых специфических функций при первом вызове процедуры HTTPServer (). Web- сервер проверяет любые приходящие TCP данные и отклоняет их. Предполагается, что полученные данные содержат запрос GET от Internet броузера. Так как наш сервер поддерживает только одну web-страницу, то этот запрос не рассматривается. Сервер запускается сразу после установления связи с клиентом, посылая web-страницу, сохраненную в памяти микроконтроллера. Эта страница сохранена в C - константе WebSide [] модуля webside.c и никак не закодирована. После проверки состояния передающего буфера, в указателе web устанавливается значение, сохраненное в HTTPBytesToSend. При первом вызове HTTPServer () непосредственно перед web-страницей передается заголовок HTTP ответа. Это говорит клиенту о том, что его запрос был успешно декодирован и дает ему знать, какой ресурс будет послан (HTML). Сохранен заголовок в константе GetResponse [] в easyweb.h. После этого web-страница передается частями, размер которых установлен в MAX_TCP_TX_DATA_SIZE. После успешной передачи целой страницы соединение закрывается путем вызова функции API TCPClose (). После этого соединение может быть открыто еще раз при поступлении нового запроса.

    Как может быть реализована динамическая web-страница? Перед посылкой TCP сегмента данных запускается функция InsertDynamicValues (). Эта функция отыскивает в передающем буфере специальные строки. Если такая строка находится, то она заменяется значением аналого-цифрового преобразователя. Эти строки состоят из четырех байт: AD + номер канала + %. Демонстрационный HTTP сервер заменяет строку AD7 % значением седьмого аналого-цифрового преобразователя, а ADA% - значением десятого АЦП. Перед вставкой эти значения преобразуются в процентное значение.

    Значение, заменяющее строку AD7%, формируется функцией GetAD7Val (). Модуль ADC12 микроконтроллера MSP430 настроен на работу от встроенного 2.5 В ИОН. Седьмой канал АЦП подключен к выводу P6.7 микроконтроллера MSP430F149. Измеренное в диапазоне от 0 до 2.5 В напряжение на это выводе преобразуется в относительное значение от 0 до 100. Другая используемая аналого-цифровым преобразователем функция - это GetTempVal (). К десятому каналу подключен встроенный диодный температурный датчик. Устанавливая для него опорное напряжение, равное 1.5 В, и делая измерения в восьми рабочих точках, выполняется вычисление температуры микроконтроллера. При помощи специальной формулы температура в диапазоне от 20 C до 45 C преобразуется в относительное значение от 0 до 100. Эта формула не должна использоваться для точных измерений, а только для демонстрационных.

    4.4.2 Пример динамической Web-страницы

    Модуль сервера формирует простую web-страницу. Он использует технологию замены строк для того, чтобы сделать ее динамической. Наряду с общим текстом на этой странице отображаются значения седьмого и десятого каналов встроенного в микроконтроллер 12 битного АЦП. Для того, чтобы реализовать такие графические панели, можно применить HTML таблицы. Необходимо сформировать две таблицы, имеющие фиксированную ширину и красный цвет фона. В пределах этих таблиц формируются еще две таблицы с зеленым цветом фона. Ширина внутренних таблиц изменяется в соответствии с полученными относительными значениями АЦП. Это очень хороший метод реализации технологии замены.

    При помощи инструкции REFRESH в разделе HEAD исходного текста страницы, броузеру Internet можно задать команду перезагрузки страницы после указанного периода времени ожидания. На демонстрационном HTTP сервере страница обновляется каждые пять секунд. Приведенный HTML код совместим со всеми основными Internet броузерами (типа Microsoft Internet Explorer и Netscape Navigator).

    Для отображения web-страницы необходимо набрать адрес http://192.168.0.30. На рисунке 14 показана страница демонстрационного HTTP сервера. Конечно, модуль должен быть подключен к ЛВС и TCP/IP параметры настройки локальной машины должны соответствовать настройкам модуля.


    Рисунок 14. Экран Internet Explorer