Покажите ещё раз анализатор чтоб убедиться что всё правильно работает.
Должно быть так
Вложение:
Screenshot_2.jpg [83.08 KiB]
Скачиваний: 164
>SYN
>SYN ACK
>ACK
>GET
>TCP
>FIN ACK
>ACK
>FIN ACK
>ACK
kondeg писал(а):
if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.
Нам необходимо эти (этот) регистр прочитать?
Нет. Это регистр команд. В него пишем команду передачи - 0x20 (SEND). Когда все данные из передающего буфера будут переданы статус регистра команд сбросится в ноль - 0x00. Таким образом W5500 нам сообщает что все данные переданы т.е. команда 0x20 (SEND) выполнена.
Но дело в том, что передача передающего буфера происходит очень быстро. Поэтому пока мы пишем другие регистры, регистр команд за это время уже сбросится в ноль - 0x00.
Поэтому его читать не нужно.
Тяжеловато с GOTO.
Безусловный переход. Наоборот проще. Не нужно ждать завершения циклов и т.д.))
И так....
Порядок производимых действий:
Для W5500_server:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)
- Открываем socket (команда OPEN)
- Переключаем socket в режим прослушивания (LISTEN)
- Читаем статус socket (или читаем вывод INT W5500) на предмет подключения клиента к серверу .
- Если статус socket != 0x14 (Если статус не LISTEN, а какой-то другой) то читаем размер принятых данных, которые > 0 (да/нет ?)
(Так проще. Дело в том, что у сокета много режимов/статусов. Чтобы не проверять каждый статус по отдельности мы просто спрашиваем - статус LISTEN ? или не LISTEN ? Если статус не LISTEN, значит статус ESTABLISHED или какой другой. Какой именно статус - нам не интересно. Мы сразу переходим в режим ESTABLISHED. Остальные статусы сокета нас не интересуют.)
//режим ESTABLISHED:
- Читаем начальный адрес буфера RX
- Читаем данные с начального адреса буфера RX
- Пишем указатель буфера RX до увеличенного значения
- Пишем команду завершения приема буфера RX
- - - Передача пакета браузеру
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX
- Пишем указатель буфера TX до увеличенного значения
- Пишем команду передачи буфера TX (команда SEND)
- Закрываем соединение с браузером (передаем FIN пакет)
- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - Переключаем socket в режим прослушивания (LISTEN).
Вроде так))
К примеру: переменная a=7 как это значение отправить на server по адресу 192.168.0.200
Как это делается в строке браузера я примерно знаю:
Код:
192.168.0.200/data.php?a=7
А как это сделать через W5500_client не понимаю.
не помню)) Это было давно))
Сейчас вспомним))
W5500_client должен прикинуться браузером))
Контролировать работу W5500 в режиме W5500_client надо тоже по анализатору.
И так....
Порядок производимых действий:
W5500_client:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)
- Открываем socket (команда OPEN)
- - - Передача пакета серверу
- пишем IP (Destination), порт (Destination) сервера
(для сервера HTTP порт 80, для сервера HTTPS порт 443, и т.д.)
PORTB.6=0; // SS W5500
// (для команды SEND c автоматическим ARP-запросом):
tx=0x00; SPI(); tx=0x0C; SPI(); tx=0x4C; SPI(); //(MAC = ARP), IP, порт
//IP_server: 192.168.0.200
tx=192; SPI(); // Data // Destination IP Address (Sn_DIPR0)(0x000C - Address)
tx=168; SPI(); // Data // Destination IP Address (Sn_DIPR1)(0x000D - Address)
tx=0; SPI(); // Data // Destination IP Address (Sn_DIPR2)(0x000E - Address)
tx=200; SPI(); // Data // Destination IP Address (Sn_DIPR3)(0x000F - Address)
// порт_server: 80
tx=0x00; SPI(); // Data // Destination Port (Sn_DPORT0)(0x0010 - Address) -порт 80
tx=0x50; SPI(); // Data // Destination Port (Sn_DPORT1)(0x0011 - Address) -порт 80
PORTB.6=1; // SS W5500
- Пишем команду подключения к серверу (команда CONNECT)
// пишем команду CONNECT Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x04; SPI(); // Data -0x04 (CONNECT)
PORTB.6=1; // SS W5500
//W5500_client подключается к серверу...
//>SYN
//>SYN ACK
//>ACK
//W5500_client подключился к серверу.
> После подключения к серверу сокет 2 перейдёт в режим ESTABLISHED.
- Ждём пока сокет 2 перейдёт в режим ESTABLISHED...
//режим ESTABLISHED:
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX
> Наш W5500_client должен прикинуться браузером.
http://we.easyelectronics.ru/electro-an ... i-cgi.htmlДля этого W5500_client должен передать серверу примерно такой пакет:
Вложение:
передача пакета серверу.jpg [31.72 KiB]
Скачиваний: 163
/////////////////////////////////////////////////////
//unsigned char bufer_TX_W5500_HTTP[]={
//"GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \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++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////////////////
Сервер подумает что наш W5500_client - это браузер)) Мы обманули сервер))
- Пишем указатель буфера TX до увеличенного значения
- Пишем команду передачи буфера TX (команда SEND)
> Сервер прочитает наш пакет и ответит нашему W5500_client таким пакетом:
Вложение:
ответ сервера.jpg [6.7 KiB]
Скачиваний: 158
Мы можем прочитать ответ сервера.
А можем не читать ответ сервера, а просто подождать пока сервер закроет соединение (отправит нам пакет FIN).
Это по желанию.
- Ждём когда сервер закроет соединение (принимаем пакет FIN от сервера).
- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - - - Передача пакета серверу.
Вроде как-то так))