Forum: Compiler & IDEs avr gcc -sensor on SPI - Problem


von Zmarzly Daria (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Kann mir bitte jemand erklären wieso will der Sensor nicht mit dem
Prozessor reden? ich benutze den Atmega128 und winAvr Compiler.
Ich habe einen ganz einfachen Programm geschrieben wo ich den Sensor
aktiviert habe, er soll mir nun seinen Status Register zurück an das
Spi senden. Der Prozessor soll immer ein Master sein.
Mein Problem ist, dass ich nicht weiß, ob ich die Schnittstelle
überhaupt richtig anspreche und dann ob ich auch richtig reagiere. Ich
habe bis jetzt keine Interupt Routinen benutzt, da ich nun alles
manuell ablesen will.
Danke für baldige Antwort
Daria

von Stefan Kleinwort (Gast)


Lesenswert?

Hi Zmarzly,

so kann es nicht gehen. Dein mega128 muss JEDEN Transfer starten mit
einem Write auf SPDR. Auch wenn er "nur" ein Byte empfangen will.
Jeder Transfer über SPI sendet UND empfängt gleichzeitig ein Byte.

Dein Problem liegt in readSensor:
Dort wird SPDR nur gelesen, ein SPI-Transfer wird also garnicht
gestartet!

Stefan

von Zmarzly Daria (Gast)


Lesenswert?

was soll ich denn da rein schreiben? soll es was sinnvolles sein, z.B
die Commando für den Sensor dass er jetzt senden soll?
Daria

von Zmarzly Daria (Gast)


Lesenswert?

"Jeder Transfer über SPI sendet UND empfängt gleichzeitig ein Byte"
also ich habe nicht wirklich verstanden, ich habe nur einen Register
zur Verfügung, den SPDR, und ich muss den Slave aktivieren sowohl beim
senden als auch beim empfangen, bis jetzt verhält sich das ganze so,
dass ich schreibe etwas in den Register, empfange aber das selbe, als
ob der Transfer tatsächlich nicht gestartet hätte...

von Stefan Kleinwort (Gast)


Lesenswert?

Welchen Sensor hast Du denn am SPI?

Ein korrekter SPI-Transfer sieht so aus:

* Sendedaten in SPDR schreiben
  (das startet automatisch die Übertragung bzw. die SPI-Clock)
* warten, bis SPIF = 1 wird
* Empfangsdaten aus SPDR lesen


Deine Read-Sensor-Routine sollte also so aussehen:

unsigned char readSensor(void){
  CLEARBIT(PORTC,PC3);        /* enable sensor*/
  SPDR = DUMMY;               /* irgendwas in SPDR schreiben */
  while(!(SPSR & (1<<SPIF)))  /* wait for transmission complete*/
  SETBIT(PORTC,PC3);          /* disaable sensor*/
  return SPDR;                /* wichtig: return ganz am Schluss! */
}

Das Return UNBEDINGT ganz am Schluss: bei Dir wird SETBIT(PORTC,PC3)
gar nie ausgeführt!

Stefan

von Zmarzly Daria (Gast)


Lesenswert?

ok, ich versuche es.
Vielen Dank :)
Daria

von Zmarzly Daria (Gast)


Lesenswert?

also,
ich habe den Sender modifiziert, der Sensor liefert leider immer ein 0
Wert zurück, egal wie ich im auch initialisiere. Ich benutze den KXP74
Beschleunigungs- Sensor. Ich habe auf dem Board noch einen Speicher
(AT45DB041B)4Mbit von Atmel, den ich über Spi ansprechen sollte. Der
Speicher verhält sich genau so wie der Sensor, d.h. reagiert irgenwie
nicht, deshalb denke ich, dass es an meinem Programm liegt.
Gibt es denn noch ein Paar Tips mehr?
Danke
Daria

von Stefan Kleinwort (Gast)


Lesenswert?

Ich habe mal das Datenblatt angeschaut.

Du musst:

* CS low schalten
* Befehl zum Start der Konvertierung geben (z.B. 0 für x-axis)
* warten auf SPIF = 1
* min. 40us warten
* Dummy-Byte senden (egal welcher Wert)
* warten auf SPIF = 1
* MSB-Datenbyte aus SPDR auslesen
* Dummy-Byte senden
* warten auf SPIF = 1
* LSB-Datenbyte aus SPDR auslesen
* jetzt erst (!!!) CS wieder high schalten

Während der ganzen Aktion: CS = low!

Gruß, Stefan

von zmarzly daria (Gast)


Lesenswert?

vielen Dank für die Tips, ich werde sie am Dienstag gleich ausprobieren.
Ich habe den CS mehrmals ein und ausgeschaltet und hatte mehrere
funktionen aufgerufen um mit dem Sensor zu kommunizieren, deshalb hat
es wahrscheinlich nicht funktioniert.
 nochmal Danke
Grüße Daria

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
Noch kein Account? Hier anmelden.