Проблема инициализации Ethernet-контроллера W5100 по SPI.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Yarst
Родился
Сообщения: 10
Зарегистрирован: Пт ноя 28, 2008 01:12:46
Откуда: Москва
Контактная информация:

Проблема инициализации Ethernet-контроллера W5100 по SPI.

Сообщение Yarst »

Всем доброго времени суток!
Что есть?
Есть Ethernet-контроллер WIZNET W5100, подключенный к микроконтроллеру ATmega64 по интерфейсу SPI (линии MOSI, MISO, CLK, SS). Дополнительно к SPI имеется линия Reset, позволяющая аппаратно перегружать контроллер W5100 и линия INT – для вызова прерываний в программе ATmega64 по событиям в W5100.
Изображение
К выводам "LINKLED" и "FDXLED" подключены светодиоды.
Изображение
Что нужно?
Необходимо, чтобы устройство стало TCP-клиентом, время от времени подключалось к TCP-серверу и обменивалось с сервером некоторым количеством данных (объемом несколько сот байт).
Что такое Ethernet-контроллер W5100?
Ethernet-контроллер W5100 – специальная микросхема, позволяющая соединить относительно медленный микроконтроллер (в данном случае ATmega64) с относительно быстрым интерфейсом Ethernet. В W5100 реализованы на аппаратном уровне протоколы TCP-IP, UDP и ряд других. Задача микроконтроллера ATmega64 состоит в том, чтобы просто передать нужные данные на W5100, а Ethernet-контроллер W5100 уже сам в соответствии с выбранным протоколом передаст данные по нужному адресу в сети Ethernet. Тоже и с получением данных. Ethernet-контроллер W5100 способен одновременно работать с четырьмя независимыми потоками данных, каждый из которых может работать по своему протоколу (4 сокета).
В чем проблема?
Для инициализации Ethernet-контроллера W5100 необходимо установить значения некоторого количества его управляющих регистров. Есть управляющие регистры общего назначения – позволяющие задать режимы работы всего Ethernet-контроллера W5100 в целом, и есть регистры управления каждым сокетом в отдельности – позволяющие задать режимы работы каждого сокета в отдельности.
Проблема состоит в том, что у меня не получается инициализировать значение регистров
"Socket N Destination IP Address Register" (он четырехбайтный, хранит IP-адрес устройства назначения (сервера), например, 192.168.1.2);
и
"Socket N Destination Port Register" (он двухбайтный, хранит номер порта устройства назначения (сервера), например 3000).
При попытке изменить значения этих регистров, значения в них не изменяются, а остаются нулевыми.
Что и как делаю?
Если Ethernet-контроллер W5100 не инициализировать вообще никак, он остается "мертвым", на запросы "ping" не отвечает, светодиоды не светятся. Для инициализации:
Сначала на W5100 выдается аппаратный сигнал Reset (на вывод "/RESET" выдается 0);
Через 100мс аппаратный сигнал Reset снимается (на вывод "/RESET" выдается 1);
Еще через 100мс на W5100 выдается команда "софтового" сброса. Для этого в регистр "Mode Register" (с адресом $0000) заносится значение b10000000 (устанавливается бит RST);
Сразу после этого начинается, собственно, процесс инициализации внутренних регистров. Процесс инициализации выполнен в строгом соответствии с Datasheet-ом на W5100. Итак:
Значение регистра "Mode Register" ($0000) устанавливается в $00. Считываем что записали, проверяем – Ok!
Значение регистра "Interrupt Mask Register" ($0016) устанавливается в $00. Считываем, проверяем, Ok!
Значение регистра "Retry Time-value Register" ($0017) устанавливается в $0F. Считываем, проверяем, Ok!
Значение регистра "Retry Time-value Register" ($0018) устанавливается в $A0. Считываем, проверяем, Ok!
Таким образом, общее значение регистра "Retry Time-value Register" получается 4000 ($0FA0).
Значение регистра "Retry Count Register" ($0019) устанавливается в $08. Считываем, проверяем, Ok!
Далее следует настройка IP-адреса устройства назначения (сервера) (192.168.1.2). Для этого:
Значение регистра "Gateway Address Register" ($0001) устанавливается в 192. Считываем, проверяем, Ok!
Значение регистра "Gateway Address Register" ($0002) устанавливается в 168. Считываем, проверяем, Ok!
Значение регистра "Gateway Address Register" ($0003) устанавливается в 1. Считываем, проверяем, Ok!
Значение регистра "Gateway Address Register" ($0004) устанавливается в 2. Считываем, проверяем, Ok!
Далее следует настройка MAC-адреса нашей системы (аппаратный адрес нашего устройства). MAC-адрес тупо взят из Datasheet-а и равен "00 08 DC 01 02 03". Итак:
Значение регистра "Source Hardware Address Register" ($0009) устанавливается в $00. Считываем, проверяем, Ok!
Значение регистра "Source Hardware Address Register" ($000A) устанавливается в $08. Считываем, проверяем, Ok!
Значение регистра "Source Hardware Address Register" ($000B) устанавливается в $DC. Считываем, проверяем, Ok!
Значение регистра "Source Hardware Address Register" ($000C) устанавливается в $01. Считываем, проверяем, Ok!
Значение регистра "Source Hardware Address Register" ($000D) устанавливается в $02. Считываем, проверяем, Ok!
Значение регистра "Source Hardware Address Register" ($000E) устанавливается в $03. Считываем, проверяем, Ok!
Далее следует настройка маски подсети (255.255.255.0). Для этого:
Значение регистра "Subnet Mask Register" ($0005) устанавливается в 255. Считываем, проверяем, Ok!
Значение регистра "Subnet Mask Register" ($0006) устанавливается в 255. Считываем, проверяем, Ok!
Значение регистра "Subnet Mask Register" ($0007) устанавливается в 255. Считываем, проверяем, Ok!
Значение регистра "Subnet Mask Register" ($0008) устанавливается в 0. Считываем, проверяем, Ok!
Далее следует настройка IP-адреса нашего устройства (192.168.1.30). Для этого:
Значение регистра "Source IP Address Register" ($000F) устанавливается в 192. Считываем, проверяем, Ok!
Значение регистра "Source IP Address Register" ($0010) устанавливается в 168. Считываем, проверяем, Ok!
Значение регистра "Source IP Address Register" ($0011) устанавливается в 1. Считываем, проверяем, Ok!
Значение регистра "Source IP Address Register" ($0012) устанавливается в 30. Считываем, проверяем, Ok!
Теперь необходимо настроить размеры входных и выходных буферов под сокеты (всего 4 сокета в W5100). Мне нужен только один сокет, я выбрал "сокет 0", ему и отдадим всю память:
Значение регистра "RX Memory Size Register" ($001A) устанавливается в b00000011. Считываем, проверяем, Ok!
Значение регистра "TX Memory Size Register" ($001B) устанавливается в b00000011. Считываем, проверяем, Ok!
На этом инициализация регистров общего назначения завершена.
Начиная с этого момента Ethernet-контроллер W5100 "оживает", становится доступен для команды "ping" (с любого компьютера в сети), с помощью команды "apr –a" можно увидеть введенный нами MAC-адрес. Светодиоды контроллера W5100 также начинают светиться при подключении к сети (Ethernet).
Далее следует настройка регистров для сокета 0. Мне нужен протокол TCP, поэтому:
Значение регистра "Socket 0 Mode Register" ($0400) устанавливается в $01. Считываем, проверяем, Ok!
Далее настраиваем № порта нашего устройства, например, 5000 ($1388). Для этого:
Значение регистра "Socket 0 Source Port Register" ($0404) устанавливается в $13. Считываем, проверяем, Ok!
Значение регистра "Socket 0 Source Port Register" ($0405) устанавливается в $88. Считываем, проверяем, Ok!
Теперь даем команду ОТКРЫТЬ сокет 0. Для этого в "Socket 0 Command Register" ($0401) заносим $01.
Для проверки открытия сокета 0 считываем регистр "Socket 0 Status Register" ($0403). Его значение должно быть $13 – "SOCK_INIT". Проверяем – так и есть, Ok!
Вот теперь начинаются косяки!
Согласно Datasheet-у теперь необходимо настроить регистры "Socket 0 Destination IP Address Register". Остается непонятным, зачем еще раз настраивать IP-адрес устройства назначения (сервера), если мы уже его настроили в регистрах общего назначения, а именно в регистре "Gateway Address Register" ($0001, $0002, $0003, $0004), ну да ладно. Итак, пытаемся настроить (192.168.1.2):
Значение регистра "Socket 0 Destination IP Address Register" ($040C) пытаемся установить в 192. Считываем – получаем 0! Данные НЕ совпадают!
Значение регистра "Socket 0 Destination IP Address Register" ($040D) пытаемся установить в 168. Считываем – получаем 0! Данные НЕ совпадают!
Значение регистра "Socket 0 Destination IP Address Register" ($040E) пытаемся установить в 1. Считываем – получаем 0! Данные НЕ совпадают!
Значение регистра "Socket 0 Destination IP Address Register" ($040F) пытаемся установить в 2. Считываем – получаем 0! Данные НЕ совпадают!
Следующая настройка – настройка номера порта устройства назначения (сервера). Пытаемся настроить значение, например, 3000 ($0BB8). Для этого:
Значение регистра "Socket 0 Destination Port Register" ($0410) пытаемся установить в $0B. Считываем – получаем 0! Данные НЕ совпадают!
Значение регистра "Socket 0 Destination Port Register" ($0410) пытаемся установить в $B8. Считываем – получаем 0! Данные НЕ совпадают!
Вот на этом у меня и произошел "затык". Как решить эту проблему, т. е. как установить значения этих регистров, я пока не придумал.
Дальнейшее действие по передаче данных – есть соединение (CONNECT).
Для этого надо выдать команду CONNECT путем записи в "Socket 0 Command Register" ($0401) значения $04.
Для контроля установления соединения с сервером смотрим значение регистра "Socket 0 Status Register" ($0403).
При этом, если сетевой кабель НЕ подключен, возвращаемое значение сначала $01 – в Datasheet-е вообще не прописано, а через время истечения всех TimeOut-ов - $00 – сокет 0 закрыт.
Если сетевой кабель подключен, возвращаемое значение - $15 – SOCK_SYNSENT. Данное значение остается сколь угодно долго, TimeOut-ы не срабатывают.
Дальше пока не продвинулся.
Кроме того, никто не знает ли, где можно взять некое простейшее приложение для компьютера (программу, компьютерный интерфейс), которое бы являлось сервером и позволило бы получить и отправить некоторые данные на удаленное устройство по протоколу TCP? Порт, по которому надо "стучаться" к этому приложению должен быть четко задан и известен, а лучше, чтобы была возможность его задать вручную.
Буду рад любым конструктивным предложениям!
С уважением, Ярослав, http://www.yarst.org.
yarst.org - сайт о том, что можно сделать своими руками
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение asteroid7 »

Yarst, для чего фото м/с на плате прикрепили?
Аватара пользователя
Yarst
Родился
Сообщения: 10
Зарегистрирован: Пт ноя 28, 2008 01:12:46
Откуда: Москва
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Yarst »

Для наглядного понимания того, о чем идет речь.
yarst.org - сайт о том, что можно сделать своими руками
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Kavka »

Yarst писал(а):[skip]

Далее следует настройка IP-адреса устройства назначения (сервера) (192.168.1.2). Для этого:
Значение регистра "Gateway Address Register" ($0001) устанавливается в 192. Считываем, проверяем, Ok!
[skip]
Согласно Datasheet-у теперь необходимо настроить регистры "Socket 0 Destination IP Address Register". Остается непонятным, зачем еще раз настраивать IP-адрес устройства назначения (сервера), если мы уже его настроили в регистрах общего назначения, а именно в регистре "Gateway Address Register" ($0001, $0002, $0003, $0004), ну да ладно. Итак, пытаемся настроить (192.168.1.2):
Значение регистра "Socket 0 Destination IP Address Register" ($040C) пытаемся установить в 192. Считываем – получаем 0! Данные НЕ совпадают!
[skip]

Незнаю насколько это поможет, но "Gateway Address" это адрес шлюза, а не адрес устройства назначения. Это то что в русской winXP называется "основной шлюз". Ещё это называют "маршрут по умолчанию" или "адрес маршрутизатора".

