Hallo,
ich versuch ein Freescale MMA4755 Accelerometer an meinem ATMEGA32 zu
betreiben, leider ohne Erfolg.
Habe alles gemäß Datenblatt verbunden:
ATMEGA32-------MMA7455
SS(PB4) -> CS
SCK(PB7) -> SPC
MOSI(PB5) -> SDI
MISO(PB6) -> SDA
DVDD und AVDD werden mit etwa 2.5 V versorgt.
Die Initialisierungsprozedur aus der Freescale Appnote
http://www.freescale.com/files/sensors/doc/app_note/AN3468.pdf
hab ich für AVR, meiner Meinung nach korrekt, angepasst.
PORTB&=~(1<<PB4);// SS auf LOW während der Übertragung
18
SPDR=(((reg&0x3F)<<1)|0x80);//Write Befehl an Register Senden
19
while((!SPSR&(1<<SPIF)));//Warten bis Transfer abgeschlossen ist
20
x=SPDR;//dummy read
21
SPDR=data;
22
while((!SPSR&(1<<SPIF)));
23
x=SPDR;//dummy read
24
PORTB|=(1<<PB4);// SS auf HIGH zum Beenden der Übertragung
25
}
26
27
uint8_tspi_read(uint8_treg)
28
{
29
uint8_tx;
30
PORTB&=~(1<<PB4);
31
x=SPSR;// clear SPIF
32
x=SPDR;
33
while((SPSR&(1<<SPIF)));//Warten bis SPIF gelöscht ist
34
SPDR=((reg&0x3F)<<1);//Read Befehl an Register Senden
35
while((!SPSR&(1<<SPIF)));//Warten bis Transfer abgeschlossen ist
36
x=SPDR;
37
SPDR=0x00;//Daten werden mit dem Nächsten Transfer gesendet
38
while((!SPSR&(1<<SPIF)));//Warten bis Transfer abgeschlossen ist
39
x=SPDR;//Empfangene Daten Auslesen
40
PORTB|=(1<<PB4);
41
returnx;
42
43
}
44
45
46
intmain(void)
47
{
48
init();
49
spi_master_init();
50
Xdata=Ydata=Zdata=0;
51
CTLReg=0;
52
spi_write(0x16,0x05);//set spi 4-wire mode in MMA7455
53
CTLReg=spi_read(0x16);
54
55
while(1)
56
{
57
Xdata=spi_read(0x6);
58
}
59
60
}
Als Antwort bekomme ich auf allen Registern aber immer nur 0xFF.
Weder an der Clock noch an der Data-Leitung tut sich laut Oszi was. SS
bewegt sich ein bisschen.
Wenn ich den Sensor aus der Schaltung rausnehme gibts nen Anständigen
Takt und auf der Datenleitung passiert auch was. SS sieht genau so aus
wie vorher.
Das Heißt von AVR-Seite mache ich schonmal irgendwas richtig.
Nun bin ich etwas Ratlos, wo genau das Problem liegt. Sensor kann
natürlich kaputt sein, hab aber noch nen zweiten getestet, da das
gleiche Verhalten.
Initialisierung kann falsch sein. Hier bin ich mit der SPI Clock Rate
nicht so sicher. Im Datenblatt steht was von SPI Frequency die bei DVDD
größer 2.4 V = 8Mhz sein soll. Das wär aber bissl viel. Dann gibts noch
ne "internal Clock Frequency" die zwischen 140 und 160 KHz sein soll, da
komm ich aber mit meinen Teilern nicht hin. In der Appnote steht "The
clock speed is set by adjustin the baud rate", davon finde ich im
AVR-Datenblatt wieder nichts.
Was mich etwas stutzig macht, ist, dass auf der Clock-Leitung nichts
passiert. Wenn das am Sensor nur ein Eingang ist sollte das doch keinen
Einfluss aufs Signal haben, oder?
Bin für jeden Hinweis Dankbar,
Thomas
ich sehe foolgendes problem:
laut dem datenblatt
http://www.freescale.com/files/sensors/doc/data_sheet/MMA7455L.pdf
(seite 20) muss der iaddr-pin bei spi auf masse gesetzt werden, nicht
auf vcc wie es in der anleitung steht die du gepostet hast.
probiere das mal zu ändern und poste bitte dein ergebnis.ich hab grad
auch probleme mit dem teil!!
mfg t.d
Ich habe momentan auch Probleme mit diesem Sensor. Alles nach Datenblatt
für SPI angeschlossen.
Takt und SIMO sehen korrekt aus. Auf der SOMI-Leitung ist nichts zu
sehen. Habe da meinen CS im Verdacht. Der rührt sich nur ganz wenig
(100mV).
Vom Data-Ready-Pin auf MMA-Seite bekomme ich ich auch keinen High-Pegel.
Sensor wurde schon ausgetauscht und noch behutsamer aufgelötet.
Bin da momentan etwas ratlos woran es liegen könnte.
Grüße
Seb
Hallo Leute,
Ich versuche auch mit diesn teil daten zu beckomen aber kein erfolg!
Laut datenblatt muss IAddr0 auf Vcc gelegt werden und nicht auf GND wie
t.d postet! Ist jemand 100% sicher wo IAddr0 gelegt werden muss (GND
oder Vcc)? Irgend einer der erfolg hatte?
Danke,
George
Hallo Knut,
Habe alles so gemacht wie in die zeichnung nur den pull up wiederstand
habe ich nicht.
Ich versuche es mit der routine von Thomas L. (ganz oben) aber
funktiuniert nicht! Kanst du vieleicht deine routine fur schreiben-lesen
hir posten?
Mfg,
George
Der PullUp ist nötig, um andere Devices am SPI zu bedienen, während CS
des MMA inaktiv ist. Vorsichtsmassnahme, wenn der Controller im Reset
ist. Die Schreib-Leseroutine ist aber in ASM ;-)