Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с запуском Wiznet W5100
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
vesago
К w5100 я подкинул m328 по spi. Тут все нормально - в регистры пишется и считывается. Я сначала дергаю ногу сброса, потом делаю софтовый сброс, потом гружу в w5100 мак адрес, адрес шлюза, маску подсети и ip адрес. Все стандарно. Хотелось бы послать пинг и получить ответ. К сожалению, когда подключаю кабель, компьютер ни как не реагирует. Кабель всякий пробовал. В том числе и перевернутый. Резистор 1М параллельно кварцу повесил - без него регистры не писались/читались. Когда втыкаю пачкорд, что идет на общую сеть, начинает
мигать желтый светодиод, пару раз загорался зеленый. Воткнул перекрестным к ноутбуку - ноль реакции. Не видит сетевуха компьютера. Все прозвонил на наличие нужных питаний и отсутсвие замыканий. Остается поменять микросхему и транс. Что еще можно глянуть? Нуждаюсь в свежей мысли по сабжу.
Сергей Борщ
QUOTE (vesago @ Sep 6 2012, 08:51) *
Остается поменять микросхему и транс. Что еще можно глянуть?
В схеме криминала не видно. А трансформатор точно того типа, что указан на схеме? Другой тип может быть с другой цоколевкой, отношением витков и соединением обмоток. И что с инициализацией? Возможно, собака порылась в ней?
vesago
Цитата(Сергей Борщ @ Sep 6 2012, 09:28) *
В схеме криминала не видно. А трансформатор точно того типа, что указан на схеме? Другой тип может быть с другой цоколевкой, отношением витков и соединением обмоток. И что с инициализацией? Возможно, собака порылась в ней?


Вот такой транс. Попробую микросхему поменять. Может поджарил случайно. Как я выше писал, если воткнуть пачкорд сети, начинает через полминуты мигать желтый светодиод изредка. Значит принимает вероятно схема, но не передает.

Инициализация:

Код
u8_t config_gateway[4]= {192,168,2,4};
u8_t config_subnet_mask[4] = {255,255,255,0};
u8_t config_mac_address[6] = {0x00, 0x08, 0xDC, 0x01, 0x02, 0x03};
u8_t config_ip_address[4] = {192,168,2,41};

      W5100_Reset_Init();
      W5100_CS_Init();

      W5100_Reset_On();
      OS_Ttimer_Delay(0.5*SEC);
      W5100_Reset_Off();
      OS_Ttimer_Delay(0.5*SEC);

      setMR(MR_RST);

      OS_Ttimer_Delay(0.5*SEC);

      Wiz_WR(MR,0);
      Wiz_WR(IMR,0);
      Wiz_WR(RTR0,0x0F);
      Wiz_WR(RTR0+1,0xA0);
      Wiz_WR(RCR,0x08);

      setGAR(config_gateway);              // Set default gateway
      setSHAR(config_mac_address);         // Set mac address
      setSUBR(config_subnet_mask);         // Set subnet mask
      setSIPR(config_ip_address);          // Set ip address
vesago
В общем сделал я вторую плату - те же яйца. W5100 тепленькая, пишу в нее данные, читаю - все как надо. А сеть не видит. Пробовал и другой разъем подкидывать, и питатель менял и схему многократно вызванивал. Отличие от референца только, что на земле адрес и данные. Но это, как я понимаю, влияет только на работу с регистрами. Остаеттся только кварц поменять - вдруг перемаркированный sm.gif
Сергей Борщ
А может быть ошибка в процедуре записи/чтения регистров? Может вы пишете не туда? И вместо правильной маски и IP записывается что-то другое?
alexPec
Цитата(vesago @ Sep 11 2012, 15:30) *
В общем сделал я вторую плату - те же яйца. W5100 тепленькая, пишу в нее данные, читаю - все как надо. А сеть не видит. Пробовал и другой разъем подкидывать, и питатель менял и схему многократно вызванивал. Отличие от референца только, что на земле адрес и данные. Но это, как я понимаю, влияет только на работу с регистрами. Остаеттся только кварц поменять - вдруг перемаркированный sm.gif


