|
Ethernet контроллер W5100 от Wiznet, проблемы. |
|
|
|
Jul 8 2010, 13:14
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 25-12-07
Пользователь №: 33 630

|
Делаю преобразователь RS 232 >Ethernet. В качестве Ethernet контроллер решил использовать W5100 от Wiznet. Контроллер связал с МК по SPI интерфейсу. Заработал сразу без проблем ,ping , connect к серверу все на ура. После этого я решил отладить передачу данных от W5100 в качестве клиента на сервер. И вот тут начались проблемы . Начинаю передавать данные в размере 10 байт на сервер , но приходит не 10 байт, а 4 пакета по 1460 байт и в последнем пакете последние данные это то что я послал, и это происходит при первой посылке все остальные посылки отправляют столько байт сколько передал. На сколько я понял, проблема в следующем в W5100 есть регистр Sn_TX_RR (Socket n TX Read Pointer Register) [R] в котором находиться адрес начал передаваемых данных и регистр Sn_TX_WR (Socket n TX Write Pointer Register) [R/W] в котором находится адрес конца передаваемых данных .При первой передаче в регистре Sn_TX_RR находиться случайный адрес и он превышает или находится фиг знает где относительно адрес конца передачи, получается что контроллер по кругу считывает данные со своих регистров доходит до адреса конца чтения и после этого контроллер устанавливает правильное значение в этом регистре и все остальные передачи идут без проблем . Вопрос -как установить правильное значение регистра Sn_TX_RR для первого пакета данных , ведь этот регистр только для чтения и значения в нем контроллер W5100 меняет аппаратно ?
|
|
|
|
|
Sep 16 2010, 13:16
|
Группа: Новичок
Сообщений: 3
Регистрация: 16-09-10
Пользователь №: 59 518

|
Здравствуйте, Zemlyanov! Пытаюсь разобраться с контроллером W5100, тоже по SPI. Протокол TCP. Устройство - клиент. Дошел до инициализации регистров "Socket 0 Destination IP Address Register" и не могу поменять их значения. Что не так - не могу понять, вроде все делаю в полном соответствие с Datasheet-ом. Не могли бы Вы рассказать о последовательности инициализации W5100, которую Вы применяли? Более подробное описание моей проблемы представлено на ветке http://electronix.ru/forum/index.php?showtopic=80490. С уважением, Ярослав.
--------------------
www.yarst.org - сайт о том, что можно сделать своими руками.
|
|
|
|
|
Feb 6 2011, 16:25
|

Дима
    
Группа: Свой
Сообщений: 1 683
Регистрация: 15-12-04
Из: Санкт-Петербург
Пользователь №: 1 486

|
Цитата 4 пакета по 1460 байт А чем кончилось, а? У меня всплыло похожее число. Мелкие пакеты UDP, в пределах байтов 100, уходят из W5100 в компьютер нормально. С увеличением длины отправляемого пакета начинают появляться сбои: вместо одного нужного в компьютер приходят несколько по 1472 байта (1514 с заголовком). Причём моя программа выгребает из сокета по 6 таких пакетов, а сниффер видит больше 30. Пакет длиннее примерно 1500 байтов вообще не отправить. Я думал, что дело в слишком большой частоте обращения к W5100, замедлил обмен в 4 раза - всё то же самое. Откуда эти 1514? Заранее признателен.
--------------------
|
|
|
|
|
Feb 7 2011, 12:05
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 25-12-07
Пользователь №: 33 630

