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
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.
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.
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.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.