У вас скорость/дуплекс принудительно ногами выставлена или в auto negotiation? Такая же беда была когда выставлял принудительно 10мбит. Комп не видел сети. Весь извелся, уже почти отчаялся, втыкаю мой W5100 в китайский свитч - работает свинота! Показывает 10 мбит. Втыкаю в комп - не работает - нет сети. Втыкаю в свитч комп и W5100 - все пингуется, все ок. Что за беда - непонятно, на компе пробовал в параметрах сетевухи и auto negotiation, и принудительно 10 мбит - ну не видит и все тут. А когда ставил на W5100 auto negotiation и на компе auto negotiation - сеть появляется, все работает на 100 мбит. Любые другие настройки на компе или W5100 (в части дуплекса и 10/100мбит)- сеть пропадает. А если через свитч - в любой конфигурации работает. Вот такая загадка китая... Кстати, не удивляйтесь что греется, это для нее похоже нормально, уже больше 100 девайсов на ней спаяли - все ок, некоторые уже 5 лет пашут...
vesago
Цитата(Сергей Борщ @ Sep 11 2012, 21:18) *
А может быть ошибка в процедуре записи/чтения регистров? Может вы пишете не туда? И вместо правильной маски и IP записывается что-то другое?

В этом плане я почти уверен. Я сначала записываю IP, маску, MAC, потом считываю по SPI 100 байт в буфер и вижу драконом как записанные данные в ячейках соответсвующих карте памяти, так и значия, выставляемые при сбросе самой микросхемой - размер буфер приема и передачи = 0x55, тоже в правильном месте. Тем не мене, прикручу родной драйвер, да попробую им.

По поводу auto negotiation - ноги OPMODE2-0 микросхемы, которыми задается режим работы PHY у меня сидят на земле - срисовал так с референсной схемы. Я пробовал в настройках сетевой карты компьютера менять настройки скорости. При переключении кратковременно загорается желтый сведодиод моей платы - FDXLED. Если поставить 10 мбит, то постоянно горит зеленый - LINKLED. Все это вселяет надежду, что дело не такое уж и пропащее sm.gif Отчикаю от земли ноги OPMODE2-0 и попробую другие комбинации. Также думаю отчикать от земли адресные ноги и ноги данных - много пересмотрел схем на сабже, везде они в воздухе.
Lmx2315
Цитата(alexPec @ Sep 12 2012, 01:14) *
Кстати, не удивляйтесь что греется, это для нее похоже нормально, уже больше 100 девайсов на ней спаяли - все ок, некоторые уже 5 лет пашут...

..уважаемый, не могли бы вы выложить вашу схему включения этой микросхемы , спасибо.
alexPec
Цитата(Lmx2315 @ Sep 12 2012, 11:10) *
..уважаемый, не могли бы вы выложить вашу схему включения этой микросхемы , спасибо.

Да рефренс один в один, адреса, данные - в воздухе, читаю/пишу тоже через SPI, тока резисторы на трансе не 49.9 Ом, а что под рукой доступное есть - 56 Ом паяем, на 10 мбит все нормально в условиях пром. помех на длине линии аж 270 м. 100 мбит - поменьше, стабильно работало где-то на 90м, длиннее - линк пропадал время от времени. Если сильно нагревается - пропадает линк, поэтому ставим маленькие радиаторы. Ну и бывает у нее - зависает - хз от чего. Поначалу (в 2007) вобще непонятно из-за чего было. Недавно смотрел - errata появилась. На одну из проблем китайцы (или корейцы ли) говорят: мол решение как обойти проблему не найдено. Но у нас софт постоянно к девайсу по сети лезет, поэтому мне легко отловить зависание. Нет обращений - ресет, железный, прямо ногой reset, и конфигурирование заново. Да, ноги OPMODE все соединил вместе и повесил на одну из ног проца. Получается молу делать либо auto negotiation, либо 10 мбит.
vesago
Да, схема проста как валенки. В полном объеме в референсе представлена. Вот еще образцы..

