Форум РадиоКот https://radiokot.ru/forum/ |
|
W5500_client+Atmega8_для самых начинающих. https://radiokot.ru/forum/viewtopic.php?f=61&t=177866 |
Страница 1 из 12 |
Автор: | kondeg [ Пт июл 16, 2021 12:28:03 ] |
Заголовок сообщения: | W5500_client+Atmega8_для самых начинающих. |
Здравствуйте уважаемые товарищи. Прошу помощи в освоении, понимании работы (хотя бы на самом минимальном уровне) сетевого модуля W5500 в качестве клиента + Atmega8 для передачи на сервер некоторого числового значения (значений). Все это с легкостью делается (делал) на arduino, но там уж слишком все универсально. Google и Yandex пользоваться умею. Но попадались мне все чаще arduno_вские примеры, а там все на уровне использования функций. А хотелось бы ,так сказать, пощупать этот модуль изнутри, вложить в него только сАмое необходимое. Из литературы прочитал Техническую спецификацию микросхемы W5500, но как реализовать инициализацию, проверку подключения к серверу, открытие_закрытие соединения ( и вообще как это все и многое другое и необходимое делается и в каком порядке ) я не знаю. Одна надежда на сообщество любителей радио этого ресурса. Мне 51 год. В моем окружении никто не интересуется ни программированием ни схемотехникой. Посоветоваться нескем, а желание освоить (пусть в минимальном размере) этот модуль есть большое. SPI, UART изучил. Пишу в Atmel Studio_7 (мне удобно). Вот такое длинное повествование. Думаю для начинающих тема будет тоже полезна и интересна. С уважением Константин. |
Автор: | parovoZZ [ Пт июл 16, 2021 12:46:26 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
На канале narodstream всё рассказывается до мелочей. |
Автор: | roman.com [ Пт июл 16, 2021 17:47:33 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Во-первых для передачи на сервер некоторого числового значения (значений) никакие адаптеры не нужны. Atmega8 может сама передавать на сервер числовые значения. Всё это делали в прошлой теме. https://www.radiokot.ru/forum/viewtopic ... start=1529 Вообще это отдельная большая интересная тема. Когда доделаем надо будет написать по этой теме статью)) ![]() Разобраться с 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) как бегают пакеты. Всё)) ![]() понимании работы (хотя бы на самом минимальном уровне) сетевого модуля W5500 Разберём подробно)) как реализовать инициализацию, проверку подключения к серверу, открытие_закрытие соединения ( и вообще как это все и многое другое и необходимое делается и в каком порядке ) я не знаю. Очень просто)) Подключаем W5500 к Atmega8 согласно схеме. Вложение: Далее инициализация W5500. Для инициализации W5500 нам надо прописать регистры. По SPI передаём пакеты байтов. Формат пакета - адрес, контрольный байт (режим чтения/записи, формат), байты данных. W5500 поддерживает несколько форматов чтения/записи. Формат определяет контрольный байт. Вложение: Выбираем формат переменной длины. Вложение: Далее W5500 состоит из двух частей - физический уровень (PHY) и логический уровень (процессор, память, регистры и т.д.). Вложение: Настраиваем физический уровень 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 подключился к роутеру или компу по сетевому проводу. // загорелся жёлтый светодиод. // зелёный светодиод мигает только в момент приёма и отправки пакетов. Вложение: // Линк поднялся. Далее настраиваем логический уровень W5500. Память W5500 состоит из блоков. Главный регистр управления W5500 и 8 штук сокетов. Размер блоков можно менять но нам это не нужно)) Вложение: Находим главный регистр управления W5500 (блок номер 0) Вложение: Вот он подробно расписан Вложение: записываем в него шлюз, маску, 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 на пинг отвечает. Вложение: ![]() Добавлено after 8 minutes 31 second: Далее открываем сокет. Например откроем сокет номер 2. Для этого надо прописать регистр сокета номер 2. Регистр сокета номер 2 находится в блоке 0x09. Вложение: Вот он подробно расписан Вложение: записываем в него протокол 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 //Все команды есть в даташите. Вложение: //Далее сидим и ждём пока к нашему 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 - т.е. сам установит с сервером соединение. Вложение: Затем сокет номер 2 перейдёт в режим ESTABLISHED. Остальное всё тоже самое )) Кратко вот. ![]() |
Автор: | kondeg [ Сб июл 17, 2021 01:33:17 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
roman.com спасибо огромное за развернутый ответ. Просто удивляюсь - когда Вы время находите на всю эту работу (разъяснить, написать). Сегодня буду по "косточкам" разбирать Ваш ответ, благо свободного времени достаточно. |
Автор: | roman.com [ Сб июл 17, 2021 09:57:42 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
В XXI веке (век Интернета, IT и IoT) нужно разбираться в сетевых технологиях во всех подробностях)) На это времени не жалко.)) ![]() |
Автор: | kondeg [ Сб июл 17, 2021 10:24:30 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
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) нужно разбираться в сетевых технологиях во всех подробностях)) На это времени не жалко.)) ![]() Буду грызть этот гранит. |
Автор: | roman.com [ Сб июл 17, 2021 10:52:30 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Начинаем всё с начала)) 0- Первым делом берём Atmega8 + W5500 и рисуем схему. Что куда и как подключать будем. Сейчас разрабатываю сервер Умного Дома. У меня W5500 подключена к Atmega328Р по такой схеме - Вложение: У Вас будет своя схема. 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); // ... ... ... |
Автор: | kondeg [ Сб июл 17, 2021 11:01:46 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Понял. Спасибо большое! |
Автор: | roman.com [ Сб июл 17, 2021 20:43:14 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
И что там за сервер такой... и что передавать будем ? )) Да ещё по HTTP... без шифрования HTTPS )) |
Автор: | kondeg [ Вс июл 18, 2021 09:56:26 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Самый простой, классический 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? Возвращаемое значение чего должно отобразится? |
Автор: | roman.com [ Вс июл 18, 2021 11:30:05 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
kondeg писал(а): не получается конфигурация режима PHY регистр PHY. Вложение: //Потом настраиваем регистр 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 ![]() Вообще читать статус регистра PHY - это по желанию. Это просто для контроля Link. Можно не заморачиваться с чтением статуса регистра PHY. В реальности оно нафиг не нужно)) -Если отключить сетевой кабель от W5500 то жёлтый светодиод погаснет. -А статус регистра регистр PHY изменился на... не помню)) -Если обратно подключить сетевой кабель к W5500 то через пол секунды жёлтый светодиод загорится. -А статус регистра регистр PHY изменился на 0xCD 0x00. Таким образом, читая читая статус PHY мы можем контролировать Link. В реальности оно нафиг не нужно)) |
Автор: | kondeg [ Вс июл 18, 2021 11:39:07 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Проверил. По началу выдавало значение 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 ![]() Вообще читать статус регистра PHY - это по желанию. Это просто для контроля Link. Можно не заморачиваться с чтением статуса регистра PHY. В реальности оно нафиг не нужно)) Да. Все так и получилось. Просто повнимательней мне нужно быть. Еще раз спасибо. roman.com хотелось бы к Вам по имени обращаться ( если можно конечно). Мое имя Константин. Мы все таки люди ![]() |
Автор: | roman.com [ Вс июл 18, 2021 13:35:44 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Всё можно. )) Мое имя Роман. Как не трудно догадаться из ника 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, и т.д.) ![]() Добавлено after 16 minutes 40 seconds: Если модули отключить от питания (при включенном мк), а затем включить, то светодиод моргает, но не загорается. При отключении питания W5500 все регистры сбрасываются к заводским настройкам. Придётся всё прописывать заново)) Точно так же как во всех радио модулях и других шилдах для Ардуино...)) ![]() Добавлено after 17 minutes 44 seconds: Советы для начинающих)) Как писал выше W5500 состоит из двух частей - физический уровень (PHY) и логический уровень (процессор, память, регистры и т.д.). Вложение: Как проверить работает ли физический уровень (PHY) ? Очень просто - с помощью тестера ! )) - Потребляемый ток физический уровень (PHY) = 30 mA. - Потребляемый ток логический уровень (процессор, память, регистры и т.д.) = 50 mA. - Общий потребляемый ток = 80 mA. Вложение: //Потом настраиваем регистр 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. ![]() Добавлено after 38 minutes 1 second: kondeg писал(а): классический web_термометр. http://www.pogoda19.ru kondeg писал(а): Для чего web_термометр Это я так понял сторонний платный сайт... Зарегистрирован за reg.ru - https://www.reg.ru/domain/new/ А не лучше в своём доме поставить свой сервер на W5500_server+Atmega8 ?)) Бесплатно)) ![]() |
Автор: | kondeg [ Пн июл 19, 2021 09:30:07 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Цитата: У меня вопрос. Судя по отправленным данным 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: И зеленый светодиод загорается. Пакеты принимает. |
Автор: | roman.com [ Пн июл 19, 2021 10:35:35 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Первые три младших регистра это статусные (информационные), т.е. мы их не включаем в настройку. Модуль 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. ![]() kondeg писал(а): настоящий серверок можно прикрутить дома в локалке (несколько системных блоков и ноут пылятся дома без дела). Зачем ноут ? Свой домашний сервер делается из W5500+Atmega8. Больше ничего не нужно)) kondeg писал(а): А на счет глобальной сети... А чтобы родственники могли подключаться к своему домашнему серверу нужно иметь дома белый IP-адрес. Больше ничего не нужно)) ![]() Кроме погоды в доме, свой домашний сервер может всем родственникам передавать приветики и последние новости из дома)) Типа "лента новостей из дома")) Через свой домашний сервер можно отправлять родственникам любые сообщения и т.д.. Таким образом свой домашний сервер может дополнить (или вообще полностью заменить) телеги и вацапы и т.д.)) Будет свой домашний семейный чат)) ![]() |
Автор: | kondeg [ Вт июл 20, 2021 07:27:43 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Цитата: ///////////////////////////////////////////////////////////////////////////////////////////// // читаем статус 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) |
Автор: | roman.com [ Вт июл 20, 2021 10:52:44 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Да как угодно)) Мне удобней писать как в даташите. Чтоб не путаться... 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 - сокет закрыл соединение. И т.д. ![]() Вся программа - это отправляем команды сокету и читаем статус сокета. Далее, в зависимости от того что мы хотим W5500_client или W5500_server или и то и другое одновременно, мы отправляем сокету соответствующие команды и читаем статус сокета. Короче управляем сокетом как хотим. ![]() |
Автор: | kondeg [ Вт июл 20, 2021 11:10:56 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Роман у меня вопрос. Код: ////////////////////////////////////////// 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 часов. По всей видимости покажусь на форуме только в следующую среду. Дай Бог Роману и всем любителям радио крепкого здоровья. До встречи. |
Автор: | roman.com [ Вт июл 20, 2021 11:33:58 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
W5500_server уже запустили ? данные браузеру передали ? |
Автор: | kondeg [ Ср июл 28, 2021 06:05:41 ] |
Заголовок сообщения: | Re: W5500_client+Atmega8_для самых начинающих. |
Вторая часть изучения W5500. Роман здравствуйте. После недельного перерыва с трудом вникаю в пройденный на позапрошлой неделе материал. Сервер запустил, но не до конца.. Т.е. вижу, что к нему подключились (статус сокета изменился на 0х17). Начинаю изучать определение размера принятых данных. Программу переписываю под свою IDE. GOTO в ней не используется. Поэтому с изучением получается не очень активно. Добавлено after 1 hour 45 minutes 31 second: При подключении к SERVER размер принятых данных = 0x1E9 |
Страница 1 из 12 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |