Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

W5500_client+Atmega8_для самых начинающих.

Пт июл 16, 2021 12:28:03

Здравствуйте уважаемые товарищи.
Прошу помощи в освоении, понимании работы (хотя бы на самом минимальном уровне) сетевого модуля W5500 в качестве клиента + Atmega8 для передачи на сервер некоторого числового значения (значений).
Все это с легкостью делается (делал) на arduino, но там уж слишком все универсально.
Google и Yandex пользоваться умею. Но попадались мне все чаще arduno_вские примеры, а там все на уровне использования функций. А хотелось бы ,так сказать, пощупать этот модуль изнутри, вложить в него только сАмое необходимое.
Из литературы прочитал Техническую спецификацию микросхемы W5500, но как реализовать инициализацию, проверку подключения к серверу, открытие_закрытие соединения ( и вообще как это все и многое другое и необходимое делается и в каком порядке ) я не знаю.
Одна надежда на сообщество любителей радио этого ресурса.
Мне 51 год. В моем окружении никто не интересуется ни программированием ни схемотехникой. Посоветоваться нескем, а желание освоить (пусть в минимальном размере) этот модуль есть большое.

SPI, UART изучил. Пишу в Atmel Studio_7 (мне удобно).
Вот такое длинное повествование.
Думаю для начинающих тема будет тоже полезна и интересна.
С уважением Константин.

Re: W5500_client+Atmega8_для самых начинающих.

Пт июл 16, 2021 12:46:26

На канале narodstream всё рассказывается до мелочей.

Re: W5500_client+Atmega8_для самых начинающих.

Пт июл 16, 2021 17:47:33

Во-первых для передачи на сервер некоторого числового значения (значений) никакие адаптеры не нужны.
Atmega8 может сама передавать на сервер числовые значения.
Всё это делали в прошлой теме.
https://www.radiokot.ru/forum/viewtopic ... start=1529
Вообще это отдельная большая интересная тема. Когда доделаем надо будет написать по этой теме статью))
:tea:

Разобраться с W5500 не сложно.
W5500_client+Atmega8 - такое уже делали.
Потом все переделали на W5500_server)) https://www.radiokot.ru/forum/viewtopic ... &start=452
Просто W5500_client оказался никому не нужен))
Собственно вся работа с W5500 сводится к записи чтению регистров (согласно даташиту).

План такой:
Берём Atmega8.
Припаиваем к Atmega8 модуль W5500 по SPI.
Открываем даташит. Читаем описание регистров.
Пишем программу например на Си в Atmel Studio или в CodeVisionAVR (кому как удобно).
Прошиваем Atmega8 любым программатором.
Смотрим в анализаторе трафика (например Wireshark) как бегают пакеты.
Всё))
:tea:
понимании работы (хотя бы на самом минимальном уровне) сетевого модуля W5500

Разберём подробно))
как реализовать инициализацию, проверку подключения к серверу, открытие_закрытие соединения ( и вообще как это все и многое другое и необходимое делается и в каком порядке ) я не знаю.

Очень просто))
Подключаем W5500 к Atmega8 согласно схеме.
SPI.jpg
(38.01 KiB) Скачиваний: 371

Далее инициализация W5500.
Для инициализации W5500 нам надо прописать регистры.
По SPI передаём пакеты байтов.
Формат пакета - адрес, контрольный байт (режим чтения/записи, формат), байты данных.
W5500 поддерживает несколько форматов чтения/записи. Формат определяет контрольный байт.
формат SPI.jpg
(44.17 KiB) Скачиваний: 361

Выбираем формат переменной длины.
формат SPI переменной длины.jpg
(15.01 KiB) Скачиваний: 290

Далее W5500 состоит из двух частей - физический уровень (PHY) и логический уровень (процессор, память, регистры и т.д.).
W5500.jpg
(42.41 KiB) Скачиваний: 313

Настраиваем физический уровень W5500.

Пример кода программы:

//Сначала делаем общий сброс (RESET) W5500.
PORTB.7=0; //
delay_ms(100); //
PORTB.7=1; //
delay_ms(100); //

//Потом настраиваем PHY.
/////////////////////////////////////////////// сброс PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500

/////////////////////////////////////////////// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500

/////////////////////////////////////////////// читаем статус PHY: (это по желанию)
//PORTB.6=0; // SS W5500
//tx2=0x00; SPI2(); tx2=0x2E; SPI2(); tx2=0x00; SPI2(); // Address + Control Registers
//tx2=0x00; SPI2(); x1 = rx2; // Data
//tx2=0x00; SPI2(); x2 = rx2; // Data
//PORTB.6=1; // SS W5500

// При чтении регистра PHY (адрес 0x2E) ответ будет -0xCD00
// Значит W5500 подключился к роутеру или компу по сетевому проводу.
// загорелся жёлтый светодиод.
// зелёный светодиод мигает только в момент приёма и отправки пакетов.
1.jpg
(32.86 KiB) Скачиваний: 338

// Линк поднялся.

Далее настраиваем логический уровень W5500.
Память W5500 состоит из блоков. Главный регистр управления W5500 и 8 штук сокетов.
Размер блоков можно менять но нам это не нужно))
память.jpg
(76.58 KiB) Скачиваний: 301

Находим главный регистр управления W5500 (блок номер 0)
память_1.jpg
(72.49 KiB) Скачиваний: 300

Вот он подробно расписан
контрольный регистр.jpg
(73.52 KiB) Скачиваний: 340

записываем в него шлюз, маску, IP, MAC:

PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x04; SPI(); // Address + Control Registers
// -шлюз
tx=192; SPI(); // Gateway Address (GAR0) (0x0001 - Address)
tx=168; SPI(); // Gateway Address (GAR1) (0x0002 - Address)
tx=0; SPI(); // Gateway Address (GAR2) (0x0003 - Address)
tx=1; SPI(); // Gateway Address (GAR3) (0x0004 - Address)
// -маска
tx=255; SPI(); // Subnet Mask Address (SUBR0) (0x0005 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR1) (0x0006 - Address)
tx=255; SPI(); // Subnet Mask Address (SUBR2) (0x0007 - Address)
tx=0; SPI(); // Subnet Mask Address (SUBR3) (0x0008 - Address)
// -MAC (Wiznet_01:02:03)
tx=0x00; SPI(); // Source Hardware Address (SHAR0) (0x0009 - Address)
tx=0x08; SPI(); // Source Hardware Address (SHAR1) (0x000A - Address)
tx=0xDC; SPI(); // Source Hardware Address (SHAR2) (0x000B - Address)
tx=0x01; SPI(); // Source Hardware Address (SHAR3) (0x000C - Address)
tx=0x02; SPI(); // Source Hardware Address (SHAR4) (0x000D - Address)
tx=0x03; SPI(); // Source Hardware Address (SHAR5) (0x000E - Address)
// -IP
tx=192; SPI(); // Source IP Address (SIPR0) (0x000F - Address)
tx=168; SPI(); // Source IP Address (SIPR1) (0x0010 - Address)
tx=0; SPI(); // Source IP Address (SIPR2) (0x0011 - Address)
tx=3; SPI(); // Source IP Address (SIPR3) (0x0012 - Address)
PORTB.6=1; // SS W5500

// W5500 на пинг отвечает.
PING.jpg
(80.8 KiB) Скачиваний: 313

:tea:

Добавлено after 8 minutes 31 second:
Далее открываем сокет.
Например откроем сокет номер 2.
Для этого надо прописать регистр сокета номер 2.
Регистр сокета номер 2 находится в блоке 0x09.
память_2.jpg
(73.25 KiB) Скачиваний: 299

Вот он подробно расписан
регистр сокета.jpg
(77.15 KiB) Скачиваний: 300

записываем в него протокол TCP и порт (например стандартный порт для браузера 80):

// Протокол: пишем протокол TCP Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x00; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x01; SPI(); // Data -0x01 (protocol TCP).
PORTB.6=1; // SS W5500
// Порт: пишем Socket_2 Source Port:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x04; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00 (порт 00)
tx=0x50; SPI(); // Data -0x50 (порт 80)
PORTB.6=1; // SS W5500

//Далее надо открыть сокет номер 2.
//Работать с сокетами надо с помощью команд.
//Для этого пишем команду OPEN сокет номер 2.

// пишем команду OPEN Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x01; SPI(); // Data -0x01 (OPEN)
PORTB.6=1; // SS W5500

//Далее, если у нас W5500_strver, то надо переключить сокет номер 2 в режим прослушивания.
//Для этого пишем команду LISTEN сокет номер 2.

// пишем команду LISTEN Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x02; SPI(); // Data -0x02 (LISTEN)
PORTB.6=1; // SS W5500

//Все команды есть в даташите.
открывает сокет.jpg
(77.71 KiB) Скачиваний: 311

//Далее сидим и ждём пока к нашему W5500_strver кто-то подключится..... например браузер ))

Socket_2_LISTEN:
/////////////////////////////////////////////////////////////////////////////////////////////
// читаем статус Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -0x14 (SOCK_LISTEN)
PORTB.6=1; // SS W5500
///////////////////////////////////////////////////////// Socket_2_LISTEN: (Ждём SYN):
//Статус сокета:))
//0x14-LISTEN, 0x16-SYN, 0x17-ESTABLISHED, 0x11-DISCON,
//0x1C-CLOSE_WAIT, 0x18-FIN_WAIT, 0x00-FIN/ACK.
if (x1 != 0x14) goto Socket_2_ESTABLISHED; // > Socket_2_ESTABLISHED
goto Socket_2_LISTEN; // > Socket_2_LISTEN
/////////////////////////////////////////////////////////////////////////////////////////////

// Когда сокет изменит свой статус на 0x17-ESTABLISHED, значит к нашему W5500_strver кто-то подключился)).
// Тут осторожней... Тут бывают ещё разные ошибки подключения и т .д.
// Если подключение прошло успешно (Т.е. W5500 получил пакет SYN от браузера, отправил пакет SYN ACK браузеру и получил ACK от браузера) статус сокета номер 2 изменится на 0x17-ESTABLISHED.
// Если всё нормально, то далее переходим в режим приёма/отправки пакетов - ESTABLISHED:

Socket_2_ESTABLISHED:
delay_ms(1);
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем размер принятых данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x26; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных
PORTB.6=1; // SS W5500
//////////////////////////////////////////////////////////// таймаут FIFO_RX Socket_2:
tm_SOCKET++;
if (tm_SOCKET > 1000) { // цикл - 1c ждём Data
goto Socket_2_DISCON; // FIFO_RX пуст > Socket_2_DISCON
//goto TX_Socket_2; // > TX, FIN
};
/////////////////////////////////////////////////////////////////////////////////////////////
// проверка FIFO_RX:
len = x1; len = (len<<8)|x2; // размер принятых данных // 0x0000
if (len == 0x00) goto Socket_2_ESTABLISHED; // FIFO_RX пуст > ждём Data

//RX_Socket_2:
///////////////////////////////////////////////////////////////////////////////////////////// приём пакета:
// Читаем начальный адрес принятых данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RD0 -начальный адрес принятых данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных
PORTB.6=1; // SS W5500
// начальный адрес принятых данных Socket_2:
add = x1; add = (add<<8)|x2; // 0x0000

/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем данные с начального адреса Socket_2:
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x58; SPI(); // Address + Control Registers


////////////////////////////////////////// Data RX W5500:
for (x=0; x<8; x++) {
tx=0; SPI(); bufer_RX_W5500[x] = rx;
};


PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель RX Socket_2 до увеличенного значения:
add = add + len; //add - начальный адрес принятых данных // 0x0000
//len - размер принятых данных // 0x0000
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x28; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_RX_RD0 -конечный адрес принятых данных
tx=x2; SPI(); // Data -Sn_RX_RD1 -конечный адрес принятых данных
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду завершение приема Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x40; SPI(); // Data -0x40 (RECV)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////


//Приём закончен.
//Пакет в буфере bufer_RX_W5500[x] Atmega8 ))

//Дальше надо что-то ответить тому кто к нам подключился... а то не удобно... Кто-то (браузер) ждёт от нас ответа))
//Передача пакета браузеру:

//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных
PORTB.6=1; // SS W5500
// начальный адрес для записи данных:
add = x1; add = (add<<8)|x2; // 0x0000
/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;
// Пишем данные Socket_2 с начального адреса:
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

// сброс len
len = 0; // 0x0000


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
////////////////////////////////////////// GET /1 HTTP/1.1
if (bufer_RX_W5500[5] == '1') {
////////////////////////////////////////// Data TX W5500:
for (x=0; x<30 ; x++) {
//////////////////////////////////////// перенос строка \r\n
tx='<'; SPI(); len++;
tx='b'; SPI(); len++;
tx='r'; SPI(); len++;
tx='>'; SPI(); len++;
//////////////////////////////////////// счёт x > HEX > DEC > 000
bi = x;
z=0; while (bi>99) {z++; bi=bi-100;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi>9) {z++; bi=bi-10;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi) {z++; bi=bi-1;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
//////////////////////////////////////// пробел
tx=' '; SPI(); len++;
//////////////////////////////////////// RX_int[x] > HEX > DEC > 000
bi = RX_int[x];
z=0; while (bi>99) {z++; bi=bi-100;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi>9) {z++; bi=bi-10;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
z=0; while (bi) {z++; bi=bi-1;}; // LED(z+48);
tx=z+48; SPI(); len++; // HEX
/////////////////////////////////////////
};
};
/////////////////////////////////////////// Data END



PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len; // add - конечный адрес переданных данных // 0x0000
// len - размер переданных данных // 0x0000
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.


//Далее, если передавать ничего не будем, то закрываем соединение с браузером.
//Передаем пакет FIN браузеру:

Socket_2_DISCON:
/////////////////////////////////////////////////////////////////////////////////////////////
// передаем FIN:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x08; SPI(); // Data -0x08 (DISCON)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
tm_SOCKET = 0; // сброс таймаут Socket_2 (FIN)

//Ждём подтверждения (пакет FIN/ACK) от браузера:

Socket_2_FIN:
/////////////////////////////////////////////////////////////////////////////////////////////
// читаем статус Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -0x00 (FIN/ACK получен)
PORTB.6=1; // SS W5500
///////////////////////////////////////////////////////////////////////////////// DISCON:
// Статус сокета -0x18 SOCK_FIN_WAIT -сокет закрывается > -0x00 FIN/ACK получен
if (x1 == 0x00) goto Socket_2_CLOSE;// FIN/ACK получен > Socket_2_CLOSE
////////////////////////////////////////////// таймаут SOCKET_1_DISCON:
tm_SOCKET++; // таймаут Socket_2 (FIN)
if (tm_SOCKET > 1000) { // цикл - 1c ждём FIN/ACK
goto Socket_2_CLOSE; // нет FIN/ACK > Socket_2_CLOSE
};
/////////////////////////////////////////////////////////////////////////////////////////////
delay_ms(1);
goto Socket_2_FIN; // > Socket_2_FIN (Ждём FIN/ACK)


// Далее... по желанию. Можно закрыть сокет номер 2.
// А можно не закрывать.
// Допустим Закрываем сокет:

Socket_2_CLOSE:
tm_SOCKET = 0; // сброс таймаут SOCKET (FIN)
/////////////////////////////////////////////////////////////////////////////////////////////
// закрываем Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x10; SPI(); // Data -0x10 (CLOSE)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////


// Далее... по желанию. Можно опять открыть сокет номер 2.
goto Socket_2_OPEN; // > Socket_2_OPEN


А если у нас W5500_client, то надо переключить сокет номер 2 в режим подключения к серверу - команда CONNECT .
Просто в начале добавить в программу команду CONNECT.
В этом случае W5500_client сам отправит пакет SYN серверу и будет ждать пакет SYN/ACK и после отправит ACK - т.е. сам установит с сервером соединение.
конект.jpg
(74.29 KiB) Скачиваний: 287

Затем сокет номер 2 перейдёт в режим ESTABLISHED.
Остальное всё тоже самое ))