А в моей проблеме наметился просвет. Лопухнулся я - оставил GNDA висеть в воздухе. Внутри чипа она наверное связана с цифровой землей (или погорела sm.gif ) - сопротивление ом 10, когда тестером по ногам проверял не увидел. А сегодня стал мерять уровни на ногах и увидел, что какого-то на GNDA 0.8 вольта висит. Соединил с общей землей и линк поднялся. Правда только на 10 мбитах принудительно выставленных и без пинга, но уже лучше - втыкаешь кабель, сразу в трее значок появляется.
vesago
В общем запустился дивайс. Пингуется на 100 мегабитах, определяется с полтыка. Как я говорил - причина неработы в висящем в воздухе сигнале GNDA. Работает на плате, где адресные сигналы и данных сидят на земле. На прямом пачкорде компьютер не видит плату. Только на кроссовом.
alexPec
Цитата(vesago @ Sep 14 2012, 09:48) *
На прямом пачкорде компьютер не видит плату. Только на кроссовом.

Странно, у меня и с прямым, и с кроссовым работает при auto negotiation
vesago
Цитата(alexPec @ Sep 15 2012, 11:49) *
Странно, у меня и с прямым, и с кроссовым работает при auto negotiation

Попробовал прямой кабель, действительно отлично работает. Возможно пачкорд кривой до этого пробовал.
Lmx2315
Цитата(vesago @ Sep 13 2012, 09:30) *
Да, схема проста как валенки. В полном объеме в референсе представлена. Вот еще образцы..

..спасибо, а такой вопрос - если шину данных / адреса w5100 я на асинхронную шину блекфина повешу - напрямую заработает или надо костыли какие?
Метценгерштейн
vesago, а почему у Вас два сигнала W_SCS и W_SEN подвешены к +U пит. ?

там же надо (в WIZ811MJ так) /SCS выбирать, а SEN через инвертор подается на др. вход. А у Вас оба в + 3,3.

И если выбор SPI, то /SCS активен в лог. нуле, зачем его подвешивать на + 3,3 ?

Метценгерштейн
Запустил я свой модуль, пишу в него, читаю регистры, могу IP прочитать, что записал, тут все норм.

но в упор не получается принятый байт из него считать.
подскажите, что не так делаю?

Код
void WIZnet_main (void)
{
    WIZ_Init();
    uint8_t recv_msg[8];
      
      //  режим сервера
      socket (1, Sn_MR_TCP, 3001, 0); //for socket: number, protokol, source port, option ???  
      listen (1); //socket number    
      
      while (1)
      {
            if (IINCHIP_READ (Sn_SR(1))== SOCK_ESTABLISHED) {  //Sn_SR статус регистр          
              
              recv (1, &recv_msg[0], 8);  //socket, передаю адрес массива- куда читать, и длина данных
              
              Usart1_Send_String( (char *)recv_msg );
              
              disconnect (1);
              close (1);
              
              //Usart1_Send_String( (char *)recv_msg );
              
            }              
            
      }  

  }

хочу в терминалку отправить принятые данные.
Метценгерштейн
пишу новую процедуру.
в общем, не могу победить переполнение буфера.

как только указатель переваливает за 2048, и если я от текущего значения отниму 2048, и, например, получу, 9
то размер принятых данных сразу становится = много.

Кто как решил этот вопрос?
vesago
Цитата(Метценгерштейн @ Jan 22 2013, 12:49) *
vesago, а почему у Вас два сигнала W_SCS и W_SEN подвешены к +U пит. ?

там же надо (в WIZ811MJ так) /SCS выбирать, а SEN через инвертор подается на др. вход. А у Вас оба в + 3,3.

И если выбор SPI, то /SCS активен в лог. нуле, зачем его подвешивать на + 3,3 ?

