www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega168 Master SPI mit SS als Ausgang?


Autor: Manuel Kasten (draradech)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

laut Datenblatt sollte es doch problemlos möglich sein, SS als Ausgang 
zu nutzen, während SPI im Master Mode aktiv ist. Bei mir funktioniert 
das irgendwie nicht. In meiner Verzweiflung setze ich jetzt an vier 
Stellen während der SPI initialisierung den SS als Ausgang (und auf 1 um 
sicherzustellen, dass Master SPI erhalten bleibt, auch das sollte ja 
wohl unnötig sein). Trotz alledem ist SS danach Eingang, SPI 
funktioniert dementsprechend nicht als Master und ich kann PB2 nicht 
schalten. Irgendeine Idee was hier schiefläuft?
    // SPI
    DDRB |= (1 << PB3);         // MOSI out
    DDRB |= (1 << PB5);         // SCK out

    DDRB |= (1 << PB2);         // SS out
    PORTB |= (1 << PB2);        // SS to 1

    SPCR |= (1 << SPE);         // SPI enable

    DDRB |= (1 << PB2);         // SS out
    PORTB |= (1 << PB2);        // SS to 1

    SPCR |= (1 << MSTR);        // SPI Master mode

    DDRB |= (1 << PB2);         // SS out
    PORTB |= (1 << PB2);        // SS to 1

    SPCR |= (1 << SPR0);        // 1,25 MHz SPI clock

    DDRB |= (1 << PB2);         // SS out
    PORTB |= (1 << PB2);        // SS to 1

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran ist erkennbar, dass es nicht funktioniert?

Autor: Manuel Kasten (draradech)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

PB2 hat einen externen pull-down, damit im reset der Pegel definiert auf 
0 ist. Nach obiger initialisierung sind 0,3V an PB2 zu messen. (Interner 
Pull-up gegen externer Pull-down). Ausserdem funktioniert SPI nicht. 
Nach schreiben eines Bytes nach SPDR wird SPIF in SPSR nicht gesetzt, 
was bei mir in einer Endlosschleife resultiert.
static uint8_t spiSendRecv(uint8_t byte)
{
    SPDR = byte;
    while(!(SPSR & (1 << SPIF)));
    return SPDR;
}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir sieht's so aus (ATmega8, SPI out-only):
void serpa_init()
{
  MAKE_OUT (PORT_SER); 
  MAKE_OUT (PORT_SCK);
  MAKE_OUT (PORT_RCK); SET (PORT_RCK);
  // !!! SS must be OUT to prevent SPI switching to Slave Mode !!!
  MAKE_OUT (PORT_SS);
  // pullup on MISO to avoid floating
  SET (PORT_MISO);
  // enable SPI as Master
  // high Bits first
  // SCK is high when idle
  SPCR = (1 <<  SPE) | (1 <<  MSTR) | (1 <<  CPOL);
  
  // max speed: F_CPU / 2   
  SPSR |= (1 <<  SPI2X);
}

SER steht bei mir für MOSI, und RCK brauchst du nicht (isn normaler 
I/O). Allerdings setze ich SPCR in einem Stück, nicht bitweise. Sollte 
auf einem ATmega618 ähnlich gehen. SS wird in der Anwendung übrigens als 
PWM betrieben, hat also nix mit SPI zu tun -- ausser, daß es OUT sein 
muß.

Johann

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Kasten wrote:

> PB2 hat einen externen pull-down, damit im reset der Pegel definiert auf
> 0 ist.

Was hängt denn da an dem Pin dran? Alle SPI-Slaves, die ich bisher 
verwendet habe, werden bei 0 aktiviert. Weshalb eher Pullup als Pulldown 
üblich ist.

Was für einen Wert hat der Pulldown denn? Wobei ich nicht den Wert 
meine, den er laut Plan hat, oder was du drauf erkennst, sondern welchen 
er wirklich hat.

Wie gross ist der gemessene Stromverbrauch des Controllers?

Autor: Manuel Kasten (draradech)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johann
Ja, mein ursprünglicher Code sah so aus:
    // SPI
    DDRB |= (1 << PB3);         // MOSI out
    DDRB |= (1 << PB5);         // SCK out
    DDRB |= (1 << PB2);         // SS out
    
    SPCR |= (1 << SPE)          // SPI enable
         |  (1 << MSTR)         // SPI Master mode
         |  (1 << SPR0);        // 1,25 MHz SPI clock
Leider hat auch das schon nicht funktioniert, deshalb die Experimente 
oben.

@A. K.
Ich habe mehrere SPI Slaves, keiner hängt an SS :)

Pulldown hat 1K - Es ist auch nicht der einzige, andere Ausgänge haben 
ebenfalls Pulldowns - die funktionieren wunderbar.

Gesamtstromverbrauch liegt bei 90mA (inklusive Sensoren und Bluetooth)

edit: Ich würde ja einfach SS freimachen und einen anderen Pin 
verwenden, allerdings bin ich voll belegt...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Kasten wrote:

> PB2 hat einen externen pull-down, damit im reset der Pegel definiert auf
> 0 ist. Nach obiger initialisierung sind 0,3V an PB2 zu messen. (Interner
> Pull-up gegen externer Pull-down). Ausserdem funktioniert SPI nicht.
> Nach schreiben eines Bytes nach SPDR wird SPIF in SPSR nicht gesetzt,
> was bei mir in einer Endlosschleife resultiert.

Womöglich ist der PullDown zu klein, also mal ein paar Ticks warten bis 
sich der Pegel angepasst hat und überprüfen, ob der Pegel mit SS=1 hoch 
genug ist.

Johann

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Kasten wrote:

> Pulldown hat 1K - Es ist auch nicht der einzige, andere Ausgänge haben
> ebenfalls Pulldowns - die funktionieren wunderbar.

Hat er 1K, oder sollten das 1K sein? Stell den Pin mal auf Eingang und 
zieh ihn extern mit 100 Ohm auf 5V. Wenn er dann immer noch nicht oben 
ist, dann liegt der Hund in dem was da dranhängt begraben. Wenn es geht, 
hast wohl irgendwann den Pin erlegt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Kasten wrote:

> Ich habe mehrere SPI Slaves, keiner hängt an SS :)

Und deshalb gehört es zu den leider seltenen aber immer wieder gern 
gesehenen Gesten, solche Threads mit einem Schaltbild zu bereichern.

Autor: Manuel Kasten (draradech)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat 1K - und der Pin ist auch noch ok. Wenn ich SPI nicht aktiviere, 
funzt er als output. Bin gerade ziemlich ratlos.

Schalbild folgt - mal eben auf den aktuellen Stand bringen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Kasten wrote:

> Er hat 1K - und der Pin ist auch noch ok. Wenn ich SPI nicht aktiviere,
> funzt er als output. Bin gerade ziemlich ratlos.

Dann sind wie also bei folgender Logik:
- Alles richtig angeschlossen.
- Programm korrekt (mangels Code nicht kontrollierbar).
- Controller ok.
- Funktioniert nicht.

Jetzt such dir aus, welche dieser Aussagen falsch ist. Mindestens eine 
ist es.

Autor: Manuel Kasten (draradech)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
OK, hier erstmal das Schaltbild. Code: Ich werds auf ein minimales 
Beispiel herunterbrechen, entweder finde ich dabei den Fehler, oder ich 
poste das dann hier.

Zum Schaltbild: An SPI 2 und 3 hängen SPI-sprechende Sensoren (Gyro und 
Beschleunigung). Am "SS" von SPI1 soll später 1/3 VDD hängen, um den 
Ladungszustand der Batterie zu überwachen (Derzeit an Labornetzteil)

Autor: Sven K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es damit ?

SPCR = (1 << SPE)          // SPI enable
         |  (1 << MSTR)         // SPI Master mode
         |  (1 << SPR0);        // 1,25 MHz SPI clock.

und nicht SPCR |=
....

Gruß Sven

Autor: Manuel Kasten (draradech)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh! Das geht! Wie kommts?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.