— Бухаров А.В. 2019/06/18 09:08
В ходе проведенных опытов мы выяснили, что прерывание от W5500 нет.
В этой статье http://www.cyberforum.ru/digital-signal-processing/thread2094151.html указано, что для получения прерываний необходимо перевести сокеты в состояние listen().
Хотя описание дано для W5100, я думаю, что и для W5500 оно тоже подойдет.
Надо проверить. Но как? Вот тут приведено описание библиотеки ethernet: https://doc.arduino.ua/ru/prog/Ethernet
Про listen() нет ни слова. Кирилл! Надо разбираться.
— Бухаров А.В. 2019/06/14 08:24
По состоянию на 7 июня 2019 г в нем реализована обработка GET запросов, выделение команд и данных.
Теперь необходимо реализовать эти команды, взяв за основу уже имеющийся скетч Ястребова.
Скетч Ястребова: 2artonitmpt_large_1_3.ino.
Именно этот код работал на презентации.
Источник: https://habr.com/ru/post/414211/ Модуль W5500 подключен к SPI интерфейсу МК (MOSI, MISO, SCK, SCLK). Кроме того, к определённому выходу МК подключен вывод RST (аппаратный сброс), и к входу внешнего прерывания INT0 подключен соответствующий вывод INT. Последний используется по прямому назначению: При возникновении того или иного события в модуле W5500 он формирует импульс на выводе INT, который обрабатывается контроллером в теле внешнего прерывания. МК узнаёт, на каких сокетах произошло событие, затем переписывает коды событий для каждого сокета в определённый массив. Дальнейшая обработка прерывания происходит внутри основного цикла программы. Всего документировано пять событий: клиент подключился, клиент отключился (точнее, подал запрос на отключение), поступили данные от клиента, сработал таймаут, данные отправлены успешно. В основном цикле обрабатываются все события, кроме последнего. В данную обработку помещён оператор switch-case. Самая большая часть программного кода на языке Си встречается в секции обработки третьего события (приём данных). В нём после функции обработки принятой информации также помещён оператор switch-case, но в данном случае этот «переключатель» связан с переменной, отвечающей за состояние сокета, о котором говорилось выше (значения 0, 1, 2). Первая секция отвечает за процедуру распознавания пароля. Принятые символы переписываются в отдельный парольный буфер. При определённых условиях работают функции сравнения принятой строки со строками-константами, содержащих пароли. В случае того или иного совпадения присваивается соответствующее состояние. Вторая секция самая простая – содержимое собственного буфера принятой информации перенаправляется на UART микроконтроллера. Это режим обычного использования. Третья секция (самая большая) отвечает за обработку команд – режим управления устройством.
Кроме продолжения обработчика прерываний в основном цикле программы помещены обработчики виртуальных таймеров – таймаут для разрыва соединения при неуспешной попытке ввода пароля, периодическая отправка «keep-alive» и отправка клиенту сформированного по таймеру TCP пакета. Ещё в тело основного цикла помещена функция чтения из UART, внутри которой переписываются принятые контроллером символы в собственный (промежуточный) буфер передачи и происходит сброс таймера, отвечающий за формирование TCP пакета.
Все процедуры сокетов помещены в цикл от 0 до 7, итератор которого привязан к номеру сокета. Таким образом, происходит последовательная обработка всех сокетов. Изначально я подразумевал, что, если присвоить каждому из восьми сокетов одинаковый номер порта, то можно обеспечить подключение до восьми пользователей по одному и тому же порту. Однако такая конфигурация не заработала, и данный вопрос пока отложен на будущее. В документации на W5500 это отражено т.о.:
Предполагаемые задачи при работе с МПТ: