Forum: Mikrocontroller und Digitale Elektronik Seltsames SPI Verhalten (Mega88, RFM12)


von Reinhold (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich betreibe ein RFM12 Funkmodul interruptbasierend an einem Mega88 mit 
Hardware-SPI. Das SPI scheint innerhalb des IRQ-Handlers nicht mehr zu 
funktionieren; es wird das erste Byte der (zwei Byte langen) 
Statusabfrage gesendet, dann ist laut Logikanalysator Feierabend.
Ist es prinzipiell ein Problem in einem IRQ Handler das SPI zu 
verwenden?

Schönen Adventssonntag noch
Reinhold

von Spess53 (Gast)


Lesenswert?

Hi

Wie ist das SS-Pin konfiguriert/beschaltet?

Datenblatt:

If SS is configured as an input, it must be held high to ensure Master 
SPI operation. If the SS pin
is driven low by peripheral circuitry when the SPI is configured as a 
Master with the SS pin
defined as an input, the SPI system interprets this as another master 
selecting the SPI as a
slave and starting to send data to it.

MfG Spess

von Reinhold (Gast)


Lesenswert?

SS ist als Ausgang konfiguriert, der Pin wird als ChipSelect (nSEL) für 
das RFM12 verwendet.
Wenn ich den IRQ deaktiviere und alles in der Main-Funktion veranstalte 
gibt es keine Probleme (warten bis die IRQ Leitung low ist, dann die 
Statusabfrage). Das Problem mit dem SS kenne ich schon, da bin ich auch 
schon mal drauf rein gefallen ;-(

Reinhold

von Bernd M. (bernd_m)


Lesenswert?

Hmm, ich hatte mal das Problem mit einem AT168 und der SPI als Master wo 
nur sporadisch gesendet wurde. Die SPI Konfiguration wurde einmal beim 
init vorgenommen.

Ich habe das so gelöst, dass ich die SPI vor dem Senden als Master 
konfiguriert habe und nach dem Empfang in der ISR zurück auf Slave.
Also ein ständiges Neukonfigurieren vor jedem Byte, war eher ein 
Zufallstreffer.

Gruss
Bernd

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Bernd M. schrieb:
> Ich habe das so gelöst, dass ich die SPI vor dem Senden als Master
> konfiguriert habe und nach dem Empfang in der ISR zurück auf Slave.

Wozu denn das? Der Master kann doch statisch bleiben und trotzdem 
empfangen.

von Bernd M. (bernd_m)


Lesenswert?

Nunja, das mit dem "sporadischem Senden" war das Problem. Es sollte 
immer eine Message mit 20 Bytes gesendet werden, es kam aber nur ein 
Byte sofort raus und der Reset dann irgendwann.

Hab mich nicht weiter mit der Fehleranalyse beschäftigt, weil meine 
eigentliche Aufgabe war die Gegenseite. Mit der beschriebenen 
Vorgehensweise macht er es so wie ich es will.

von Roland (Gast)


Angehängte Dateien:

Lesenswert?

Ungünstig für die Performance in deinem Programm scheint mir die 
Warteschleife in der ISR zu sein (wait for ...),das ist unüblich in 
ISRs. Schau da mal nach,was dort eigentlich passiert und ob das nötig 
ist. Hier könnte sich ein Fehler verstecken.

Ein älteres Beispiel von mir mit SPI-IRQ. Es hängen hier bei mir externe 
Schieberegister am SPI-Port. Das erste Byte wird vom Hauptprogramm 
geschrieben, und alle restlichen werden über den Interrupt bedient.

Just heute hatte ich mir den RFM12 auch angesehen und überlegt, damit 
mal was zu machen, wenn Du Erfolg hast, dann berichte doch mal über die 
Resultate, würde mich interessieren.

Roland.

von Roland (Gast)


Lesenswert?

Wenn Reset kommt, dann vielleicht mal den Watchdog bedienen?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Roland schrieb:
> Wenn Reset kommt

War sicher ein Schreibfehler und sollte Rest heissen?

Bernd M. schrieb:
> es kam aber nur ein
> Byte sofort raus und der Reset dann irgendwann.

von Bernd M. (bernd_m)


Lesenswert?

Knut Ballhause schrieb:
> War sicher ein Schreibfehler und sollte Rest heissen?
>
> Bernd M. schrieb:
>> es kam aber nur ein
>> Byte sofort raus und der Reset dann irgendwann.

Jepp, man sollte um viertel nach zwei nix mehr posten ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Reinhold schrieb:
> Das SPI scheint innerhalb des IRQ-Handlers nicht mehr zu
> funktionieren

Versuchst du eventuell, innerhalb eines SPI-Zugriffs einen weiteren
zu starten?  Das ist 'ne Falle.

Wenn man sowas macht, sollte man einfach während der SPI-Zugriffe
(so lange dauern die bei voller Geschwindigkeit ja nicht) die
Interrupts blockieren, zumindest die vom Funkmodul.

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.