Forum: Mikrocontroller und Digitale Elektronik AT91SAM7SE Interrupt für Break und Char


von Florian F. (e-lore)


Lesenswert?

Hallo!

Ich bin vor kurzem über ein blödes Probelm mit dem SAM7SE von Atmel 
gestolpert und weiss nicht mehr weiter.

Es wird ein LIN Feldbus über einen USART ausgelesen. Das Breaksignal von 
einem LIN Bus wird mindestens 14 nominale Bitlängen lang (13 davon als 0 
und ein Stop Bit).

Ich habe den USART mit zu Zeit 2 verschiedenen Interrupts konfigurier 
(mit RXRDY und RXBRK).

Die Interrupt Routine muss dann letztlich auseinanderpflücken, welcher 
jetzt den Interrupt ausgelöst hat. Das passiert z.B. mit folgender 
Zeile:

if (COM0->US_CSR & AT91C_US_RXBRK != 0) // mit AT91PS_USART COM0;

in dieser Abfrage werden die Statusbits (also auch das RXBRK) 
zurückgesetzt:

COM0->US_CR = AT91C_US_RSTSTA;

Es passiert nun folgendes. Ich bekomme einen Interrupt, es wird ein 
Break Signal erkannt! Alles läuft nach Plan.

Dann bekomme ich einen zweiten Interrupt. Es ist laut Abfrage KEIN Break 
und die andere routine läuft durch. Es ist allerdings auch kein 0x55 wie 
erwartet, sondern einfach nur 0x00.

Danach gibt es KEINEN Interrupt mehr! Wenn ich direkt nach dem 
rücksetzen der Statusbits ein kurzes "wait" einsetze, z.B. 1 ms, dann 
kommt nichtmal ein zweiter interrupt!

Vielleicht habt ihr noch eine spontane Idee...

Grüße

Florian

von Florian F. (e-lore)


Lesenswert?

Das war mal wieder typisch...

Ich stolper grundsätzlich in die lustigsten Fehler... ich habe gerade 
Antwort von Atmel bekommen.

Falls jemand den gleichen Fehler hat, es ist ein Errata, der noch nicht 
aufgeführt ist!

Hier ein Auszug aus der Mail vom Support:

---------------------------------------schnipp-------------------------- 
-----
There is an errata related to RXBRK management which is not referenced 
so far in the datasheet but will be in the next revision:

RXBRK flag error in Asynchronous Mode
When timeguard is 0, RXBRK is not set when the break character is 
located just after the Stop
Bit. FRAME (Frame Error) is set instead.
Problem Fix/Workaround
Timeguard should be > 0.

Check that timeguard is > to  0

Then, if it does not solve your issue, take care you correctly 
acknowledge the different interrupts.

---------------------------------------schnapp-------------------------- 
-----


Vielleicht erspare ich so jemandem die lange Suche...


Grüße


Florian

von Florian F. (e-lore)


Lesenswert?

...was mein Problem leider nicht gelöst hat...

von Florian F. (e-lore)


Lesenswert?

OK...Kommando zurück..war noch ein Hardwareproblem...warum sind es 
eigentlich immer zwei oder mehr Fehler, die sich ineinanderhängen und 
eine Diagnose erstmal um ein vielfaches verkomplizieren?...gemein...

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.