Я запостил кусок схемы с обвязкой w5100. У меня выбор spi идет через 74lvc125. На другом листе схемы.

По буферу - я особо не вдавался. Прикрутил визнетовский код. Он вполне рабочий. Два сокета. По одному конфигурирую дивайс. По второму гоняю данные изернет-485. По 4к на сокет. При приеме данных я сначала считываю объем wiznet.rsize = getSn_RX_RSR(0); Потом, если не равен 0 вычерпываю из буфера recv(0, wiznet.buf, wiznet.rsize); в количестве wiznet.rsize. Вы выше постили recv (1, &recv_msg[0], 8); Однако в текущий момент может и не быть 8 байт. Смутно припоминаю, что были у меня какие-то проблемы, когда пытался из буфер черпануть больше, чем принято.
Метценгерштейн
я уже не пользую штатную ф-ю, т.к. она не заработала. Пишу свою. Там что-то поднакручено у них.

Можно попросить кодом поделиться? Может какую идею подгляжу.
vesago
...
Метценгерштейн
к слову сказать, запустил я родные дрова под него, начал смотреть на то, что с поинтером происходит. Он спокойно перевалил за 2048 и дальше поскакал. надо 65536 подождать и посмотреть на него тогда.
AHTOXA
Цитата(Метценгерштейн @ Feb 2 2013, 20:36) *
Запустил я свой модуль, пишу в него, читаю регистры, могу IP прочитать, что записал, тут все норм.

Вы бы рассказали, в чём была проблема с SPI, вдруг кому-то ещё пригодится.
Метценгерштейн
обязательно расскажу. Только пока что победил визнет. Сегодня- завтра проверю этот указатель (странно, что переполняется и хоть бы хрен), обкатаю еще две идеи, выложу все здесь. Пока что работают и мои драйвера, и родные.

SPI пока я не занимался, т.к. увлекся визнетом. Схема пока на 2097 КГц работает.
В той теме отпишусь про SPI. Пока надо попробовать разные тактовые и делители.
Метценгерштейн
разобрался я с указателем этим. Резюмирую:

он должен крутиться пока не перевалит за 16 бит. Обнулять его и приводить к размеру сокета нельзя, т.к. сразу размер принятых данных (регистр Sn_RX_RSR0) будет равен 2048.
исходя из данного указателя мы сами должны высчитать физический адрес начала данных. При этом, если указатель будет равен 4097, то, при сокете 2К, адрес должен начинаться с начала, т.е. 0x6001 - это для нулевого сокета.

делается это так:
Код
uint16_t RX_beginDataAddr =(RX_pointer&(S0_RX_MASK+(SNum*0x0800)))+(S0_RX_BASE+(SNum*0x0800)); // вычислим физ. адрес начала данных