Обычно сокет сначала конфигурируют, а потом открывают. :)

Бегло просмотрел даташит...
Так вы хотите чтобы ваше устройство было клиентом или сервером?
Внимательно прочитайте пункты 5.2.1.1 и 5.2.1.2 даташита.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение a.garkin »

Может и зря влазею, но:
Клиент (сторона — инициатор соединения) посылает пакет с установленным флагом SYN (synchronize).
В ответ на него сервер должен ответить комбинацией флагов SYN+ACK (acknowledges).
После этого клиент должен ответить пакетом с флагом ACK, после чего соединение считается установленным.


Боюсь что будут проблемы, из-за того девайсы работают на разных скоростях. Просто на практике уже убедился, свитч 100мбит, две карты по 100, и один комп на 10, и такие чудеса начинаются...

Хотя желание и идею автора полностью одобряю...
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Kavka »

a.garkin, это умный контроллер, он сам это делать умеет, да и по скорости он 10/100.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Kavka »

a.garkin писал(а):Боюсь что будут проблемы, из-за того девайсы работают на разных скоростях. Просто на практике уже убедился, свитч 100мбит, две карты по 100, и один комп на 10, и такие чудеса начинаются...

Чудеса начинаются, когда для упрощения начинают выкидывать обработку таймаутов и/или возможных потерь пакетов. Что как раз и будет происходить, скажу мягко, при не очень умных свичах, и тем более хабах.
Не вижу необходимости развивать именно этот аспект проблемы.
В сети можно найти теорию работы и хабов, и свичей, и как там могут пакеты теряться.
А на практике оно ещё хуже. :(
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение a.garkin »

Kavka писал(а):a.garkin, это умный контроллер, он сам это делать умеет, да и по скорости он 10/100.


нету еще такого оборудования, разве что такая грубая ошибка)))
10/100, 10 на прием, 100 на передачу???

Есть оборудование 100 на прием/10 на передачу, и 1000 на прием, 100 на передачу...

Даташит не читал, но если тама так написано значит плохая железяка...

:))

Уж за 8 лет работы сисодмином потыркал многие железки...
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение a.garkin »

И мне лично не совсем понятно на каком уровне будет работать вся эта конструкция? 1,2,3,4?
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Kavka »

a.garkin, а на свичах с поддержкой "гигабита" ещё пишут 10/100/1000 - приём-передача-ЧТО_ЕЩЁ :))
Речь идёт об Ethernet (эзернет). И когда пишут 10/100 это означает, что устройство может работать на любой из поддерживаемых скоростей, т.е. либо 10 мегабит в секунду, либо 100 мегабит в секунду.
На приём и передачу у Ethernet скорость всегда одинаковая.
О многообразии Ethernet можно посмотреть, например, тут.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение a.garkin »

Kavka писал(а):a.garkin, а на свичах с поддержкой "гигабита" ещё пишут 10/100/1000 - приём-передача-ЧТО_ЕЩЁ :))
Речь идёт об Ethernet (эзернет). И когда пишут 10/100 это означает, что устройство может работать на любой из поддерживаемых скоростей, т.е. либо 10 мегабит в секунду, либо 100 мегабит в секунду.
На приём и передачу у Ethernet скорость всегда одинаковая.
О многообразии Ethernet можно посмотреть, например, тут.

Да не это то я знать то, просто так и надо было писать что выбор либо 10 либо 100, тут в принципе так и получается либо одно либо другое... а чтобы все вместе не заставить...
Мне вот тоже интересен проект, пробовал тоже как то прикрутить банально сигнализацию на микроконтроллере, через КОМ порт, потом плюнул... На одной оси нормально на другой через раз...
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение Kavka »

a.garkin писал(а):И мне лично не совсем понятно на каком уровне будет работать вся эта конструкция? 1,2,3,4?

Если вы про это
То выдержка из даташита должна снять этот вопрос у вас.
Features
- Support Hardwired TCP/IP Protocols : TCP, UDP, ICMP, IPv4 ARP, IGMP, PPPoE, Ethernet
- 10BaseT/100BaseTX Ethernet PHY embedded
- Support Auto Negotiation (Full-duplex and half duplex)
- Support Auto MDI/MDIX
- Support ADSL connection (with support PPPoE Protocol with PAP/CHAP Authentication
mode)
- Supports 4 independent sockets simultaneously
- Not support IP Fragmentation
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение a.garkin »

В принципе понятно.

Если данное устройство должно быть клиентом, то часть проблем решается, от банального telneta, и заканчивая ssh или же Power Shell.

Тем более как говориться
Support ADSL connection (with support PPPoE Protocol with PAP/CHAP Authentication
mode)

Соответственно можно и порты задать...
На программном уровне.
А то что уже будет отдавать сервер клиенту дело техники, хоть адресацию памяти или что вообще происходит в данный момент времени.
zsalamandra
Родился
Сообщения: 2
Зарегистрирован: Чт май 05, 2011 18:59:35

Re: Проблема инициализации Ethernet-контроллера W5100 по SPI

Сообщение zsalamandra »

Yarst у вас получилось с инициализацией W5100...тоже собираюсь собрать устройство на основе W5100 в связке с ATMEGA какой нибудь
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»