Кратко вот.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 01:33:17

roman.com спасибо огромное за развернутый ответ.
Просто удивляюсь - когда Вы время находите на всю эту работу (разъяснить, написать).
Сегодня буду по "косточкам" разбирать Ваш ответ, благо свободного времени достаточно.

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 09:57:42

В XXI веке (век Интернета, IT и IoT) нужно разбираться в сетевых технологиях во всех подробностях))
На это времени не жалко.))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 10:24:30

roma.com приветствую Вас.

Вопрос:
//Сначала делаем общий сброс (RESET) W5500.
PORTB.7=0;
Перезагружаем W5500 микроконтроллером через RST модуля ?

И еще:
tx=0x00; SPI();
Тут мы передаем значение 0x00 (и другие тоже) в W5500 через SPI функцией SPI(tx); ?

Добавлено after 4 minutes 29 seconds:
В XXI веке (век Интернета, IT и IoT) нужно разбираться в сетевых технологиях во всех подробностях))
На это времени не жалко.))
:tea:

Буду грызть этот гранит.

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 10:52:30

Начинаем всё с начала))

0- Первым делом берём Atmega8 + W5500 и рисуем схему. Что куда и как подключать будем.
Сейчас разрабатываю сервер Умного Дома. У меня W5500 подключена к Atmega328Р по такой схеме -
Screenshot_1.jpg
(95.81 KiB) Скачиваний: 325

У Вас будет своя схема.

1- Когда всё подключили (спаяли) пишем программу.

//Заголовок программы:
/////////////////////////////////////////////////////////////////////////////////////////////
// ATmega8:
// RC - 8 МHz; фьюзы: Low E4; Higt D9;
// начальное: RC - 1 МHz; фьюзы: Low E1; Higt D9;
// кварц - 8 МHz; фьюзы: Low EF; Higt C9 (CKOPT -on);
// кварц - 8 МHz; фьюзы: Low EF; Higt D9 (CKOPT -off);
/////////////////////////////////////////////////////////////////////////////////////////////
// W5500:
// 3,3 V - 70 mA. - кабель отключен
// 3,3 V - 80 mA. - 10 МБит/c
// 3,3 V - 135 mA. - 100 МБит/c
// Socket_0 - MACRAW
// Socket_1 - UDP
// Socket_2 - TCP
/////////////////////////////////////////////////////////////////////////////////////////////

//Программа:
#include <mega8.h>
#include <delay.h>
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////// переменные:
unsigned char x; // x - счёт
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////// функция SPI:
unsigned char tx; // tx - SPI
unsigned char rx; // rx - SPI
/////////////////////////////////////////////// SPI:
void SPI(void)
{
SPDR=tx; while(!(SPSR & (1<<7))); rx=SPDR;
}
/////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////// переменные W5500:
unsigned int add; // add - адрес данных W5500 (RX/TX)
unsigned int len; // len - длина данных W5500 (RX/TX)
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////// Socket_2 - TCP:
unsigned int tm_SOCKET; // таймаут SOCKET.
/////////////////////////////////////////////// Data RX W5500:
//GET / HTTP/1.1
unsigned char bufer_RX_W5500[8]={
0,0,0,0,0,0,0,0
};
/////////////////////////////////////////////// Data TX W5500 HTTP:
//GET / HTTP/1.1
unsigned char bufer_TX_W5500_HTTP[]={
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>|"
};
/////////////////////////////////////////////// Data TX W5500 HTML:
//<html>
//<body>
// ...
//</body>
//</html>
/////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
/////////////////////////////////////////////// Настройка выводов SPI
DDRB.5=1; // выход SCK
PORTB.5=0; // выход SCK
DDRB.4=0; // вход MISO
PORTB.4=0; // вход MISO
DDRB.3=1; // выход MOSI
PORTB.3=0; // выход MOSI
/////////////////////////////////////////////// Настройка выводов W5500
DDRB.6=1; // выход SS W5500
PORTB.6=1; // выход SS W5500
DDRB.7=1; // выход RESET W5500
PORTB.7=1; // выход RESET W5500
/////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////// Настройка блока SPI:
SPCR=0x50; // 8 МГц/4 = 2 МГц -режим мастер

/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////// инициализация W5500:
// 00000000 - Address (автоматическая инкрементная адресация +1).
// 00000000 - Address (автоматическая инкрементная адресация +1).
///////////////////////////////////////////////
// Control Registers:
// 0000 0... - BSB [4:0] блок
// .... .0.. - R/W - 0 чтение/1 запись
// .... ..00 - OP Mode (VDM)- данные переменной длины (Длина данных контролируется SS).
/////////////////////////////////////////////// RESET W5500:
PORTB.7=0; //
delay_ms(100); //
PORTB.7=1; //
delay_ms(100); //

...
...
...

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 11:01:46

Понял. Спасибо большое!

Re: W5500_client+Atmega8_для самых начинающих.

Сб июл 17, 2021 20:43:14

И что там за сервер такой... и что передавать будем ? )) Да ещё по HTTP... без шифрования HTTPS ))

Re: W5500_client+Atmega8_для самых начинающих.

Вс июл 18, 2021 09:56:26

Самый простой, классический web_термометр. http://www.pogoda19.ru
Это сделано на arduino, так как в свое время, начиная изучать по урокам с narodstream.ru
я не смог запустить модуль 28j60, почему я ток и не понял.
А на arduino + w5500 + 2 шт. ds18b20 все прошло на отлично. Так вот сейчас изучение пытаюсь начать с начала, и с другого конца.
Для чего web_термометр? Первопричина - природная лень. Свой дом. По утрам не хочется идти к окну и смотреть на градусник. В своем доме в отопительный сезон ( в Приморском крае он 6 месяцев) каждый градус тепла имеет значение. Ну и жене и детям (которые работают до позна), тоже удобно. Посмотрели вечером на работе какая температура дома и уже веселей. Как то так.
Спасибо большое roma.com, что помогаешь мне.

Добавлено after 2 hours 18 minutes 46 seconds:
/////////////////////////////////////////////// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500

У меня вопрос. Судя по отправленным данным 0xC8 + 0x00 не получается конфигурация режима PHY которая написана Вами в комментарии(11001101).

Добавлено after 2 hours 56 minutes 28 seconds:
//загорелся жёлтый светодиод

Загорелся желтый светодиод. :))
По ходу "разбора" Вашего кода,roma.com, немного освоился в datashet_е.

Хотя поторопился я.
Я все стер с мк, а желтый светодиод все равно загорается.

Добавлено after 2 hours 10 minutes 32 seconds:
В общем вот что за сегодня удалось сделать.
- Сделал общий сброс модуля.
- Программный сброс фреймом SPI :0x00 0x2E 0x04 0x00 0x00
- Настройка PHY: 0x00 0x2E 0x04 0xCD 0x00
Светодиод желтый загорается. Если модули отключить от питания (при включенном мк), а затем включить, то светодиод моргает, но не загорается. При полной перезагрузке (через reset) мк, желтый светодиод загорается.

И еще: как проверить статус PHY? Возвращаемое значение чего должно отобразится?

Re: W5500_client+Atmega8_для самых начинающих.

Вс июл 18, 2021 11:30:05

kondeg писал(а):не получается конфигурация режима PHY

регистр PHY.
Screenshot_1.jpg
(78.57 KiB) Скачиваний: 255



//Потом настраиваем регистр PHY.
/////////////////////////////////////////////// сброс PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500


- Настройка PHY:
- Пишем в регистр PHY - 0x00 0x2E 0x04 0xC8 0x00

/////////////////////////////////////////////// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500


-Через пол секунды загорелся жёлтый светодиод.
-А статус регистра регистр PHY изменился на 0xCD 0x00.

/////////////////////////////////////////////// читаем статус PHY:
PORTB.6=0; // SS W5500
tx2=0x00; SPI2(); tx2=0x2E; SPI2(); tx2=0x00; SPI2(); // Address + Control Registers
tx2=0x00; SPI2(); x1 = rx2; // Data
tx2=0x00; SPI2(); x2 = rx2; // Data
PORTB.6=1; // SS W5500

-При чтении статуса регистра PHY получаем 0xCD 0x00.
-Значит W5500 подключился к роутеру или компу по сетевому проводу.
-Значит Link работает // .... ...1 Link Status
:tea:
Вообще читать статус регистра PHY - это по желанию.
Это просто для контроля Link.
Можно не заморачиваться с чтением статуса регистра PHY.
В реальности оно нафиг не нужно))

-Если отключить сетевой кабель от W5500 то жёлтый светодиод погаснет.
-А статус регистра регистр PHY изменился на... не помню))

-Если обратно подключить сетевой кабель к W5500 то через пол секунды жёлтый светодиод загорится.
-А статус регистра регистр PHY изменился на 0xCD 0x00.

Таким образом, читая читая статус PHY мы можем контролировать Link.
В реальности оно нафиг не нужно))
Последний раз редактировалось roman.com Вс июл 18, 2021 11:37:19, всего редактировалось 1 раз.

Re: W5500_client+Atmega8_для самых начинающих.

Вс июл 18, 2021 11:39:07

Проверил.
По началу выдавало значение 0xCC, т.е отсутствовало значение 1 в статусе подключения. Увеличил задержку между чтением и выводом значения в UART (пока не загорится желтый светодиод) и все считалось хорошо , т.е. 0xCD.
Сегодня как то так.
Завтра продолжу.

Добавлено after 4 minutes 45 seconds:
kondeg писал(а):не получается конфигурация режима PHY

регистр PHY.
Screenshot_1.jpg



//Потом настраиваем регистр PHY.
/////////////////////////////////////////////// сброс PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500


- Настройка PHY: Пишем в регистр PHY - 0x00 0x2E 0x04 0xC8 0x00

/////////////////////////////////////////////// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500


-Через пол секунды загорелся жёлтый светодиод.
-А статус регистра регистр PHY изменился на 0xCD 0x00.

/////////////////////////////////////////////// читаем статус PHY:
PORTB.6=0; // SS W5500
tx2=0x00; SPI2(); tx2=0x2E; SPI2(); tx2=0x00; SPI2(); // Address + Control Registers
tx2=0x00; SPI2(); x1 = rx2; // Data
tx2=0x00; SPI2(); x2 = rx2; // Data
PORTB.6=1; // SS W5500

-При чтении статуса регистра PHY получаем 0xCD 0x00.
-Значит W5500 подключился к роутеру или компу по сетевому проводу.
-Значит Link работает // .... ...1 Link Status
:tea:
Вообще читать статус регистра PHY - это по желанию.
Это просто для контроля Link.
Можно не заморачиваться с чтением статуса регистра PHY.
В реальности оно нафиг не нужно))


Да. Все так и получилось. Просто повнимательней мне нужно быть. Еще раз спасибо.
roman.com хотелось бы к Вам по имени обращаться ( если можно конечно).
Мое имя Константин.
Мы все таки люди :))

Re: W5500_client+Atmega8_для самых начинающих.

Вс июл 18, 2021 13:35:44

Всё можно. )) Мое имя Роман. Как не трудно догадаться из ника roman.com ))
roman.com писал(а):Таким образом, читая читая статус PHY мы можем контролировать Link.

Добавлял в программу чтение статуса регистра PHY для удалённого контроля Link.

...
...
...
//Далее сидим и ждём пока к нашему W5500_server кто-то подключится..... например браузер ))
//И одновременно контролируем Link.

Socket_2_LISTEN:
/////////////////////////////////////////////// читаем статус PHY:
PORTB.6=0; // SS W5500
tx2=0x00; SPI2(); tx2=0x2E; SPI2(); tx2=0x00; SPI2(); // Address + Control Registers
tx2=0x00; SPI2(); x1 = rx2; // Data
tx2=0x00; SPI2(); x2 = rx2; // Data
PORTB.6=1; // SS W5500
/////////////////////////////////////////////// проверяем Link:
if (x1 != 0xCD) Beep(); // Пропал Link > подаём звуковой сигнал.

/////////////////////////////////////////////////////////////////////////////////////////////
// читаем статус Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -0x14 (SOCK_LISTEN)
PORTB.6=1; // SS W5500
///////////////////////////////////////////////////////// Socket_2_LISTEN: (Ждём SYN):
//Статус сокета:))
//0x14-LISTEN, 0x16-SYN, 0x17-ESTABLISHED, 0x11-DISCON,
//0x1C-CLOSE_WAIT, 0x18-FIN_WAIT, 0x00-FIN/ACK.
if (x1 != 0x14) goto Socket_2_ESTABLISHED; // > Socket_2_ESTABLISHED
goto Socket_2_LISTEN; // > Socket_2_LISTEN
/////////////////////////////////////////////////////////////////////////////////////////////
...
...
...
В реальности оно нафиг не нужно)) Есть протокол ICMP (PING, tracert, и т.д.)
:tea:

Добавлено after 16 minutes 40 seconds:
Если модули отключить от питания (при включенном мк), а затем включить, то светодиод моргает, но не загорается.

При отключении питания W5500 все регистры сбрасываются к заводским настройкам.
Придётся всё прописывать заново))
Точно так же как во всех радио модулях и других шилдах для Ардуино...))
:tea:

Добавлено after 17 minutes 44 seconds:
Советы для начинающих))
Как писал выше W5500 состоит из двух частей - физический уровень (PHY) и логический уровень (процессор, память, регистры и т.д.).
W5500.jpg
(42.41 KiB) Скачиваний: 220

Как проверить работает ли физический уровень (PHY) ? Очень просто - с помощью тестера ! ))
- Потребляемый ток физический уровень (PHY) = 30 mA.
- Потребляемый ток логический уровень (процессор, память, регистры и т.д.) = 50 mA.
- Общий потребляемый ток = 80 mA.
W5500.jpg
(48.89 KiB) Скачиваний: 223


//Потом настраиваем регистр PHY.
/////////////////////////////////////////////// сброс PHY:
// перед настройкой PHY сделать программный Cброс PHY:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0x00; SPI(); // Data -0x00
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500 сбрасываем

