Forum: Mikrocontroller und Digitale Elektronik SPI (MOSI) lässt sich nicht komplett abschalten.


von Daniel D. (duesi)


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

von der alte Hanns (Gast)


Lesenswert?

Was hat 'Power reduction' mit dem eigentlichen Problem zu tun?
Also ich schalte SPI per SPE in SPCR.

von Karlheinz (Gast)


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 ...

von Thomas D. (t0mmy)


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...

von Peter D. (peda)


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

von Daniel D. (duesi)


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

von Peter D. (peda)


Lesenswert?

Daniel Dürr schrieb:
> es geht nicht um's Strom sparen

Dann laß einfach alle Bits in Ruhe, die Power Reduction Serial 
Peripheral Interface usw. heißen.
Oftmals sagt der Name nämlich etwas über ihre Funktion aus.


Peter

von Daniel D. (duesi)


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)

von Bronco (Gast)


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.

von Peter D. (peda)


Lesenswert?

Daniel Dürr schrieb:
> damit ich wieder an meine GPIO Pins komme.

Dazu must Du nur das Bit 6 – SPE: SPI Enable löschen, also SPCR = 0;

Wenns nur um langsame Baudrate geht, könntest Du auch eine UART als SPI 
nehmen. Da ist der Teiler bis 4096 einstellbar.


Peter

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.