MACRAW обеспечивает связь на основе Ethernet MAC. Режим MACRAW используется только в SOCKET0.
Должен сразу предупредить, я показываю на примере произвольного пакета. Что нужно:
— плата с W5300 (собственного изготовления или готовая, например WIZ830MJ, как у меня);
— управляющий модуль (у меня платка STM32F4-Discovery);
— среда разработки, дебагер, компилятор в зависимости от того, что вы выбрали в качестве управляющего модуля. (У меня — Keil. У них есть бесплатная вресия с ограничением по коду до 32 КБ. Лично мне этого более, чем достаточно. 🙂 );
— сниффер – программка, которая будет показывать нам пакеты в сети. Мне нравится WireShark. Кстати, во время установки WireShark попросит разрешения установить WinPcap. Соглашайтесь. Если WinPcap не попросится на установку, то вам придется его устанавливать отдельно;
— генератор пакетов. Я, пока, во всяком случае, пользуюсь Colasoft Packet Builder.
Define
Нам придется добавить еще некоторые адреса регистров. Привожу список для сокета 0:
#define S0_MR 0x0200 // регистр режима #define S0_CR 0x0202 // регистр команд #define S0_IMR 0x0204 // регистр маски прерываний сокета 0 #define S0_IR 0x0206 // регистр прерываний сокета 0192 #define S0_SSR 0x0208 // регистр статуса #define S0_DHAR 0x020C // MAC-адрес пункта назначения #define S0_DHAR2 0x020E #define S0_DHAR4 0x0210 #define S0_DIPR 0x0214 // IP-адрес пункта назначения #define S0_DIPR2 0x0216 #define S0_PROTOR 0x021A // номер протокола #define S0_TX_WRSR 0x0220 // размер отправляемых данных #define S0_TX_WRSR2 0x0222 #define S0_TX_FSR 0x0224 // свободная память передатчика #define S0_TX_FSR2 0x0226 #define S0_TX_FIFOR 0x022E //регистр доступа к памяти передатчика #define S0_RX_RSR 0x0228 //свободная память приемника #define S0_RX_RSR2 0x022A #define S0_RX_FIFOR 0x0230 //регистр доступа к памяти приемника
И еще неплохо заранее указать некоторые значения регистра состояний Sn_SSR, которые нам понадобятся:
#define SOCK_MACRAW 0x0042 #define SOCK_IPRAW 0x0032
А также размеры отправляемых пакетов:
#define SizeB 0x0050 // размер пакета, байт #define SizeW 0x0028 // размер пакета, слов
Инициализация STM32F4 и W5300
Процесс инициализации контроллера W5300 совсем не обязателен, просто порой удобно пингануть устройство. Но для приема и передачи MACRAW-пакетов это не нужно. А вот сигнал сброса – необходим. Поэтому так же, как и предыдущей части мы обязательно должны написать:
// подаем сигнал сброса на Wiznet GPIOB->ODR &= ~GPIO_ODR_ODR_11; delay_us((uint16_t) 0x0005); //сигнал сброса должен быть минимум 2us GPIOB->ODR |= GPIO_ODR_ODR_11; delay_us ((uint16_t) 0x00C8); //после сброса время от 50us до 10ms
Инициализация сокета
Начинаем, с открытия сокета. В регистр режима пишем 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.
do // ///////////// Инициализация MAC RAW сокета //////////////////////////////////// { WriteReg (S0_MR, 0x0004); // режим MACRAW WriteReg (S0_CR, OPEN); // открыть сокет 0 Dat=ReadReg(S0_SSR); } while ((Dat & 0x00FF) !=SOCK_MACRAW);//открыт ли сокет 0 в режиме MACRAW
Передача
Проверяем 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.
while (1) { ///////////////////// ПЕРЕДАЧА ///////////////////////// do Dat=ReadReg(S0_TX_FSR2); // проврека наличия свободной памяти while (Dat<SizeB); do // запись отправляемых данных { WriteReg (S0_TX_FIFOR, SendData); SendData++; } while (SendData < SizeW); WriteReg (S0_TX_WRSR, 0x0000); // размер отправляемых данных WriteReg (S0_TX_WRSR2, SizeB); // размер отправляемых данных WriteReg (S0_CR, SEND); // отправили delay_us(1000); // задержка между пакетами SendData = 0; }
Пакеты ловим на компе снифером.
Прием
Формат принимаемых данных в режиме MACRAW такой:
Считывая S0_RX_RSR2, узнаем, есть ли данные в памяти приемника. Первые два байта – размер данных в принятом пакете. После данных идут 4 байта CRC, их тоже необходимо считать, даже если они вам не нужны, а иначе следующий пакет неправильно считается.
while (1) { ///////////////////// ПРИЕМ //////////////////////////// if (ReadReg (S0_RX_RSR2)!=0x0000 ) { pack_size = ReadReg (S0_RX_FIFOR); // размер данных считали // определяем сколько раз считывать данные if ( (pack_size%2) == 0) {read_cnt = pack_size/2;} else {read_cnt = (pack_size+1)/2;} for (Cnt=0; Cnt<read_cnt; Cnt++) // SizeW чтение принятых { Rcv_data[Cnt]=ReadReg (S0_RX_FIFOR); } Dat = ReadReg (S0_RX_FIFOR); // считываем CRC Dat = ReadReg (S0_RX_FIFOR); i++; // счетчик пакетов WriteReg (S0_CR, RECV); // приняли } }
Отправляем пакет с помощью 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
Подскажите, а где можно посмотреть реальную схему, которую вы использовали, соединения платы WIZ830MJ с платой STM32F4-Discovery.