IPRAW — это передача данных с использованием уровня ниже, чем TCP и UDP. IPRAW поддерживает протоколы, такие как ICMP (0x01), IGMP (0x02), которые могут быть определены номером протокола (Sn_PROTOR). Как и в прошлый раз предупреждаю, здесь мы рассматриваем на примере произвольного пакета. Вы разумеется выбираете свой протокол.
Что нужно:
— WIZ830MJ;
— STM32F4-Discovery;
— Keil;
— Wireshark(+ WinPcap);
— Colasoft Packet Builder.
Таблица подключения WIZ830MJ к STM32F4-Discovery и часть адресов регистров были даны в статье Часть 3. Ethernet-контроллер W5300. Инициализация. Пинг
Дополнительные адреса регистров указаны в Часть 4. Ethernet-контроллер W5300. MACRAW режим
Инициализация STM32F4 и W5300
Процедуры инициализации STM32F4 (GPIO и TIM6) и инициализации W5300 (SHAR, GAR, SUBR, SIPR) были показаны в статье Часть 3. Ethernet-контроллер W5300. Инициализация. Пинг
Инициализация сокета
Начинаем, как обычно с открытия сокета. Я выбрал сокет 0, вы можете выбрать любой из 8 сокетов, который вам улыбнется.
Перед инициализацией сокета необходимо указать MAC-адрес и IP-адрес пункта назначения:
// MAC-адрес пункта назначения WriteReg (S0_DHAR, 0xD027); WriteReg (S0_DHAR2, 0x8885); WriteReg (S0_DHAR4, 0x4D1D); // IP-адрес пункта назначения WriteReg (S0_DIPR, 0xC0A8); WriteReg (S0_DIPR2, 0x460B);
Далее прописываем регистр S0_PROTOR в соответсвии с тем, какой протокол выбрали (ICMP – 0x01, IGMP – 0x02, TCP – 0x06, UDP – 0x11). И еще, номер протокола должен быть установлен до открытия сокета.
do // ///////////// Инициализация IPRAW сокета ////////////////////////////////////
{
WriteReg (S0_PROTOR, 0x0008) ; // номер протокола
WriteReg (S0_MR, 0x0003); // сокет в режиме IPRAW
WriteReg (S0_CR, OPEN); // открыть сокет
Dat=ReadReg (S0_SSR);
}
while ((Dat & 0x00FF)!=SOCK_IPRAW); // сокет 0 открыт в IPRAW режиме?
Передача
Сначала, прочитав регистр S0_TX_FSR2, проверяем наличие свободной памяти в памяти передатчика W5300. Открываем цикл записи данных. В регистры S0_TX_WRSR и S0_TX_WRSR2 записываем размер отправляемых данных. Внимание!!! Его необходимо указать в байтах. В регистр команд записываем команду SEND.
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;
}
Пакеты ловим на компе сниффером.

Прием
Принятый IP пакет согласно даташиту имеет вот такую структуру: 4 байта IP-адрес пунткта назначения и 2 байта- размер данных.

Для того чтобы принять пакет IPRAW мы следим за регистром S0_RX_RSR2, который сигнализирует нам о том, что данные приняты. Считываем 4 байта IP-адреса и размер данных в байтах, считаем сколько это будет в словах. Данные считываем в массив и отправляем команду RECV в регистр команд S0_CR.
while (1)
{
///////////////////// ПРИЕМ ////////////////////////////
if (ReadReg (S0_RX_RSR2)!=0x0000 ) //размер принятых данных отличен от нуля
{
Dat = ReadReg (S0_RX_FIFOR); // считываем IP адрес
Dat = ReadReg (S0_RX_FIFOR);
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);
}
i++; // счетчик пакетов
WriteReg (S0_CR, RECV); // приняли
}
}
Отправляем пакет вот такого вида с помощью Packet Builder. Для этого нажимаем на кнопочку Send.

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

В режиме отладки смотрим данные в 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