- Когда сбрасываем регистр PHY, то физический уровень (PHY) отключается.
- Общий потребляемый ток = 50 mA.

/////////////////////////////////////////////// пишем режим PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address + Control Registers
tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex)
tx=0x00; SPI(); // Data -0x00
PORTB.6=1; // SS W5500

- Когда пишем регистр PHY, то физический уровень (PHY) включается.
- Общий потребляемый ток = 80 mA.
:tea:

Добавлено after 38 minutes 1 second:
kondeg писал(а):классический web_термометр. http://www.pogoda19.ru

kondeg писал(а):Для чего web_термометр

Это я так понял сторонний платный сайт...
Зарегистрирован за reg.ru - https://www.reg.ru/domain/new/
А не лучше в своём доме поставить свой сервер на W5500_server+Atmega8 ?))
Бесплатно))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Пн июл 19, 2021 09:30:07

У меня вопрос. Судя по отправленным данным 0xC8 + 0x00 не получается конфигурация режима PHY которая написана Вами в комментарии(11001101).

Хочу поправить самого себя. Код конфигурирования 0xC8 верен. Первые три младших регистра это статусные (информационные), т.е. мы их не включаем в настройку.

Это я так понял сторонний платный сайт...
Зарегистрирован за reg.ru - https://www.reg.ru/domain/new/
А не лучше в своём доме поставить свой сервер на W5500_server+Atmega8 ?))
Бесплатно))

Можно было бы. Думаю, что так даже лучше, надежней и менее затратно, да и настоящий серверок можно прикрутить дома в локалке (несколько системных блоков и ноут пылятся дома без дела).
А на счет глобальной сети...
Тут, Рома, вот какое дело. Как бы это по сжатее объяснить...
Часто в "секретном" месте, о котором знает вся семья, в сарае на гвоздике висит ключ от дома. И что бы с тобой не произошло, сколько бы лет ты не был дома, возвратившись однажды в родной дом, ты найдешь этот запасной ключ на том же месте. Может и родителей уже в живых не будет, а ключ (как якорь) будет тебя удерживать, ждать.
Вот так же и с этим сайтом. Младший сын через месяц заканчивает Морской ГосУниверситет г. Владивостока - электромеханик. Обязательно уйдет на год, а то и более в море. Так вот что бы не произошло, шторма, рабочие перипетии, невзгоды, этот web_термометр будет ему как тот запасной ключик на гвоздике. Посмотрел: -на улице холодно, а дома тепло. Значит ДОМА все хорошо, мама и папа в тепле, тогда и со мной в море будет все хорошо....
Вот как то так.
Может быть еще что нибудь добавлю на страничку термометра (ну скажем доброе пожелание сыну), не суть важно. Важно что невидимая связь с домом будет.
p.s. телеги и вацапы не в счет :))

Добавлено after 6 hours 29 minutes 45 seconds:
Благодаря Роману (roman.com), не теряя бодрости духа продолжил изучение W5500
// W5500 на пинг отвечает.


Пингуется :))

Это мой код.
Код:
void Setting_Logik_Level(void)
{
   PORTB &= ~(1<<PB2);
SPI(0x00); SPI(0x01); SPI(0x04); //команда+регистр

//-шлюз
SPI(192); SPI(168); SPI(0); SPI(1);

//-маска
SPI(255); SPI(255); SPI(255); SPI(0);

//-MAC
SPI(0xDE); SPI(0xAD); SPI(0xBE); SPI(0xFE); SPI(0xFE); SPI(0xED);

//-IP
SPI(192); SPI(168); SPI(0); SPI(200);
   PORTB |=(1<<PB2);
   
}


Добавлено after 3 minutes 49 seconds:
И зеленый светодиод загорается. Пакеты принимает.

Re: W5500_client+Atmega8_для самых начинающих.

Пн июл 19, 2021 10:35:35

Первые три младших регистра это статусные (информационные), т.е. мы их не включаем в настройку.

Модуль W5500 состоит из регистров.
А регистры, в свою очередь, состоят из битов.
Поэтому правильней говорить - три бита статуса регистра PHY.
/////////////////////////////////////////////// регистр PHY:
// 1... .... RST - 1.
// .1.. .... программная настройка режима - 1
// ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
, где последние три бита
// .... .1.. Duplex Status
// .... ..0. Speed Status
// .... ...1 Link Status
это биты статуса регистра PHY.
:tea:
kondeg писал(а):настоящий серверок можно прикрутить дома в локалке (несколько системных блоков и ноут пылятся дома без дела).

Зачем ноут ?
Свой домашний сервер делается из W5500+Atmega8.
Больше ничего не нужно))
kondeg писал(а):А на счет глобальной сети...

А чтобы родственники могли подключаться к своему домашнему серверу нужно иметь дома белый IP-адрес.
Больше ничего не нужно))
:tea:
Кроме погоды в доме, свой домашний сервер может всем родственникам передавать приветики и последние новости из дома)) Типа "лента новостей из дома"))
Через свой домашний сервер можно отправлять родственникам любые сообщения и т.д..
Таким образом свой домашний сервер может дополнить (или вообще полностью заменить) телеги и вацапы и т.д.))
Будет свой домашний семейный чат))
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вт июл 20, 2021 07:27:43

/////////////////////////////////////////////////////////////////////////////////////////////
// читаем статус Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -0x14 (SOCK_LISTEN)
PORTB.6=1; // SS W5500
///////////////////////////////////////////////////////// Socket_2_LISTEN: (Ждём SYN)


Да. Статусы меняются.
До отправки запроса через браузер, статус 0x14 т.е. режим server
Как только отправлен SYN c браузера, статус меняется на 0x17

Хотелось бы ,для таких же новичков как и я, формируемые команды читать немного по другому, думаю так на первоначальном этапе будет понятней. Например команда конфигурации режима TCP:

0x00 0x00 0x4C 0x01
|__2____| |_1_| |_3_|
Читаем ее в порядке нумерации:

1 - выбираем регистр сокета_2(стр.15/66), функция записи, данные переменной длинны.
2 - в блоке регистра сокета (стр.30.66) командой 0x00 0x00 выбираем режим сокета (регистр SnMR -(стр.44/66)
3 - и уже передаваемыми данными (0x01 - 00000001) конфигурируем этот регистр(стр. 45/66)

Re: W5500_client+Atmega8_для самых начинающих.

Вт июл 20, 2021 10:52:44

Да как угодно)) Мне удобней писать как в даташите. Чтоб не путаться...
0x00 0x00 0x4C 0x01
|___1___| |_2_| |_3_|
Читаем ее в порядке нумерации:

1 - в блоке регистра сокета (стр.30.66) адрес 0x00 0x00 выбираем режим сокета (регистр SnMR - режим сокета - TCP(стр.44/66)
2 - выбираем регистр сокета_2(стр.15/66), флаг записи, данные переменной длинны.
3 - и уже передаваемыми данными (0x01 - 00000001 - команда сокету) конфигурируем этот регистр(стр. 45/66)

Добавлено after 10 minutes 8 seconds:
До отправки запроса через браузер, статус 0x14 т.е. режим server
Как только отправлен SYN c браузера, статус меняется на 0x17

Это не режим сервера. Это просто разные статусы сокета.
0x14 - это статус сокета LISTEN - сокет в режиме прослушивания.
0x17 - это статус сокета ESTABLISHED - сокет в режиме приёма/передачи пакетов.
И далее по списку...
0x16 - это статус сокета SYN - сокет получил пакет SYN.
0x11 - это статус сокета DISCON - сокет получил пакет FIN.
0x1C - это статус сокета CLOSE_WAIT - сокет в режиме FIN.
0x18 - это статус сокета FIN_WAIT - сокет в режиме закрытия соединения.
0x00 - это статус сокета FIN/ACK - сокет закрыл соединение.
И т.д.
:tea:
Вся программа - это отправляем команды сокету и читаем статус сокета.
Далее, в зависимости от того что мы хотим W5500_client или W5500_server или и то и другое одновременно, мы отправляем сокету соответствующие команды и читаем статус сокета.
Короче управляем сокетом как хотим.
:tea:

Re: W5500_client+Atmega8_для самых начинающих.

Вт июл 20, 2021 11:10:56

Роман у меня вопрос.
Код:
////////////////////////////////////////// Data RX W5500:
for (x=0; x<8; x++) {
tx=0; SPI(); bufer_RX_W5500[x] = rx;
};


значение переменной rx взято из кода несколькими строками выше?
Код:
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных


Добавлено after 1 minute 50 seconds:
Это не режим сервера. Это просто разные статусы сокета.

Да. Именно так.

Добавлено after 3 minutes:
Роман у меня вопрос.

Код:
////////////////////////////////////////// Data RX W5500:
for (x=0; x<8; x++) {
tx=0; SPI(); bufer_RX_W5500[x] = rx;
};


Ой не доглядел. Прошу прощения.
rx - это возвращаемое значение SPI();

Добавлено after 4 minutes 8 seconds:
Уже устаю. С самого утра за компом. Да еще туго доходит.
Через час заканчивается смена и рабочая неделя. Работаю неделю через неделю. По 12 часов.
По всей видимости покажусь на форуме только в следующую среду.
Дай Бог Роману и всем любителям радио крепкого здоровья.
До встречи.

Re: W5500_client+Atmega8_для самых начинающих.

Вт июл 20, 2021 11:33:58

W5500_server уже запустили ? данные браузеру передали ?

Re: W5500_client+Atmega8_для самых начинающих.

Ср июл 28, 2021 06:05:41

Вторая часть изучения W5500.
Роман здравствуйте.
После недельного перерыва с трудом вникаю в пройденный на позапрошлой неделе материал.
Сервер запустил, но не до конца..
Т.е. вижу, что к нему подключились (статус сокета изменился на 0х17).
Начинаю изучать определение размера принятых данных.
Программу переписываю под свою IDE. GOTO в ней не используется. Поэтому с изучением получается не очень активно.

Добавлено after 1 hour 45 minutes 31 second:
При подключении к SERVER размер принятых данных = 0x1E9
Ответить