Forum: Mikrocontroller und Digitale Elektronik Problem mit ENC28J60


von Alicia R. (alicia_r)


Angehängte Dateien:

Lesenswert?

Hallo Leute!
Ich arbeite mit einen Atmega1280 und ENC28J60. Ich habe die Bibliothek 
von Iain Derrignton benutzt, aber es läuft nicht gut.

Wenn ich ein ARP-Packet (42 Bytes) vom µC sende, dann übertragt dieser 
das Paket zwar, aber leider mit einen Trailer (80 ~ 1600 Byte 
Gesamtgröße), siehe Anhang.
Wenn ich ein ARP-Paket an den µC über Ethernet sende, dann wird dieses 
Paket völlig falsch beim µC empfangen.


Weiß ihr wo kann das Problem liegen?
Vielen Dank.

von Helfer (Gast)


Lesenswert?

Vielleicht ein Bufferoverflow.

Ich würde im Sourcecode vor und nach jeden Puffer eine initialisierte, 
d.h. typische uint32_t Konstante setzen und aufpassen, ob die in dem 
Datagramm auftaucht. Das wäre dann der Hinweis, welcher Puffer 
überschiesst.

Bsp:
1
#define BUFFERDEBUG 1 // 0 = Aus
2
3
uint16_t MACWrite()
4
{
5
6
  volatile uint16_t address = TXSTART;
7
  uint8_t  bytControl;
8
#if BUFFERDEBUG
9
  uint32_t pre_buffer_1 = 0x12345601;
10
#endif
11
  unsigned char uip_buf[] = {0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0x10, 0x12, 0xe2, 0x10, 0x10, 0xd0, 0xc0, 0xa8, 0x00, 0x02, 0x64, 0x31, 0x50, 0x71, 0xbb, 0xe5, 0xc0, 0xa8, 0x00, 0x01};
12
#if BUFFERDEBUG
13
  uint32_t post_buffer_1 = 0x12345602;
14
#endif
15
  bytControl = 0x00;
16
...

Bei dem Buffer uip_buf kann ein Problem auftauchen: In der Source wird 
der mit obiger Zeile definiert und mit folgender Zeile benutzt:
1
  address+=WriteMacBuffer(&uip_buf[0], UIP_LLH_LEN);

Wenn UIP_LLH_LEN größer definiert ist als oben Elemente initialisiert 
werden, wird über die Arraygrenze hinaus zugegriffen.

Ähnliche Stellen kommen noch weiter im Code vor z.B.
1
  if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN)
2
  {
3
    address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
4
  } 
5
  else 
6
  {
7
    address+=WriteMacBuffer(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
8
    address+=WriteMacBuffer(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
9
  }

Mit uip_len habe ich an der Stelle Verständnisprobleme. Innerhalb 
MACWrite() an obiger Stelle ist das eine globale Variable. In dem von 
dir gezeigten Code ist weder die Definition zu sehen noch die Zuweisung, 
die letztlich einen Rückschluß auf den Inahlt an obiger Stelle erlaubt.

von Alicia R. (alicia_r)


Angehängte Dateien:

Lesenswert?

Vielen Dank von deine Antwort,
ich werde jetzt der Bufferdebug probieren.

Ich benutze auch den uIP TCP/IP stack von Adams Dunkel und uip_len ist 
in uip.c definiert.

von Alicia R. (alicia_r)


Lesenswert?

Ich habe das Problem mit dem Senden gelöst. Die Ursache war, dass die 
Pointern falsch gesetzt waren.
Jetzt muss ich herausfinden, warum das Empfangen von Packeten nicht 
funktioniert.

Danke.

von Fabian (Gast)


Lesenswert?

Vielleicht weil es keine Packete sondern nur Pakete gibt?!

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.