Hallo,
habe mir einen Gyro (MLX90609) von Melexis auf einer Platine von
Sparkfun besorgt. Will diesen per SPI ansteuern, bin mir aber noch nicht
ganz im klaren wie das funktioniert, SCLK, MOSI, MISO und SS hab ich mit
den entsprechenden Ports am Atmega 8 verbunden, allerdings hapert es
weniger an der Hardware Technischen umsetzung als an dem C Code zum
auslesen der Messwerte, hab ihn hier mit mal mit drangehängt weil im
Anhang schon das Datenblatt der Sensors ist. Wich würde interessieren ob
die umsetzung wie ich sie gemacht habe so gehen würde?
1
voidSPI_MasterInit(void)
2
{
3
DDRB|=(1<<PB2)|(1<<PB3)|(1<<PB5);// Setze SS, MOSI and SCK as Ausgang
4
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);// Enable SPI, Master, set clock rate fck/16 = 250kHz
5
}
6
7
unsignedintSPI_talk(unsignedinttData)
8
{
9
unsignedintrData,rData_1,rData_2;
10
11
// Sende 8Bit großes Telegramm, bekomme als Antwort
12
// 16Bit großes Telegramm
13
PORTB&=(1<<PB2);// SS am Slave, low --> Beginn der Übertragung
14
15
SPDR=tData;// Start transmission
16
while(!(SPSR&(1<<SPIF)))// Wait for transmission complete
17
{
18
}
19
20
rData_1=SPDR;
21
22
while(!(SPSR&(1<<SPIF)))// Wait for transmission complete
Hallo,
Deinen Code habe ich mir nur bis zu den ersten 2 Stellen angesehen, die
ich für fehlerhaft halte:
PORTB &= (1 << PB2); // SS am Slave, low --> Beginn der Übertragung
Damit hältst Du PB2 auf H, wenn es schon H ist, was Deinem Kommentar
widerspricht, und setzt MOSI + CLK auf L. Meinst Du vielleicht (?)
PORTB &= ~(1 << PB2); // SS=L
Später schreibst Du:
return rData;
PORTB |= (1 << PB2); // Datenübertragung beendet
Die Funktion wird mit dem "return" beendet und die "PORTB="-Anweisung
nie ausgeführt.
Gruß
risu
Hallo Crashdemon,
ich glaube, bei Deiner SPI-Initialisierung fehlen ein noch paar
Parameter.
Ich arbeite auch mit den Melexis Sensoren und habe das SPI
folgendermaßen initialisiert:
Hallo, ja ich glaube bei mir fehlte echt was, hab meine initialisierung
um die Definition von MISO als Ausgang erweitert, sieht jetzt
folgendermaßen aus:
1
voidSPI_MasterInit(void)
2
{
3
DDRB|=(1<<PB2)|(1<<PB3)|(1<<PB5);// Setze SS, MOSI and SCK as Ausgang
4
DDRB&=~(1<<PB4);// Miso als Eingang
5
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);// Enable SPI, Master, set clock rate fck/16 = 250kHz
6
7
return;
8
}
sonst ist ja alles wie bei dir, nur das du die Bits des SPCR Registers
jeweils einzeln setzts und ich dass in einer zeile mache.
deine variante:
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);// Enable SPI, Master, set clock rate fck/16 = 250kHz
kannst ja mal deinen Code posten den du zum Auslesen des MLX benutzt,
dan kann ich den mit meinen Vergleichen und schauen ob ich da noch
fehler drin habe, ich bin mir da speziell mit den Telegrammen die ich
versende nicht ganz sicher, da ich ja jeweils immer nur ein 1 Byte
größes sende, er aber eigentlich ein 3 Byte großes erwartet.
Hallo,
Du darfst CPOL und CPHA nicht vergessen, sonst wird das mit der
Kommunikation wohl nicht klappen.
Das ganze SPI/Gyro Modul von mir ist etwas zu lang und unsortiert, um es
hier zu posten. Kannst mir bei Interesse ja eine PM mit deiner
EMail-Adresse schicken, dann sende ich es Dir gerne zu.
Gruß
Dirk
Dirk Schmidt wrote:
> Hallo,> Du darfst CPOL und CPHA nicht vergessen, sonst wird das mit der> Kommunikation wohl nicht klappen.>
Ok, so hab meine Code mal geändert