Ethernet-контроллер W5300. MACRAW режим

MACRAW обеспечивает связь на основе Ethernet MAC. Режим MACRAW используется только в SOCKET0.
Должен сразу предупредить, я показываю на примере произвольного пакета. Что нужно:
— плата с W5300 (собственного изготовления или готовая, например WIZ830MJ, как у меня);
— управляющий модуль (у меня платка STM32F4-Discovery);
— среда разработки, дебагер, компилятор в зависимости от того, что вы выбрали в качестве управляющего модуля. (У меня — Keil. У них есть бесплатная вресия с ограничением по коду до 32 КБ. Лично мне этого более, чем достаточно. 🙂 );
— сниффер – программка, которая будет показывать нам пакеты в сети. Мне нравится WireShark. Кстати, во время установки WireShark попросит разрешения установить WinPcap. Соглашайтесь. Если WinPcap не попросится на установку, то вам придется его устанавливать отдельно;
— генератор пакетов. Я, пока, во всяком случае, пользуюсь Colasoft Packet Builder.

Define

Нам придется добавить еще некоторые адреса регистров. Привожу список для сокета 0:

И еще неплохо заранее указать некоторые значения регистра состояний Sn_SSR, которые нам понадобятся:

А также размеры отправляемых пакетов:

Инициализация STM32F4 и W5300

Процесс инициализации контроллера W5300 совсем не обязателен, просто порой удобно пингануть устройство. Но для приема и передачи MACRAW-пакетов это не нужно. А вот сигнал сброса – необходим. Поэтому так же, как и предыдущей части мы обязательно должны написать:

Инициализация сокета

Начинаем, с открытия сокета. В регистр режима пишем MACRAW, подаем команду открыть. Прверяем, все ли выполнилось.
С помощью регистра Sn_MR (P3 – P0) мы выставляем режим:
MACRAW – 0x4;
IPRAW — 0x3;
UDP — 0x2.

Регистр команд Sn_CR.

Нам пока понадобятся команды:
OPEN – 0x01;
CLOSE – 0x10;
MACRAW – 0x20;
IPRAW – 0x40.
Регистр статуса Sn_SSR:

Вот некоторые значения, которые может принимать этот регистр:
SOCK_CLOSED – 0x00;
SOCK_UDP – 0x22;
SOCK_IPRAW – 0x32;
SOCK_MACRAW – 0x42.

Передача

Проверяем W5300 на наличие свободной памяти, записываем по 16 бит данные через регистр S0_TX_FIFOR. В регистры S0_TX_WRSR и S0_TX_WRSR2 записываем размер данных в байтах. Посылаем команду SEND, записав ее в регистр S0_CR.
Мы считываем только Sn_ S0_TX_FSR2, потому считывать S0_TX_FSR нужно только в случае 64 КБ памяти. А у нас по умолчанию 8 КБ = 8 192 бит = 10 0000 0000 0000.

Пакеты ловим на компе снифером.

Прием

Формат принимаемых данных в режиме MACRAW такой:

Считывая S0_RX_RSR2, узнаем, есть ли данные в памяти приемника. Первые два байта – размер данных в принятом пакете. После данных идут 4 байта CRC, их тоже необходимо считать, даже если они вам не нужны, а иначе следующий пакет неправильно считается.

Отправляем пакет с помощью Packet Builder:

В появившемся окошке выбираем LoopSending, количество – 50 раз, задержка – 100 мс.

В режиме отладки смотрим данные в Rcv_data. Сниффер показывает те же данные.

Список литературы:
1. High-Performance Internet Connectivity Solution W5300. Version 1.2.5. 2008
2. WIZ830MJ Datasheet (Ver. 1.3). 2008
3. Reference manual. STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs. 2011
4. User Manual. STM32F4DISCOVERY. STM32F4 high-performance discovery board. 2012

Прикрепленные файлы:
Архив с папкой проекта и пакетом для генератора пакетов
Исходник — main.c

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *