Ulrich Radigs TCP/IP Stack auf MyAvr, ENC startet immer neu, Soft Spi Problem

Gast #2494113
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 ;)
Angehängte Dateien:
Gast #2494750
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
Gast #2496003
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

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