avr gcc -sensor on SPI - Problem

Gast #238940
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
Angehängte Dateien:
Gast #238941
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
Gast #238943
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...
Gast #238944
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
Gast #238946
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
Gast #238947
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
Gast #238948
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren