Forum: Mikrocontroller und Digitale Elektronik Wiznet W5100 (WIZ812MJ Breakoutb.) -> Verbindung mittendrin weg!


von Fefe (Gast)


Lesenswert?

Hallo,

ich nutze den Wiznet W5100 auf einem WIZ812MJ Breakoutboard mit einem 
eigenen Treiber. Aktuell betreibe ich den W5100 als TCP server und ein 
Java-Applet zum Testen des TCP Sockets (Client). Dies funktioniert 
eigentlich alles einwandfrei, Verbindung wird sauber aufgebaut, 
senden/empfangen der Daten alles okay - aber mittendrin (oft erst nach 
10 - 30 Minuten) bricht die Verbindung zum W5100 komplett ab, auch kein 
Ping geht dann mehr. Im Socket Statusregister steht dann 0x00, also 
Connection closed, obwohl ein solcher Befehl nicht explizit gesendet 
wurde.

Ich habe mir eine Funktion geschrieben, die alle Register ausgibt, 
sobald der Status von SOCK_ESTABLISHED auf SOCK_CLOSED wechselt. 
Komischerweise sind dort alle Parameter der Netzwerkeinstellungen auf 
0x00 gesetzt (also zB GAR, SIPR usw), so dass ich auch nicht einfach 
wieder den Socket öffnen kann.

Das ist mein Ablauf (main.c). SPI funktioniert einwandfrei, auch die 
Initilisierung wird richtig übernommen, alle W5100-spezifischen Register 
habe ich auf die Default-values gesetzt.

(uC ist ein STM32F4)
1
    /*Initialize the W5100*/
2
  W5100_SPIconfig_t w5100 = W5100_Init(SPI1, GPIOA, GPIO_Pin_4);
3
  
4
  /*Initialize the network*/
5
  W5100_NetworkInit(&w5100, macAddr, ipAddr, gatewayAddr, subnetMask);
6
  
7
  /*Use Socket0 and configure it as a TCP socket*/    
8
  W5100_SocketConfig_t socket0 = W5100_SocketInit(&w5100, SOCKET0, PROT_TCP, 0x50);
9
  
10
  /*Enable interrupt for socket0*/
11
  W5100_Socket_EnableInterrupt(&w5100, SOCKET0);
12
  
13
  /*Wait until the client is connected*/
14
  W5100_Socket_StateListen(&w5100, &socket0);
15
  
16
  status = W5100_Socket_Status(&w5100, &socket0);
17
    
18
  if(status == SOCK_LISTEN){  
19
    socketRunning = 1;
20
  }
21
  
22
  /*generate ms_Systick*/
23
    SysTick_Config(SystemCoreClock/1000);
24
  
25
  socketTime = _TimeNow_ms();
26
  
27
  while(socketRunning)
28
  {
29
    status = W5100_Socket_Status(&w5100, &socket0);
30
    
31
    /*Wait for client to connect*/
32
    if(status == SOCK_ESTABLISHED)
33
    {
34
35
      if(W5100_Socket_Interrupt_Received(&w5100, &socket0))
36
      {
37
        /*Receive data from socket0*/
38
        W5100_Socket_ReceiveData(&w5100, &socket0, readBuffer, 16);
39
40
        /*TODO: Do command parsing*/
41
        
42
        W5100_Socket_InterruptClear_Received(&w5100, &socket0);
43
      }
44
      
45
      W5100_Socket_InterruptClear_Timeout(&w5100, &socket0);
46
    }
47
    
48
    /*Check for active connection in client mode*/
49
    if(status == SOCK_CLOSED){
50
      socketRunning = 0;
51
      W5100_RegisterDump(&w5100, &socket0);
52
    }
53
    
54
  }
55
  
56
  /*Close the socket*/
57
  W5100_Socket_StateClose(&w5100, &socket0);
58
    
59
  /*Infinite loop after closed socket*/
60
    while(1);

Ich kann mir leider mittlerweile nicht mehr erklären, warum nach x 
Minuten plötzlich diese Probleme auftreten. Hat(te) jemand hier einen 
ähnlichen Fall?

Vielen Dank für die Hilfe!

von spess53 (Gast)


Lesenswert?

Hi

Stromversorgung ausreichend?

MfG Spess

von Fefe (Gast)


Lesenswert?

Stromversorgung habe ich geprüft, liegt konstant bei 3,27V. Ich habe nun 
mal testweise das selbe Setup mit einem Arduino Uno aufgebaut und die 
Original Ethernetlibrary verwendet, sprich, nicht meinen eigenen Treiber 
um hier einfach einen Softwarefehler auszuschließen. Und siehe da - 
selbes Problem, der W5100 hört nach ein paar Minuten auf zu arbeiten - 
kein Ping mehr, keine Netzwerkeinstellungen mehr.

Schlussendlich habe ich zwei Punkte, die es für mich sein können:
 1. Mac Addresse (ich probiere gerade eine andere Mac-Addr, nämlich die, 
die im Arduino-Wiki vorgeschlagen wird)
 2. Das Board ist hin! Zuletzt lief nur noch die Initialisierung und 
eine leere While-Schleife auf meinem uC, der "nackte" Ping funktioniert 
ein paar Minuten lang und plötzlich nicht mehr. Es wird aber keine Zeile 
Code ausgeführt, die den Zustand des W5100 ändern könnte. Daher kann ich 
wohl einen Softwarefehler ausschließen.

Ich lasse gerade einen Test mit anderer Mac-Addr. laufen, melde mich, 
falls es dazu Erkenntnisse gibt.

VG

von Marco H. (damarco)


Lesenswert?

Der zieht relativ viel Strom. Ich hatte mal das shield mit dem w5500 auf 
einen Chinesischen Arduino Due. Dort war die Speicherdrossel extrem dünn 
dimensioniert.  So das sie alles extrem aufheizte nach ca 10min war ruhe 
weil die  PTC-Sicherung  langsam zu hochohmig wurde.

von Flomann (Gast)


Lesenswert?

Der Controller macht wohl einen Reset, die spg. Versorgung wurde
Ja schon genannt hier reichen auch kurzzeitige Einbrüche die mit einem
einfachen Multimeter nicht zu erkennen sind.
Dazu, in der Ref schematic( steht 810 im Plan) von wiznet, auf der 812 
Produkt
Seite, floatet der rst pin zumindest konnte ich beim drüber fliegen kein 
pu
erkennen...

Eventuell auch Mal wert es zu prüfen.

Gruß

von Fefe (Gast)


Lesenswert?

Ich häng mich gleich mal mit einem Oszilloskop dran, sowohl an die 
Spannungsversorgung als auch an den RST-Pin.

Mac Addresse brachte übrigens auch keine neue Erkenntnis, es lag nicht 
an irgendeinem Konflikt im Netzwerk.

Der Reset-Pin hängt über einen PullUp und einen 100n an 3,3V.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.