сам модуль W5500 не будет ничего резать... без команды из вне)) библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл в отладчике Визнетовскую библиотеку и нигде не встретил никаких попыток повторной отправки: загрузили в 5500 3 управляющих байта и 10 байт посылки- и всё, вернули мне 10. Я никаких явных команд отправки не делаю. Для чистоты эксперимента отключил все задачи, кроме одной.
я повыкидывал все библиотеки (включая визнетовскую) и пишу всё в ручную...
//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.
//Передача закончена.
сколько байт я указал W5500 передать (len), ровно столько байт W5500 и передаёт. Всё одним пакетом. по другому и быть не может. По другому W5500 не работает.
остальные настройки (тайминги повторной передачи и т.д. не трогаем).
Так ведь непонятка в том, что 5500, нормально передав посылку, с какого-то перепуга начинает ещё несколько раз отправлять её по частям, хотя никто его об этом, вроде, не просит.
5500 не может ещё несколько раз отправлять одну посылку по частям...
если сбить настройки тайминга то будет 5500 тупо будет отправлять одну и ту же посылку несколько раз... но не по частя а целиком.
5500 может отправлять по частям если мы сами попросим 5500 отправлять посылку по част... для этого достаточно указать дляину посылки...
1.2.3.4.5.6.7.8.9
len = 3 1.2.3 >> len = 3 4.5.6>> len = 3 7.8.9 >>
или сделать посылку больше TCP пакета...
например для UDP... если длина пакета больше 1472 байта... например 0...1999 то 5500 будет отправлять по частям... первый пакет UDP - 0...1471 второй пакет UDP - 1472...1999
сам модуль W5500 не будет ничего резать... без команды из вне)) библиотеки смотреть надо... или кто там управляет модулем W5500...
Я прошёл отладчиком штатную библиотеку ioLibrary- там только один раз записала. Посмотрю осциллографом, может, откуда-то из недр проекта кто-то дёргает ноги.
Прошу прощения, что поднимаю тему, но, как полный чайник в сишных делах, всё ж спрошу... W5500, подключён к Атмега168, статический адрес, веб-сервер. Программирование сей связки происходит в Ардуино ИДЕ (я ещё мал для низкоуровневого программирования ). Подключения по сериалу нет. Вылез описанный на форуме косяк - слетают настройки W5500 при коммутации через реле высоковольтного (220) оборудования, сама 168-я работает нормально или, если не повезёт, сбрасывается вачдогом. Т.е. требуется считывание настроек модуля W5500, сравнение с запрограммированным адресом и, если косяк, резет модуля с заливкой валидных данных. Насколько я понял, возможно использовать функцию Ethernet.localIP(), возвращающему айпишник в формате х1.х2.х3.х4 (через точки). Но вот как сравнивать с первоначальной установкой в виде ip(x1, x2, x3, x4) (через запятые, это ж функция задаётся кяп) ... Хотя бы х4 сравнивать (его могу отдельной переменной сделать), но как оный вытаскивать из результата работы Ethernet.localIP()... Всем печенек.
if (myip != String(Ethernet.localIP())) { // Если не одинаковы, то сбрасываем W-шку и заново её прошиваем digitalWrite (3, HIGH); // это мы транзистором управляем сбросом W-шки, коротя на землю. delay (50); digitalWrite (3, LOW); //set reset w5500 Ethernet.begin(mac, ip); server.begin(); delay (100); } // По идее, если записанная ранее переменная и считывание адреса одинаковы, то работаем отсюда }
Один раз сработало, прекрасно отрабатывало сбои из-за питания,... а потом никак.., проверка не проходит и всё постоянно сбрасывается. ЧЯНТД? Мож я где-то в типе данных ошибаюсь? W-шки менял, контроллеры менял, чипы менял,... Без блока, описанного выше в секции лупа, остальной код работает, но зависания W-шки не исправляются.
Всем помогают, а вам- нет. Может, не правильно рассчитали? Плата в скольких слоях разведена? Менять слетающие настройки в W5500- это лечить последствия, а не причину.
Плата в один слой. Рассчитывать снаббер на соседский холодильник или торшер ну никак же... Причина в нежности W-шки, на этом форуме уже об этом говорили. Но лечат на более низком уровне. Ну а как сравнить хотя бы последний байт адреса - ну подскажите уж, будьте так любезны. Хотя бы формат ответа функции Ethernet.localIP() - стринг? Нифига. uint32_t ? Теплее, но не срабатывает.
Рассчитывать снаббер на соседский холодильник или торшер ну никак же...
Причём тут эти? Вы же не у соседа холодильник включаете.
Цитата:
Причина в нежности W-шки, на этом форуме уже об этом говорили.
Говорили, видимо, те, кто включает соседский холодильник. W5500 не более нежна, чем другие МК на основе ARM.
Цитата:
отя бы формат ответа функции Ethernet.localIP() - стринг?
Я никогда не пользовался и не пользуюсь Ардуино. Ниже метод инициализации W5500, использующий подправленную библиотеку от Wiznet. Метод устанавливает, потом обратно вычитывает установленный адрес и сравнивает его с тем, который должен был установлен. При совпадении возвращает true. Спойлер
Если у вас W5500 сбоит при включении соседского холодильника, то это указывает на отсутствие полноценной фильтрации помех по цепям электропитания. Ну и отсутствие на плате полноценной "земли" и её разделение на аналоговую и цифровую, как рекомендует Wiznet, усугубляет ситуацию.
О да, фильтрации нет. Аппараты стоят в деревнях, куда Россети не заглядывают, а сосед ещё и спит в обнимку со сваркой. И от меня в трёхстах км. Да ещё и УКВ передатчик рядом молотит и что у него с качеством антенны неизвестно. Так что все фишки окружения не учесть. Тем не менее аналогичные платки (это передача телеметрии), но без управления розетками, стоят в других городах уже второй год и там всё норм. Что меня и заворожило. С кодом спасибо, буду глядеть. По типам переменных уже что-то проясняется. Но увы, другой среды программирования у меня нет...
Да ну. А как же тогда работает оборудование в цехах? У меня ПЛК с W5500 стоят в цехе и не сбоят при включении ни холодильников, ни насосов, ни сварочных аппаратов. Мёртвого припарками на ноги не поставить. Без нормального "железа" будет лотерея: тут работает, а тут нет.
...после зачистки мест посадки W5500 к крепёжным стойкам стало, конечно, лучше, зависаний гораздо меньше. Но они есть периодически. Всё ж земля на этой плате искаропки подключается только и исключительно через единственный пин (в старых версиях через два) и к корпусу устройства плата никак не контактирует. Но как это программно добить именно в среде ИДЕ - вопрос остаётся.
Добавлено after 3 minutes 16 seconds: одна из причин идеальной работы... потому что я не использую никаких библиотек... типа этого... Ethernet.begin(mac, ip); ещё и поэтому нигде ничего не глючит и не зависает.
>потому что я не использую никаких библиотек... типа этого... Ethernet.begin(mac, ip); не вижу разницы между прямым управлением регистрами и тем же через либы. Ну разве что мусорокоду больше получается, то да,... Крч, как я понял, никто W-шкой через иде не занимался и особо не вникал в это..., лан, проехали, чоуш, вопрос снят...
UPD, если кому-то скушно: Код выше рабочий. Проблема была в свободном ОЗУ Атмеги 168, меньше чем со 256 байтами работать со стрингами лучше не надо. Почистил код, добился 330 байт свободного - и заработало. Вывод: никому не верь, особенно себе и выдаче сообщений Ардуино ИДЕ... ...пользовал бы 328-ю, не напоролся бы...
Последний раз редактировалось rw6hrm Чт авг 29, 2024 16:45:10, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения