SPI (MOSI) lässt sich nicht komplett abschalten.

OP #2962306
Lesenswert?

Hallo Forum,

ich betreibe die SPI beim ATMega 1284(p) und muss diese zur Erzeugung 
eines verhältnismäßig langem Puls mal in ihrer eigentlichen Funktion 
(als SPI) abstellen. Die SPI ist als "Master" konfiguriert und 
funktioniert auch.

Was nicht funktioniert, ist dass ich nach dem "Abstellen" der SPI den 
MOSI Pin (PB5) auf Masse (Logic 0) schalten kann !

Mein Grundgedanke war: alle Register in den Ausgangszustand bringen !

So gehts nicht(!):
1
// Switchoff SPI Interface (to abtain control of lines)
2
      
3
      PRR0 |= (1<<PRSPI); // Disconnect Clock
4
      SPCR = 0;  // Init Value
5
      SPSR = 0;

wenn jedoch der Befehl "Dissconnect Clock", also das PRSPI Bit nicht zu 
Beginn gelöscht wird, sondern gar nicht wie hier:
1
// Switchoff SPI Interface (to abtain control of lines)
2
      SPCR = 0;  // Init Value
3
      SPSR = 0;

dann kann ich den MOSI Pin B5 seltsamerweise korrekt betreiben.
Im Datenblatt finde ich keinen Hinweis auf das "abstellen" der SPI.

Laut Datenblatt gilt für den PRSPI:
1
Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface
2

3
Writing a logic one to this bit shuts down the Serial Peripheral 
4
Interface by stopping the clock to the module. 
5
When waking up the SPI again, the SPI should be re initialized 
6
to ensure proper operation.

Ich hege die Vermutung, dass der Atmel den Clock braucht, um die 
Statusregister noch laden zu können !

Hat jemand von Euch schon ähnliche Effekte beobachtet ?

(Such- und Findezeit für dieses Problem ca. 4Stunden ! **grr**)

Gruß Daniel
Gast #2962415
Lesenswert?

Hallo,

Daniel Dürr schrieb:
> Im Datenblatt finde ich keinen Hinweis auf das "abstellen" der SPI.

Doch, das geht mit Bit6 SPE im SPCR register (Seite 171). Es ist klar 
dass das SPI-Modul nicht mehr reagiert wenn du ihm den Clock abstellst.

Also entweder den Clock weiterlaufen lassen oder erst Abstellen und dann 
den Clock weg.

Und Pin (PB5) dann auf Output und dann auf Masse (Logic 0) schalten kann 
!



Gruss ...
#2962416
Lesenswert?

Auch ich würde hier dem SPI nicht den Clock wegnehmen, sondern:

SPI deaktivieren (damit der SPI die Kontrolle über den Pin abgibt)
MOSI per DDRx-Register auf Ausgang schalten (falls noch nicht geschehen)
MOSI-Pin per PORTx auf Low schalten (falls noch nicht geschehen)

Nur mal meine erster Gedanke, muss nicht unbedingt funktionieren...
#2962436
Lesenswert?

Daniel Dürr schrieb:
> Ich hege die Vermutung, dass der Atmel den Clock braucht, um die
> Statusregister noch laden zu können !

Ich vermute das nicht nur, ich finde das einfach logisch.
Alles in einem MC braucht einen Takt.

Beim AVR gibt es nur 2 Ausnahmen, die asynchron ablaufen:
- Schalten der Ports in tristate beim Reset
- Aufwachen mit Pin-Change-Interrupt.

Daniel Dürr schrieb:
> (Such- und Findezeit für dieses Problem ca. 4Stunden ! **grr**)

Stromsparmodi implementiert man immer erst ganz zum Schluß, nachdem 
das Programm schon einwandfrei läuft.


Peter
OP #2962686
Lesenswert?

Danke Leute,
es geht nicht um's Strom sparen, sondern darum, dass ich zwischen eine 
SPI Kommunikation hindurch die MOSI/MISO Leitungen  statisch brauche.

Daher ist das eher eine Sollfunktion, als reines verschönern.
wollte nur noch mal ne Anregung holen.

Hätte der Atmel ja auch schreiben können, dass man den Takt bis zum 
Schluß anlassen soll ;) gell

Daniel
OP #2962768
Lesenswert?

Hallo Peter,
grundsätzlich hast Du natürlich recht, wenn kein Stromsparen gewünscht 
ist, sollte auch nix am PRR Register gemacht werden, jedoch steht das 
Datenblatt von Atmel dem einfach entgegen:
1
The Power Reduction SPI bit, PRSPI, in ”PRR0 – Power Reduction Register 0” on page 46 on
2
page 50 must be written to zero to enable SPI module.

Das ist ja, wie ich beschrieben habe, auch der Grund weshalb ich 
überhaupt auf die Idee kam dem SPI "einfach nur den Takt abzuschalten", 
damit ich wieder an meine GPIO Pins komme.

So ganz pauschal stimmt das mit dem PRR also leider auch nicht.

Aber dennoch dem ganzen Forum, und Dir liebem Peter, ein nettes 
Dankeschön für die Hilfe.
(Die Wunschfunktion tut jetzt)
Gast #2963136
Lesenswert?

Ob ein Pin als GPIO oder SPI betrieben wird, entscheidet der Mux am 
Ausgang.
Siehe Datenblatt "Alternate Port Functions".
Wenn Du den Pin als GPIO betreiben willst, mußt Du den SPI abschalten, 
damit der Mux wieder das PORT-Register durchgibt.

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