mikrocontroller.net

Forum: Compiler & IDEs AVR SPI hängt (SPIF Abfrage), ss IST Ausgang!


Autor: Martin N/a (martin02)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klappt das senden von nur einem Byte oder hängt er da auch schon?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin N/a schrieb:
> Wenn ich die delays
> durch while(!(SPSR & (1<<SPIF))); ersetze, hängt der sich da fest.

Du hast das Bit aber vorher korrekt gelöscht, ja?

Autor: Martin N/a (martin02)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich wollte genau das gerade testen. Habe genau den Code von gestern, der 
NICHT lief, genommen. Und siehe da - es geht heute.

Keine Ahnung warum... aber immerhin geht's. Danke für den hilfreichen 
Tipp :o)

Gruß
Martin

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat wohl ein Bit zu kräftig gefeiert und ist über Nacht umgekippt.

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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).

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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.