ну и собственно код работы с визнетом. Мой драйвер + закомментированы штатные дрова- можете их использовать- просто пример как с ними работать.
Код
void WIZnet_main (void)
{
    WIZ_Init();
    uint8_t recv_IP[32];
    for (uint8_t i = 0; i < sizeof (recv_IP); i++)
    {
      recv_IP[i] = 0;
    }
    uint16_t RX_pointer =0;
    
#define SNum    0
    
#define S0_RX_BASE     0x6000     //начало памяти Rx
#define S0_RX_MASK     0x07FF     //2K-1
  
           // режим сервера
            socket (SNum, Sn_MR_TCP, 3001, 0); //for socket: number, protokol, source port, option ???      
    
            while ( !listen (SNum) ) { }      
            
            while (IINCHIP_READ (Sn_SR(SNum)) != SOCK_ESTABLISHED) { }    
            while (IINCHIP_READ (Sn_SR(SNum)) == SOCK_ESTABLISHED) {      
              
              
            uint16_t RX_dataSize; // размер принятых данных
            while (!(RX_dataSize = IINCHIP_READ16 (Sn_RX_RSR0(SNum))));

            RX_pointer = IINCHIP_READ16 (Sn_RX_RD0(SNum)); // считали указатель RX        
            
            uint16_t RX_beginDataAddr =(RX_pointer&(S0_RX_MASK+(SNum*0x0800)))+(S0_RX_BASE+(SNum*0x0800)); // вычислим физ. адрес начала данных
            
            //тут обыграем переполнение буфера RX memory
            uint16 src_mask = RX_pointer & getIINCHIP_RxMASK(SNum);          
           if( (src_mask + RX_dataSize) > getIINCHIP_RxMAX(SNum) )          
            {        
              uint16_t upper_size = (S0_RX_MASK + 1 - RX_pointer); //размер первых байт, кот влезли в конец буфера
            
              for (uint16_t i=0; i<upper_size; i++) {
                recv_IP[i] = IINCHIP_READ (RX_beginDataAddr + i); // пишем их в массив
                }
                
              for (uint16_t i=upper_size; i<RX_dataSize; i++) {
                recv_IP[i] = IINCHIP_READ ((S0_RX_BASE+(SNum*0x0800)) + (i - upper_size)); // пишем оставшиеся байты с начала буфера
                }
              
            }
          
          else
            {                                           // если данные не вылезли за размер буфера
              for (uint16_t i=0; i<RX_dataSize; i++) {
                recv_IP[i] = IINCHIP_READ (RX_beginDataAddr + i); // положили данные в массив
                }              
              
            }            
            
            RX_pointer += RX_dataSize;   // изменим указатель на длину принятых данных
          
            IINCHIP_WRITE16 ((Sn_RX_RD0(SNum)), RX_pointer);        
            IINCHIP_WRITE (Sn_CR(SNum), Sn_CR_RECV); // команда на изменение регистра
            while( IINCHIP_READ(Sn_CR(SNum)));
          
            RX_pointer = IINCHIP_READ16 (Sn_RX_RD0(SNum)); // считали указатель RX
            printf("RX_pointer -> %4d      recv_IP -> %s\r\n", RX_pointer, recv_IP);    
              
            
            
            
            
            
//
//              uint16_t RX_dataSize; // размер принятых данных
//              while (!(RX_dataSize = IINCHIP_READ16 (Sn_RX_RSR0(SNum))));
//                      
//              recv (SNum, recv_IP, RX_dataSize);
//              printf("recv_IP -> %s   \r\n  \r\n", recv_IP);    
              
            }//while
    
              
              
              
            disconnect (SNum);
            close (SNum);
            
            printf("connection closed");
            
          
          
  }
Метценгерштейн
и еще, касательно документации на wiznet. Особенно для тех, кто говорит, что там все настолько шикарно расписано)

стр. 52 даташита 1.2.1

написано, что в UDP первые 8 байт- заголовок, кот содержит:
цитата:
Destination IP adress 4 байта.
Что такое Destination? Так вот, именно в корее, это означает, что это адрес исходящего IP- т.е. source.

Лично принял пакет и посмотрел, что в нем содержится.

Это не только на этой странице. Описание регистров, где IP принимаются, там тоже все в таком духе.
Метценгерштейн
новая засада- такой код с UDP работает нормально
Код
for (;;) {
            uint16_t RX_dataSize; // размер принятых данных
            while (!(RX_dataSize = IINCHIP_READ16 (Sn_RX_RSR0(0))));
                      
            recv (0, recv_IP, RX_dataSize);
          
            for (int i = 8; i < RX_dataSize; i++) {
            Usart1_Send_symbol ( IINCHIP_READ(0x6000 + i));
                
    }


а такой код
Код
for (;;) {
    
            uint16_t RX_dataSize; // размер принятых данных
            while (!(RX_dataSize = IINCHIP_READ16 (Sn_RX_RSR0(0))));
                      
            recv (0, recv_IP, RX_dataSize);

    sendto(0, recv_IP, RX_dataSize, WIZ_DESTIP, 3000);
                
    }
Метценгерштейн
вроде нашел решение
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.