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
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
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
"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...
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.