mikrocontroller.net

Forum: Compiler & IDEs Eingangsdaten mit SPI


Autor: Robert M. (xertno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mit einem Atmega644 eine Verbindung über SPI mit einem 
Sensormodul aufzubauen. Mir ist prinzipiell klar die diese Schnittstelle 
Ausschauen muss. Das Problem besteht darin das ich mit dem ersten Byte 
sagen muss welche Informationen ich von ihm möchte. Diese Übertragung 
funktioniert in der Simulation bereits.
Ich habe das Eins zu Eins aus dem Datenblatt entnommen.
…
SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0);
 …
void SPIUebertragungAnSensor (char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
  ;
}
nun will ich auch die Daten vom Sensor aufnehmen, es handelt sich da um 
2 Byte. Mir ist bekannt, dass ich das Eingangsschieberegister des 
Masters im richtigen Moment kopieren muss. Ich habe mir dazu gedacht das 
ich einfach eine Funktion schreibe die ich einfach zweimal nacheinander 
Aufrufe.
Dazu habe ich dann Programmiert:

char DatenVomSensor(void)
{
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
Nun wenn sich in der Simulation der Zeiger in diese Funktion springt 
habe ich passiert einfach gar nichts kein Takt und er springt da die 
Abbruchbedingung nicht erreicht wird auch nicht mehr aus der Schleife 
heraus.
Kann mir jemand erklären an welcher Stelle ich den Fehler mache.
Gruss Robert

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du dir absolut sicher, daß dein SPI NICHT im Slavemodus ist?

Autor: Robert M. (xertno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigenlich schon ich setze doch das MSTR bit, und außerdem Funktioniert 
die Datenübertragung mit Takt und Datenausgabe am Ausgangspin, in der 
erszten Funktion. nur in der Zweiten geht es nicht, und ich habe auch 
geine Idee meh woran das liegen kann.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SPI ist fullduplex, ohne senden kein empfang

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau. Damit Dein Slave (Sensor) etwas senden kann, muss GLEICHZEITIG 
der Master ein Byte rausschieben (auch wenns nur ein Dummy ist). Von 
selbst kann der Slave gar nichts senden.

Autor: André Heßling (andreh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Schreibe deine Funktion entweder so:

char SPIUebertragungAnSensor (char cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)));

  return SPDR;
}

bzw.

char DatenVomSensor(void)
{
  SPDR = 0xFF;
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}

Die Endlosschleife ist logisch, weil der Master (also dein 
Mikrocontroller) den Bus kontrolliert und nur dann ein Clocksignal 
liefert, wenn Daten gesendet werden. D.h. das Empfangen von Bytes muss 
parallel zum Senden erfolgen, weil nur dann das Clock-Signal aktiv ist.
Mit SPDR = 0xFF wird ein Dummy-Byte ausgegeben, so dass du im Anschluss 
empfangen kannst.

Autor: Robert M. (xertno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist mir schon bekannt aber das ich auch noch extra in das 
Ausgangsregisster etwas geschrieben werden muss war mir schon neu. Aber 
jetzt geht es, vielen Dank für die Hilfe.

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.