Wiznet W5100 (WIZ812MJ Breakoutb.) -> Verbindung mittendrin weg!

Gast #4965440
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!
Gast #4965690
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
Gast #4966474
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ß
Gast #4966627
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren