MPU-6000 per SPI ansteuern
Hallo!
Ich versuche einen MPU-6000 per SPI mit einem Atxmega128A1 anzusteuern.
Soll für einen Quadrocopter verwendet werden, aber ist ja auch egal.
Das Problem ist, dass er überhaupt keine Daten ausgibt.
Zuerst dachte ich, dass das IC vielleicht beim Reflowlöten zerstört wurde, daher habe ich es gegen ein fertig verlötetes IC auf einem Breakoutboard ausgetauscht, das kann ja praktisch nicht kaputt sein.
Dann habe ich die Signale gemessen, die am MPU-6000 ankommen mit dem Oszilloskop gemessen, Clock, Chipselect und MOSI kommen durch und es wird auch der korrekte Wert per MISO gesendet (194).
Damit möchte ich ihm sagen, dass ich das Register 66 Auslesen (Untereres Byte des Temperaturmesswerts).
Die 194 ergibt sich durch Hinzufügen des MSBs, welches Signalisiert, dass das Register ausgelesen werden soll.
Das Problem ist, dass SDO einfach garnichts macht, bleibt durchgehen low.
Also es kommen nur Nullen an.
Hat jemand eine Idee, woran das liegen kann?
Hier der Code:
Code:
#include <avr/io.h>
#include "Init.h"
int main(void)
{
Init::Clock_Init();
Init::USART_Init();
PORTH.DIRSET = 0xFF;
PORTH.OUTSET = 0x00;
PORTC.DIRSET = 0b10110000;
PORTC.OUTSET = 0b00010000;
SPIC.CTRL = 0b01011111; // spi master, spi mode 0
SPIC.INTCTRL = 0x3; // assign high priority to SPIF interrupts
PMIC.CTRL = 0x04; // enable high priority interrupts
sei(); // enable global interrupts
while(SPIC.STATUS & 0x80) {
char rx_byte = SPIC.DATA; // flush spi receive buffer
}
while(1)
{
PORTC.OUT &= ~(1 <<PIN4);
_delay_us(10);
SPIC.DATA = 194;
_delay_us(50);
SPIC.DATA = 194;
_delay_us(100);
PORTC.OUT |= (1 << PIN4);
_delay_us(10);
//_delay_ms(200);
}
}
ISR(SPIC_INT_vect) {
while (!(USARTD1.STATUS & USART_DREIF_bm));
USARTD1.DATA = SPIC.DATA;
PORTH.OUTTGL = 0x01;
}
mfg
Olaf