микроконтроллеры от ведущих мировых производителей

Контроллер W7500P – ARM Cortex M0 + аппаратный Ethernet.

С чего начать?

Проводные сети Ethernet остаются популярными и востребованными, несмотря на бурное развитие беспроводных технологий, предлагаемых им на замену. Развитая инфраструктура позволяет просто и дешево обеспечить подключение любых устройств (счетчиков расхода ресурсов, контрольно-кассового оборудования) к локальным сетям и Интернет. Кроме того, в случае проводного подключения можно не беспокоиться об устойчивости канала обмена и возможных сбоях в передаче из-за воздействия внешних условий, что не всегда может  быть обеспечено при использовании беспроводных соединений.

Микросхемы компании Wiznet являются одним из самых простых в освоении и применении решений для проводного Ethernet. Этот производитель уже более 15 лет выпускает аппаратные мосты Ethernet,  аппаратный стек TCP/IP которых включает в себя поддержку протоколов TCP, UDP, IPv4, ICMP, IGMP и PPPoE. Этого вполне достаточно для реализации типовых задач по удаленному сбору данных, мониторингу и управлению.

В декабре 2015 года компания Wiznet начала производство новой микросхемы W7500P. Этот микроконтроллер (МК) включает в себя три основных блока – популярное ядро ARM Cortex M0 с периферией, аппаратный Ethernet и PHY. По стоимости новые микросхемы W7500P дешевле на 25% популярных мостов W5100 этого же производителя и дороже на 25%, чем новые мосты W5500. С помощью W7500P можно в короткий срок реализовать интерфейс Ethernet в новой разработке или, без дополнительной нагрузки на основной МК, добавить его поддержку в модернизируемое устройство.

На рисунке 1 изображена блок-схема МК W7500P. Детально описывать все его узлы в данной статье не будем, с их описанием можно познакомиться в техническом руководстве на микросхему [1].

Отметим только, что микросхема имеет набор стандартных интерфейсов для общения с внешними устройствами. Сюда входят два интерфейса UART с аппаратным контролем передачи, один UART без контроля, два интерфейса SPI со скоростью передачи до 20 МГц, два интерфейса I2C со скоростью передачи до 100 кГц, а также 8-канальный АЦП последовательного приближения с частотой преобразования до 10 МГц. Эта периферия обеспечивает возможность использования W7500P в типовых задачах, где требуется обеспечить подключение к Ethernet и/или организовать мониторинг с помощью аналоговых или цифровых датчиков.

Для освоения микросхемы производитель предлагает недорогую отладочную плату WIZwiki-W7500P (см. рис.2). На плате реализовано все, что необходимо для тестирования функциональных возможностей Ethernet-контроллера.

Программирование и отладка производится с помощью стандартизованного интерфейса микроконтроллеров ARM Cortex CMSIS-DAP, который реализован на отдельном МК, а для связи с ПК используется интерфейс USB. Основным назначением CMSIS-DAP является обеспечение процесса программирования и/или отладки целевого МК через интерфейсы USB или SWD (Serial Wire Debug). При первом знакомстве с МК W7500P и платой WIZwiki-W7500P  для программирования удобно использовать USB. В таком режиме плата отображается на ПК как внешний диск с именем MBED. Никаких специальных драйверов предварительно устанавливать не требуется. Скомпилированный файл прошивки достаточно скопировать на этот диск и процесс загрузки будет выполнен автоматически. CMSIS-DAP, кроме функции программирования, обеспечивает связь МК W7500P с ПК через виртуальный последовательный порт. Со стороны W7500P для этих целей задействован блок UART без аппаратного контроля (UART2). Этот канал может быть использован, например, для вывода отладочной информации в процессе выполнения программы. Для получения доступа к W7500P через виртуальный COM-порт предварительно необходимо скачать и установить драйвер последовательного интерфейса, который можно найти по следующей ссылке [2]. 

