Hallo Zusammen, bisher hat mir die Suchfunktion gut geholfen, aber für folgendes Problem finde ich einfach keine Lösung: Ich möchte zur Neigungsmessung einen VTI Sensor (sca1000-d01) per SPI mit einem AtMega32 verbinden. Ich sende dem Sensor ein Byte Daten (z.B. 0x08)und er sollte dann den Messwert (ebenfalls ein byte) zurückgeben, dieser wird dann an ein ebenfalls per SPI angeschlossenes Display gesendet. Allerdings kommen vom Sensor keine Werte zurück. Datenblatt des Sensors im Anhang. Hoffe irgendjemand kann mir weiterhelfen, schon mal Danke im Voraus :) char empfang2; void SPI_MasterInit(void){ /* set MOSI and SCK and SS to output, MISO to input */ DDRB = (1<<PB5)| (1<<PB7)|(1<<PB4); //pb4 ist ss für sensor DDRB &= ~(1<<PB6); //enable spi, master, set clock rate to fck/32 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPI2X); DDRD |= (1<<PD6); //ss für das display PORTD |=(1<<PD6); } void SPI_MasterTransmit(char cData, uint8_t slave){ //start transmission if(slave == 0){ PORTB &=~(1<<PB4); } else { PORTD &=~(1<<PD6); } _delay_us(80); SPDR = cData; //wait for transmission complete while(!(SPSR & (1<<SPIF))); empfang2 = SPDR; _delay_us(80); PORTB |=(1<<PB4); PORTD |=(1<<PD6); } void main(void){ SPI_MasterInit(); while(1){ SPI_MasterTransmit(0x08, 0); //signal an den sensor _delay_ms(800); SPI_MasterTransmit(empfang2, 1); //sensorwert an das display senden _delay_ms(8000); }
So wie das im Datenblatt aussieht musst Du immer 2 * 8 Bit "clocken". Das erste mal um den Befehl zu senden und das zweite mal um die Antwort zu bekommen. Beim zweiten Byte sendest Du alles Nullen und bekommst Die Antwort. Ju
Hallo Jürgen, erstmal danke für Deine schnelle Info und sorry für meine späte Antwort (Prüfungszeit an der Uni, da bin ich immer etwas gestresst :) Ich bekomme jetzt eine Antwort, aber die ist immer 255??? Kann es sein, dass der Sensor den Befehl nicht richtig erkennt? Grüße Dani
Ja kann sein. if an invalid command is received, no data is shifted into the chip and the MISO remains in high impedance state until the falling edge of CSB. This reinitializes the serial communication. probier mal ein anderes Komando. und beachte: Communication can be carried out by software or hardware based SPI. Please note that in the case of hardware based SPI, the received acceleration data is 11 bits.
konnte übers wochenende mal bei nem befreundeten kfzler aufm oszi die signale messen, schauen bis auf den miso eigentlich ganz gut aus find ich. die sache mit den 11 bit der vti sensoren, dazu gabs hier schon mal nen fred, wurde so gelöst, dass nach dem eigentlichen kommando ein "dummy-befehl" gesendet wurde, der dann die fehlenden 5 bit ausgelesen hat grüße dani
Wenn MISO nicht kommt, so wie auf den Osci Bildern zu sehen, dann hat der Chip den Befehl nicht verstanden oder er funktioniert aus irgend einem anderen Grund nicht (Spannungsversorgung, CS Signal, irgendein Pin nicht richtig beschaltet). Das Osci Bild sieht aus als ob Du ein Komando sendest, da wird der Chip nicht antworten. Du musst das Komando senden und danach 16 Bit leer senden und jeweils nach 8 gesendeten Bit das SPDR auslesen und die beiden Bytes dann zusammenhaengen.
da bin ich aber wirklich auf der Leitung gestanden, jetzt funktioniert alles... vielen vielen Dank für deine unerschöpfliche Geduld :) Nochmal für alle die über selbiges Problem stolpern: 1) csb low 2) Befehl in SPDR schreiben 3) Dummybyte in SPDR schreiben 4) Antwort teil1 aus SPDR auslesen 5) zweites Dummybyte senden 6) Antwort teil2 aus SPDR auslesen 7) csb high
Na also, wie es immer so ist, kaum macht mans richtig funktionierts auch. Ju
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.