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 ;)