ENC28J60 Nur ein Interrupt, dann stille

Gast #2219453
Lesenswert?

Hallöle.

Ich habe das Problem, das mein ENC28J60 im zusammenspiel mit einem 
ATMEGA32 scheinbar nur 1x einen Interrupt feuert, und dann ruhe gibt.

Die Schaltung ist absolut simpel. Nur das nötigste ist drauf.
Kann den ENC Inizialisieren, daten endlos versenden, usw.

Auch Empfangen kann ich laut LED's daten. Auch empfängt der ENC offenbar 
Packete. Allerdings bekomme ich nur einen einzigsten Interrupt gefeuert, 
beim ersten Packet. Alle weiteren Packete werden nicht mehr mit einem 
Interrupt signalisiert. Auch ein Pooling zeigt, das er offenbar nur ein 
einzigstes Packet empfangen hat, obwohl regelmässig Packete zum ENC 
laufen.

Die LED's zeigen ebenfalls Kommunikation an.

Muss man den Interrupt neu setzen, oder irgend etwas anderes 
"zurücksetzen", nach dem Empfang eines Packetes, oder dem Auslesen 
dieses Packetes aus dem Puffer des ENC's ?


MfG
TPM
Gast #2219454
Lesenswert?

Ganz vergessen zu erwähnen. Wenn ich den ENC reinizialisere, dann geht 
das spiel von vorne los. Nach dem inizialiseren kann ich wieder nur ein 
einzigstes Packet empfangen, udn dieses wird ebenfalls wieder nur mit 
einem Interrupt signalisiert. Alle anderen Packete scheint er nicht mehr 
zu "schnallen".

Es kann ja nicht sein, das ich nach jedem Empfang eines Packetes den ENC 
neu inizialisieren muss. ... :/


MfG
TPM
#2219958
Lesenswert?

Simon K. schrieb:
> Ist zwar lange her, dass ich was mit dem ENC28J60 gemacht habe, aber
> wenn ich mich recht erinnere musst du den Interrupt bestätigen und das
> Interrupt Flag im ENC28J60 zurücksetzen, wenn du alle Daten abgearbeitet
> hast.

Wie meinst du das mit "Bestätigen" ?

@Peter
Was genau meinst du mit Flankeninterrupt bzw. Pegelinterrupt?

Ich Detektiere die Interrupts mit Fallenden Flanken, Falls du das 
meinst.


MfG
TPM
Persönliche Seite #2220141
Lesenswert?

Martin W. schrieb:
> Simon K. schrieb:
>> Ist zwar lange her, dass ich was mit dem ENC28J60 gemacht habe, aber
>> wenn ich mich recht erinnere musst du den Interrupt bestätigen und das
>> Interrupt Flag im ENC28J60 zurücksetzen, wenn du alle Daten abgearbeitet
>> hast.
>
> Wie meinst du das mit "Bestätigen" ?

Hab ich doch geschrieben?! Das Flag zurücksetzen.

Ja ist schwer im Datenblatt zu finden. Ich habe geschätzte 5,3 Sekunden 
gebraucht inkl. Download des Datenblatts.
Angehängte Dateien:
#2221063
Lesenswert?

Martin W. schrieb:
> @Peter
> Was genau meinst du mit Flankeninterrupt bzw. Pegelinterrupt?

Der Interruptpin ist ja die ODER-Verknüpfung mehrere Quellen.
Nun kann es passieren, daß wärend der Abarbeitung eines Ereignisses ein 
weiteres auftritt. Dann bleibt der Pin low und Du kriegst keine neue 
Flanke.
Flankeninterrupt ist also falsch.

Wenn aus irgendeinem Grund kein Pegelinterrupt mehr verfügbar ist, dann 
kann man sich dadurch behelfen, daß im Interrupthandler der Pin händisch 
geprüft wird, ob er immer noch low ist.
1
while( PIN == low ){
2
  // handler
3
}
Also Pegelinterrupt in Software nachbilden.


Peter
Persönliche Seite #2221114
Lesenswert?

@Peter: Nein, das sollte hier nicht der Fall sein. Man muss nach dem 
Interrupt den Chip ansprechen und schauen welcher Interrupt aufgetreten 
ist. Dann die Flags zurücksetzen (mit einem atomaren SPI Befehl) und 
dann alle Daten verarbeiten bis nichts mehr da ist.

So oder so ähnlich sollte das funktionieren. Das steht auch in dem Bild 
das ich hochgeladen habe.
#2221396
Lesenswert?

Simon K. schrieb:
> das ist wohl mehr oder weniger Geschmackssache.

Finde ich nicht.
Wenn man etwas sicherer programmieren kann, dann sollte man dies 
unbedingt tun.
Und wenn ich mir die Bugliste des  ENC28J60 so anschaue, dann glaube ich 
nicht, daß es keine race-conditions geben könnte.

Das Problem hatte ich nämlich auch mit dem Ethernet-Controller LAN91C96. 
Der lief je nach Traffic stundenlang, eher er abstürzte. Der Grund war 
genau der, daß neue Interrupts verloren gingen. Das Problem konnte dann 
mit dem obigen Work-Around gelöst werden (der AVR hat leider keinen 
High-Pegel Interrupt).


Peter
#2228128
Lesenswert?

Gibt es eigentlich bekannte Probleme mit dem ENC und deren 
Packetgrössen, im speziellem beim Empfang?

Ich habe das Kuriose Problem, das mein ENC mal funktioniert, und sich 
mal aufhängt. Zumindest teilweise .. irgend wie ... schwer zu 
beschreiben.

Je nachdem, was ich zu dem Teil sende, kommt es zum einem dazu, das die 
Packete bzw. deren Packetgrösen im Speicher nicht richtig sind.

So erhalte ich z.B. nach dem Start der Schaltung (PCB) und dem empfang 
eines ARP-Requests mit Broadcast MAC grundsätzlich eine Packetgrösse von 
64Byte.

Dabei werden allerdings laut etherreal nur 42 verschickt.

Beim auslesen der 64Byte kann ich nach den 42 koreckten Byte's einen 0 
Auffüllung sehen, und zum schluß erhalte ich 4Byte mit Kuriosen werden.

Sende ich jedoch nach dem Start der Schaltung zuerst ein UDP Packet mit 
einer Nachrichtenlänge von 5Byte (Hallo) dann erhalte ich ebenfalls 64 
Byte's.

Merkwürdig ist auserdem, das bei UDP Nachrichten mit einer Datenlänge 
von 15Byte das Packet offensichtlich vom ENC empfangen wird (LED 
Blinken), allerdings diese im Puffer nicht hinterlegt wird.

Wenn ich die üblichen Broadcastnachrichtem von einem NETBIOS System auf 
das Netzwerk gebe, dessen nachrichtenlängen weit über 200Byte's sind, 
scheinen diese alle vollständig an zu kommen. Auch die grössen stimmen.


Ich habe bereits einen anderen ENC ausprobiert, welcher genau die selben 
fehler erzeugt.

Auserdem habe ich auch einen komplett andere Schaltung (PCB) verwendet.

Ebenfalls mit anderen Taktraten für den ATMega32 (11,0592 / 16).

Zu guterletzt habe ich sogar "fremden" Sourcecode (bascom) organisiert, 
(Internet) und diesen Kompiliert. (Dieser sollte angeblich 
funktionieren)
Allerdings geht das mal garnicht richtig. Und wen man die ganzen Bug's 
durch schlechte preprozessorstatements korrigiert, läuft zwar der Code, 
allerdings sind die eigentlichen Fehler immernoch vorhanden.

Merkwürdig ist auserdem, das der ENC scheinbar abkracht, nachdem ich ein 
ARP Request gesand habe, dieses mit einem Antwort bestätige, und 
anschliessend ein UDP Packet empfange. Danach kommen keine Nachrichten 
mehr durch.

Auserdem scheint das mit dem Filter auch nicht ganz hin zu hauen. Je 
nachdem wie ich filtere, kommen packete durch, die eigentlich nicht 
durch kommen sollen, und manchmal garnicht.
Zwar habe ich zu diesem Problem schon einiges gefunden (scheinbar ein 
BUG im enc), aber ich hoffe, das nicht dies mein problem beinflusst.

Auch kam es schon einmal vor, das der ENC die Packete nicht richtig 
empfängt. (aber absolut äuserst selten). Nach einem software-Reset. 
Funktioniert das ganze wieder. (Fehler beim Init des ENC!?!)


Kennt jemand dieses Problem oder weis jemand was da los sein könnte?


MfG
TPM

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