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

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

Один ответ в “Ethernet-контроллер W5300. MACRAW режим”

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

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