Еще одним достоинством отладочной платы WIZwiki-W7500P является наличие статуса mbedEnabled. Он говорит о том, что данное отладочное средство прошло все необходимые тесты на совместимость с набором программных и аппаратных средств, представленных на сайте ARMmbed (https://developer.mbed.org/). Данный ресурс объединяет производителей микроконтроллеров на базе ARM, производителей отладочных средств на базе этих МК и различных плат расширения для них, а также разработчиков, кто работает с ARM-контроллерами. Все представленные на сайте аппаратные платформы полностью поддерживают работу с универсальными набором программных средств – mbed SDK. Это дает возможность запустить любой из примеров, представленных на данном сайте, на нашем МК, если периферия нашего МК позволяет это сделать. Далее мы покажем, как использовать возможности этого ресурса на этапе освоения Ethernet-контроллера W7500P.

Первым шагом для начала работы с W7500P будет добавление отладочной платы WIZwiki-W7500P в онлайн компилятор. Находим, например, через поиск по сайту страницу с описанием этой платы и добавляем ее нажатием на кнопку “Add to your mbed Compiler” (см. рис.3).

После добавления платы надпись на этой кнопке изменится на “Open mbed Compiler”. При запуске компилятора с помощью этой кнопки появится окно создания проекта “Create new program”, в котором можно выбрать готовые примеры или создать проект с “нуля” (см. рис.4). 

За основу нашего будущего проекта возьмем простой пример mbed_blinky. В результате будет создан следующий проект (см. рис.5) в который будут включены файл программы main.cpp и библиотека mbed.

В библиотеку mbed включены все необходимые элементы для работы с периферией и ядром контроллера ARM. В эту библиотеку не входит то, что касается работы аппаратного блока Ethernet. Как работать с Ethernet мы рассмотрим позже, а пока вернемся к текущему примеру. Его код выглядит следующим образом:

#include "mbed.h"

DigitalOut myled(LED1); // выбор выхода МК к которому подключен красный светодиод

int main() {

    while(1) {

        myled = 1;

        wait(0.2);

        myled = 0;

        wait(0.2);

    }

}

Данный код выполняет простую функцию, попеременно включая и выключая красный светодиод. Из всех настроек здесь присутствует только выбор нужного вывода МК и назначение ему функции выхода: DigitalOut myled(LED1). Имена вводов микроконтроллера приведены на странице описания платы WIZwiki-W7500P [3]. Запустим компиляцию проекта и по ее завершении загрузим получившийся файл прошивки с расширением bin в контроллер. Это осуществляется, например, простым перетаскиванием этого файла из папки, где он хранится, на значок съемного носителя MBED (см. рис.6).

По завершению процесса копирования на отладочной плате начнет мигать красный светодиод.

Выше мы упоминали, что плата WIZwiki-W7500P может принимать и передавать данные через виртуальный COM-порт, который доступен через интерфейс USB. Добавим в наш проект вывод информации через него, и код примет следующий вид:

while(1) {

        myled = 1;

        printf("LED On \r\n”);

        wait(0.2);

        myled = 0;

        printf("LED Off  \r\n”);

        wait(0.2);

    }

По умолчанию, инициализация UART осуществляется в библиотеке mbed со следующими параметрами: скорость 9600 бод, без контроля четности и управления потоком, 8 бит данных и 1 стоп-бит. Если мы хотим поменять эти параметры, то инициализацию надо будет сделать самостоятельно. Например, мы хотим увеличить скорость обмена до 115200 бод, надо будет добавить следующий код:

  #include "mbed.h"

DigitalOut myled(LED1);

void baud(int baudrate) {

    Serial s(USBTX, USBRX);

    s.baud(baudrate);

}

int main() {

        baud(115200);

        while(1) {

            myled = 1;

            printf("LED On \r\n");

            wait(0.2);

            myled = 0;

            printf("LED Off \r\n");

            wait(0.2);

        }

}

Теперь рассмотрим базовые принципы работы с Ethernet, который и является основной отличительной особенностью МК W7500P. Для работы с ним в компиляторе mbed нам понадобится фирменная библиотека WIZnetInterface. Ее можно найти на странице производителя [5]. В поле с кратким описанием библиотеки нажимаем кнопку “Import library” (см. рис.7а).

В окне импорта (см. рис. 6б) нам будет предложено указать, в какой из наших проектов требуется добавить эту библиотеку, соответственно выбираем наш текущий проект.

Теперь у нас есть все необходимое для работы с Ethernet. Попробуем теперь реализовать передачу данных между двумя ПК, с одной стороны будет использоваться виртуальный COM-порт, с другой – Ethernet, т.е. реализуем простой конвертер Ethernet-Serial.

Первым делом надо добавить в проект ссылку на заголовочный файл библиотеки WIZnetInterface и задать основные сетевые настройки нашего преобразователя:

#include "EthernetInterface.h"

#define ECHO_SERVER_PORT   80

char ip_addr[] = "192.168.22.3";

char subnet_mask[] = "255.255.255.0";

char gateway_addr[] = "192.168.22.1";

uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02}; 

   Следующим шагом инициализируем и устанавливаем сетевое соединение W7500P:

int main() {

EthernetInterface eth;

eth.init(mac_addr, ip_addr, subnet_mask, gateway_addr);

eth.connect();

printf("Server IP Address is %s\r\n", eth.getIPAddress());

На этом этапе, если откомпилировать и загрузить проект в WIZwiki-W7500P, можно удостовериться о наличии сетевого соединения пингованием. МК W7500P не имеют функции автоматического переназначения линий TX/RX в сетевом интерфейсе. Поэтому, если не получили ответа в процессе проверки соединения, в первую очередь стоит проверить, каким сетевым кабелем (прямым или перекрестным) подключена отладочная плата.

Следующим шагом будет инициализация TCP-сервера, назначение порта, по которому удаленное устройство будет устанавливать соединение и переход в режим ожидания запроса на установление соединения:

TCPSocketServer server;

server.bind(ECHO_SERVER_PORT);

server.listen();

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

while(1)

        {

           printf("Wait for new connection...\r\n");

           TCPSocketConnection client;

           server.accept(client); // принятии запроса клиента на соединение

           client.set_blocking(false, 15000); // Таймаут по истечении 1.5 с

       

           printf("Connection from: %s\r\n", client.get_address()); // получение сетевого адреса клиент

           char buffer[256];

           while (true) {

           int n = client.receive(buffer, sizeof(buffer));

           if (n <= 0) break;

           

            buffer[n] = '\0';

            printf("Received message from Client :'%s'\r\n",buffer);

           

            char temp;

            for(int f = 0, l = n-1; f

                temp = buffer[f];

                buffer[f] = buffer[l];

                buffer[l] = temp;

}

           printf("Sending message to Client: '%s'\r\n",buffer);

          client.send_all(buffer, n);

            if (n <= 0) break;

        }

        client.close();

    }

Запустим на обоих ПК терминальные программы и убедимся в правильности работы нашей программы (см. рис.7).

Итоговый проект можно скачать по данной ссылке.

Итак, в результате мы получили простейший конвертер Ethernet – COM. Это одно из самых востребованных приложений, когда требуется обеспечить подключение ранее разработанных устройств, чаще всего, имеющих стандартные интерфейсы типа RS-232, 485 или 422. Новая микросхема Wiznet W7500P может оказаться хорошим выбором в этом, а также и других сетевых приложениях. Удачный выбор распространенного ядра ARM Cortex M0 для этой микросхемы, в отличие от предыдущей W7100 на базе 51 ядра, позволил Wiznet получить недорогое и простое в освоении решение. 

Литература:

1. Техническое описание микросхемы

2. Руководство по применению