Forum: Mikrocontroller und Digitale Elektronik Ulrich Radigs TCP/IP Stack auf MyAvr, ENC startet immer neu, Soft Spi Problem


von Mat (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen Zusammen,

ganz voran kurz das Problem:
Der Avr erkennt keine Pakete, die vom ENC weitergeleitet werden. Senden 
funktioniert problemlos. Vermutung Richtung Soft SPI.

Hab probiert den TCP/IP Stack von Ulrich Radig auf dem myEthernet Board 
von myAvr zum laufen zu bekommen.
Habe also für den ENC die Soft-Spi Routinen ergänzt, da er nicht am HW 
Spi Port hängt.
Des weiteren hab ich eine Version mit Polling für den Interrupt, sowie 
eine Version mit dem PCINT auf fallende Flanke erstellt, die auch 
momentan aktiviert ist.
Soweit ich das beurteilen konnte, haben beide zumindest Interrupts 
erkannt, ob alle kann ich nicht sagen.

Nach dem das ganze nicht funktioniert hat, hat mich die Problemsuche zum 
empfangen der ARP Replay geführt und
somit zum eth_get_data in der Datei stack.c.
Weiters startet der ENC nach bzw. eigentlich vor jedem Paket neu was auf 
folgende Codezeile in
enc_recive_paket in der enc28j60.c zurückzuführen ist:
1
  if ((!(status & (1<<7))) || (status & 0x8000) || (len > bufsize))
2
  {     
3
    ENC_DEBUG("enc_receive: status=%4x len:%i buf:%i\n", (unsigned) status, len, bufsize);
4
    enc_init();
5
  }

Die Debugzeile erzeugt folgende Meldung:
1
enc_recive: status=ffff len:-253 buf:1200
wobei len ein 16bit unsigned Wert ist, also 65283??

ok, mir ist soweit klar, dass er, weil das Zerobit eben nicht Zero ist 
den ENC neu initialisiert (und sonst spätestens bei der Länge).
Wenn ich mir aber anschaue, was der ENC sonst so zurückgibt glaub ich, 
dass die Kommunikation nicht richtig funktioniert.

Das einzige was "richtig" zurückkommt ist die ENC Revid, nämlich "6".

Ebenfalls versendet der ENC richtig, also ARP Requests werden 
fehlerfrei versendet und der PC schickt auch einen
Reply zurück, den der AVR allerdings nicht erkennt.

Als Soft-SPI Routinen werden folgende verwendet, wobei WAIT einfach x 
mal _NOP ausführt:
1
unsigned char spi_get (void)
2
{
3
  int8_t a;
4
  unsigned char Byte = 0;
5
  for (a=8; a>0; a--) //das Byte wird Bitweise nacheinander Empangen MSB First
6
    {
7
      WAIT(100);
8
      SPI_PORT |=(1<<SPI_SCK); //setzt Clock Impuls wieder auf (High)  
9
      if (SPI_PIN & (1<<SPI_MISO)) //Lesen des Pegels von soft_spi_DI
10
        {
11
          Byte |= (1<<(a-1));
12
        }
13
        else
14
        {
15
          Byte &=~(1<<(a-1));
16
        }  
17
      WAIT(100); 
18
      SPI_PORT &=~(1<<SPI_SCK); //erzeugt ein Clock Impuls (Low)  
19
    }
20
21
  return (Byte);
22
}
23
24
25
26
void spi_put (unsigned char Byte)
27
{
28
  int a;
29
  for (a=8; a>0; a--) //das Byte wird Bitweise nacheinander Gesendet MSB First
30
  {
31
    if (Byte & (1<<(a-1)))  //Ist Bit a in Byte gesetzt
32
    {
33
        SPI_PORT |= (1<<SPI_MOSI); //Set Output High
34
    }
35
    else
36
    {
37
        SPI_PORT &= ~(1<<SPI_MOSI); //Set Output Low    
38
    }  
39
    _NOP();_NOP();_NOP();_NOP(); //tDS
40
    SPI_PORT |= (1<<SPI_SCK); //setzt Clock Impuls wieder auf (High)
41
    WAIT(100); //tCH
42
    SPI_PORT &= ~(1<<SPI_SCK);  //erzeugt ein Clock Impuls (LOW)
43
    //tCL
44
  }
45
  SPI_PORT &= ~(1<<SPI_MOSI); //Set Output Low
46
47
48
}
Hab diese Routinen auch in einem anderen Projekt am laufen, deshalb die 
Kommentierung mit den Zeiten.
Kommt auch von jemand aus dem Forum, bin mir aber nicht mehr sicher von 
wem ...

Die Initialisierung des SPI sieht folgendermaßen aus:
1
  SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);