|
Проблема в не правильном указании адреса начало и конца чтения данных. У вас и на 100 байтах будут проблемы когда вы достигните конца выделенной памяти под сокет, после чего w5100 пошлет в сеть все что находится в выделенной памяти под другие сокеты а затем вернется на начало и все будет норм пока не достигнет опять конца выделенной памяти. В указании адреса нужно было накладывать битовую маску. Ниже рабочий код передачи, посмотрите в чем отличия у вас и сделайте как у меня. И все будет ОК. Кстати такая же проблема у вас будет и при приеме данных, поэтому нужно сделать аналогичные изменения и для функции приема данных. Код void transmit(unsigned char socket_no,unsigned char get_size,unsigned char *packet) {
unsigned int get_offset,fi,get_start_address,i8,; unsigned int get_free_size; unsigned char hi,low; do { get_free_size=check_TX_buffer(2,Sock0); } while(get_free_size < get_size); hi=wiz_rd(0x0424); get_offset=hi; low=wiz_rd(0x0425); get_offset=(get_offset<<8)|low; fi=(get_offset&0x07ff); get_start_address =0x4000+ fi;
for(i8=0;i8<get_size;++i8) { if (get_start_address==0x4800){get_start_address=0x4000;} wiz_wr( get_start_address++,packet[TCP_data+i8]); ++get_offset;
} wiz_wr(Sn_TX_WR0(socket_no),(make8(get_offset,1))); wiz_wr(Sn_TX_WR1(socket_no),(make8(get_offset,0))); wiz_wr(Sn_CR(socket_no),Sn_CR_SEND); while(wiz_rd(Sn_CR(socket_no))); } У меня теперь другая проблема с w5100. wireshark показывает что в обмене данных присутствует TCP Dup ACK и TCP Out-Of-Order пакеты w5100 является клиентом(TCP) в сети и шлет на сервер PC пакет данных 107 байт , после чего сервер шлет ему ответ 17 байт. Почему в обмене присутствуют TCP Dup ACK и TCP Out-Of-Order? Проверялось в таких условиях - PC(сервер) свич w5100(клиент) , поэтому проблем с сетью быть не может. В принципе эта проблема не сильно напрягает но люди у которых к одному серверу подключено более 100 клиентов жалуются что на сервер идет лишняя нагрузка из за этих пакетов. Получается что w5100 не отсылает вовремя АСК пакет и сервер шлет повторно TCP Dup ACK. Что то я в регистрах напутал или это такая особенность W5100. Кто что скажет по этому поводу? Вот какой лог обмена данными показывает программа wireshark. 172.17.226.3 (клиент w5100) 172.17.229.94(сервер ПК) Код 56 3.717 172.17.226.3 172.17.229.94 TCP commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=1 Win=2048 Len=107 58 3.886 172.17.229.94 172.17.226.3 TCP commplex-main > commplex-main [ACK] Seq=1 Ack=108 Win=64679 Len=0 59 3.886 172.17.229.94 172.17.226.3 TCP [TCP Dup ACK 58#1] commplex-main > commplex-main [ACK] Seq=1 Ack=108 Win=64679 Len=0 60 4.015 172.17.229.94 172.17.226.3 TCP commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=108 Win=64679 Len=17 61 4.015 172.17.229.94 172.17.226.3 TCP [TCP Out-Of-Order] commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=108 Win=64679 Len=17 64 4.217 172.17.226.3 172.17.229.94 TCP commplex-main > commplex-main [ACK] Seq=108 Ack=18 Win=2048 Len=0
Сообщение отредактировал Zemlyanov - Feb 7 2011, 12:07
|
|
|
|
|
Feb 7 2011, 16:25
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 25-12-07
Пользователь №: 33 630

|
Код hi=wiz_rd(0x0424);// считываете данные из регистра Sn_TX_WR (Socket n TX Write Pointer Register) старший байт get_offset=hi; low=wiz_rd(0x0425);//считываете данные из регистра Sn_TX_WR (Socket n TX Write Pointer Register) младший байт байт get_offset=(get_offset<<8)|low;// преобразуем в 16 байтовое число fi=(get_offset&0x07ff); // Накладываем на это число битовую маску , эта маска для сокета 0 и 2кб памяти get_start_address =0x4000+ fi;// к началу физ.памяти сокета прибавляем полученое выше значение дальше начинаем записывать в w5100 данные начиная с определенного нами адреса по ходу дела проверяя не достигли ли мы конца памяти выделенной под сокет ,если достигли то начинаем писать с начального адреса. После того как записали данные в w5100 , записываем в регистр Sn_TX_WR адрес где находиться конец данных для передачи. Затем командой send передаем данные. Во основном допускают две ошибки - не делают битовую маску или не делают проверки конечного адреса выделенного под сокет. Микросхема w5100 мне понравилась , стабильно работает, у меня уже больше 400 девайсов молотят круглые сутки , и никаких глюков при работе данной микросхемы я не замечал. Одно не нравиться что жрет много, до 180 ма при передаче.
Сообщение отредактировал Zemlyanov - Feb 7 2011, 16:41
|
|
|
|
|
Mar 14 2011, 09:29
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(DSIoffe @ Feb 13 2011, 23:58)  ...Когда размер пакета UDP превышает те самые 1472 байта, W5100 разбивает пакет на две части: в первой части опять 1472 байта, а во второй - остаток.... немного по данному вопросу. 1) необходимо убедиться что именно так на самом деле. критерий - хороший снифер. только на него необходимо опираться. и второй момент - подсоединять кросовером(перевёрнутым) кабелем прямо к плате(без роутеров, набов, свитчей). данную длину выставляет софтверный слой хоста либо любьая железка по пути маршрутиризации. если соединить на прямую то вы снифером это должны наблюдать. 2) в своё время я не нашёл ни одного открытого протокола со сборкой пакетов на IP уровне. так что если делаете свой стэк - имейте ввиду это дробление, либо не используйте пакеты длиннее 1500 байт (хотя если выставить меньшую длину - то плакали многие девайсы и их разработчики). удачи вам (круглый)
|
|
|
|
|
Apr 6 2011, 09:41
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
А где-то есть описание использования драйвера от производителя энтой микрухи. А то по коду, что-то не все понятно, особенно с некоторыми параметрами функций и последовательностью инициализации.....
|
|
|
|
|
Apr 6 2011, 10:45
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Прочитал, конечно впечатляет, но немного не то. Я хотел использовать ихнюю готовую библиотеку (как раз для Atmela). Там, вроде-бы, все реализовано; даже описание сокетов есть, вот только документации по использованию этого набора утилит я так и не нашел. Или вы все-таки советуете напрямую с регистрами общаться и по даташиту все делать?
Таки нашел оригинальный сайт (http://www.wiznet.co.kr/), но там тоже с документированием библиотек напряг
Сообщение отредактировал Errorkpi - Apr 6 2011, 10:46
|
|
|
|
|
Apr 6 2011, 11:09
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Курю даташит. Вроде все понятно, пока  Будем разбираться.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|