AVR SPI hängt (SPIF Abfrage), ss IST Ausgang!

OP #1332039
Hallo zusammen!

Ich verzweifle am SPI Bus. Ein ATmega16 steuert drei 74hc595 an.

Hier mal die wichtigsten Zeilen:

    DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB4)|(1<<PB5)|(1<<PB7);
    // SPI Port Initialisieren
    SPCR  =  (1<<SPE) | (1<<SPR0) | (1<<SPR1) | (1<<MSTR);

    // Segmente an Schieberegister übertragen
    STROBE_L;
    SPDR = ~transmit_e;
    _delay_ms(1);
    SPDR = ~transmit_z;
    _delay_ms(1);
    SPDR = ~transmit_h;
    _delay_ms(1);
    STROBE_H;

So funktioniert es. Aber das ist ja nicht schön. Wenn ich die delays 
durch while(!(SPSR & (1<<SPIF))); ersetze, hängt der sich da fest. Ich 
habe nachgelesen. Der SS Pin ist bei mir als Ausgang konfiguriert. Was 
kann es noch sein? Ich nutze bis jetzt keine Interrupts in dem Programm.

Gruß
Martin
Persönliche Seite
>> Und siehe da - es geht heute.

Die Unzuverlässigkeit bei SPI-Komminukation hatte bei mir die Ursache, 
dass ich SS nicht vor jedem Byte kurz pulste.

Also so:

Der Master muss :
- Erst keinen der Slaves angewählt haben: Ausgang SS=inaktiv (high).
- Einen der Slaves anwählen SS=aktiv (low). (Durch dieses Umschalten 
wird der Eingang des Slaves synchronisiert, der Bit-Zähler auf 0 
gesetzt)
- Ein Byte an den Slave senden
- Warten bis gesendet ist (Durch Abfragen, oder durch Warten auf 
Interrupt)
- Die zurückgemeldete Antwort auswerten.
- Den Slave abwählen SS=inaktiv (high).
Hallo,

Hans-jürgen Herbert schrieb:
>>> Und siehe da - es geht heute.
>
> Die Unzuverlässigkeit bei SPI-Komminukation hatte bei mir die Ursache,
> dass ich SS nicht vor jedem Byte kurz pulste.
>
> Also so:
>
> Der Master muss :
> - Erst keinen der Slaves angewählt haben: Ausgang SS=inaktiv (high).
> - Einen der Slaves anwählen SS=aktiv (low). (Durch dieses Umschalten
> wird der Eingang des Slaves synchronisiert, der Bit-Zähler auf 0
> gesetzt)
> - Ein Byte an den Slave senden
> - Warten bis gesendet ist (Durch Abfragen, oder durch Warten auf
> Interrupt)
> - Die zurückgemeldete Antwort auswerten.
> - Den Slave abwählen SS=inaktiv (high).

Schlicht Quark... ;-)

Wenn der SPI als Master gesetzt ist und SS als Ausgang, dann ist SS ein 
normaler Portpin asl Ausgang, für den sich SPI nicht mehr interessiert.
Nur wenn es Eingang ist, wird es vom SPI beachtet.

Ich suche die Stelle im Datenblatt jetzt aber nicht.

Gruß aus Berlin
Michael

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.