2
  // pull SCK high
3
  //SPI_PORT |= (1<<SPI_SCK);
4
5
  // configure pin MISO as input
6
  SPI_DDR &= ~(1<<SPI_MISO);
7
  SPI_DDR |= (1<<SPI_SS);
8
  // Slave einschalten
9
  SPI_PORT &= ~(1<<SPI_SS);
mit:
1
  #define SPI_DDR                 DDRD
2
  #define SPI_PORT                PORTD
3
  #define SPI_PIN                 PIND
4
  #define SPI_SCK                 PD4
5
  #define SPI_MISO                PD2
6
  #define SPI_MOSI                PD3
7
  #define SPI_SS                  PD5

aufgefallen ist mir auch noch, dass es der ENC nicht mag, wenn er also 
SPI Slave durchgehend eingeschaltet ist, was er natürlich in dem Timings 
im Datenblatt auch nicht ist, dies ist mir aber sonst noch nicht 
aufgefallen bei anderen SPI Bausteinen.


Vielleicht hat jemand einen neuen Fehlersuchansatz für mich oder kennt 
dies oder ein ähnliches Problem und kann mir sagen, was bei euch der 
Fehler war?

Wäre dankbar für jegliche Hilfe.

schönen Tag noch,
Mat

PS.: Ist ein bisschen länger geworden als geplant ;)

von Mat (Gast)


Lesenswert?

wollte noch dazusagen, dass die Hardware funktioniert, da ich die ja mit 
der Original Firmware testen kann.
Vielleicht sollte ich nächstes Mal nicht so einen Roman schreiben ;) 
dachte ist besser wenn alles beschrieben ist ...

lg Mat

von Mat (Gast)


Lesenswert?

die SPI Kommunikation sollte funktionieren, da ich sowohl senden kann, 
als auch einen Registerdump ausgeben kann.

Was könnte sonst falsch sein, dass er nicht die richtigen Werte vom ENC 
empfängt?
Interrupt wird ausgelöst, zumindest sehe ich wenn ich Ping, dass er in 
die Int Routine springt.

Allerdings resetet er bei JEDEM Paket beim Code von Sjors.
1
// added by Sjors: reset the ENC when needed
2
// If the receive OK bit is not 1 or the zero bit is not zero, or the packet is larger then the buffer, reset the enc chip and SPI

von Mat (Gast)


Lesenswert?

hab den Code nun auch auf dem Pollin Net IO probiert und hier 
funktioniert er problemslos. also müsste das Problem warscheinlich doch 
am Soft-SPI gelegen sein.

grüße Mat

von micha2057 (Gast)


Lesenswert?

Hallo Mat,
bist du weiter gekommen? Nutze myEthernet mit OpenMCP und wollte mal die 
Version von Ulrich Radig ausprobieren. OpenMCP schein recht langsam.

Gruß
Michael

von Mat (Gast)


Lesenswert?

Hallo Michael,

kann dir leider nicht mehr sagen wies da damals weiterging.
Hab nicht mal mehr im Kopf obs dann schlussendlich funktioniert hat oder 
nicht ;)
Sorry.

lg Mat

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.