Hallo zusammen,
ich habe folgendes Problem: Ich möchte eine simple SPI Verbindung mit
einem Atmega328 (Arduino UNI) testen. Zunächste einfach nur Master
richtig initialisieren und auf Funktion testen. Byte in SPDR schreiben
und warten bis die Flag gesetzt wird, LED an. Aber aus irgendeinem Grund
wird die Flag nicht gesetzt. SS ist Output (anscheinend häufiger
Fehler).
Philipp H. schrieb:> Aber aus irgendeinem Grund wird die Flag nicht gesetzt.
SPI Enable Fuse gesetzt?
Zeige dein Projekt damit wir die Einstellungen kennen unter
denen du das Programm laufen lassen willst.
Es heisst übrigens allgemein das Flag, oder "die Flagge",
das sagt aber keine Schwein.
> SPI Enable Fuse gesetzt?
SPIEN betrifft ausschließlich die Programmierung: "SPIEN Enable Serial
Program and Data Downloading". Außerdem ist ein Abschalten nur mit einem
HV-Programmiergerät möglich: "The SPIEN Fuse is not accessible in serial
programming mode".
S. Landolt schrieb:> Es ist so, wie ich eingangs schrieb. Wenn MSTR erst nach SPE gesetzt> wird, gerät SPI in den Slave-mode, SS (PB2) steht zu diesem Zeitpunkt ja> auf low.
Danke! Das war das Problem! Ist aber aus dem Datenblatt auch nicht
unbedingt ersichtlich oder?
"If SS is configured as an output, the pin is a general output pin which
does not affect the SPI
system. Typically, the pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master
SPI operation. If the SS pin
is driven low by peripheral circuitry when the SPI is configured as a
Master with the SS pin
defined as an input, the SPI system interprets this as another master
selecting the SPI as a
slave and starting to send data to it."
Klingt für mich als ob es kein Problem darstellen sollte wenn SS zuvor
als Output gesetzt wurde. Wie dem auch sei, vielen Dank! :)
Das Datenblattzitat bezieht sich im wesentlichen auf einen SPI-Master;
bei der ursprünglich gewählten Reihenfolge der SPCR-bits startet SPI
jedoch als Slave, dabei ist offenbar unerheblich, ob der SS-pin als Ein-
oder Ausgang definiert ist. SS steht auf low, folglich geht der
SPI-Slave direkt auf Empfang.
(stelle ich mir zumindest so vor, ohne es näher untersucht zu haben)
Hallo,
habe das auch nochmal nachvollzogen. SS wurde immer als Erstes
konfiguriert. Alle SS/CS Pins setze ich schon aus Gewohnheit als Erstes
auf Ausgang und High Pegel. Entscheidend ist wirklich dass das SPE Bit
als Letztes gesetzt wird falls man alle Bits einzeln in das Register
schreibt. Interessante Erkenntnis. Danke.
> Entscheidend ist wirklich dass das SPE Bit als> Letztes gesetzt wird
Das sieht hier anders aus: entscheidend ist der Zustand von SS beim
Setzen von SPE; ich kann dieses durchaus als Erstes setzen, wenn nur SS
zu diesem Zeitpunkt high ist.
Mit aller Zurückhaltung möchte ich behaupten, dass das beim Test nicht
galt:
> Alle SS/CS Pins setze ich schon aus Gewohnheit als Erstes> auf Ausgang und High Pegel.
Schon - andererseits war das Hauptproblem ja unzureichende Kenntnis der
SPI-Funktion.
(mich persönlich stört eher die viele Schreibarbeit; und dass das
Programm unnötig groß wird, stößt wohl nur Assemblerprogrammierern auf)
Hallo,
ähm ne. Ich wollte zum Ausdruck bringen, dass es nicht egal ist wann das
SPE Bit gesetzt wird. Ich hatte wie gesagt für meinen Test den SS Pin
gleich am Anfang auf Ausgang und High Pegel gesetzt. Danach habe ich nur
noch mit der Reihenfolge der Bits im SPCR Register gespielt. Alle
einzeln wie der TO. Master funktioniert nur und gibt Daten raus wenn das
SPE Bit als Letztes gesetzt wird. Also so wie deine Vermutung war, S.
Landolt. Testobjekt war mein ATmega2560.
Ob einzeln oder in einem Rutsch kommt auch immer darauf was man machen
möchte. Zum Bsp. beim Timer habe ich immer 3 Grundfunktionen.
Konfiguration des Timern. Starten und Stoppen des Timers. Wer SPI
zwischen Master und Slave umschalten möchte, muss das auch irgendwie
sinnvoll aufdröseln.
Veit D. schrieb:> Master funktioniert nur und gibt Daten raus wenn das> SPE Bit als Letztes gesetzt wird.
Nein, das stimmt nicht. Man kann MSTR setzen, nachdem SPE gesetzt
wurde.
Ich würde trotzdem immer die Bits in einem Rutsch setzen. Bei manchen
IO-Registern haben die Bits verschiedene Bedeutung beim Lesen/Schreiben,
d.h. ein Lesen/AND/OR/Schreiben kann zu Überraschungen führen.
Hallo,
habe das nochmal durchgespielt. Man sollte das in Ruhe machen. Hatte
mich oben etwas vertan, hatte das SS High setzen zum Test rausgenommen
und vergessen wieder reinzunehmen. Sorry. Also nochmal. :-)
Wenn der SS Pin Ausgang und High ist, dann spielt die Bit Reihenfolge
keine Rolle. Wenn SS Ausgang und Low ist, dann muss SPE als Letztes
gesetzt werden. Bedeutet der SS Pegel spielt eine entscheidende Rolle,
wie S. Landolt schon geschrieben hatte. Da man eigentlich SS und alle
anderen SS/CS Pins immer als Erstes konfiguriert, kommt man nicht in
diese Verlegenheit. :-)