Jein, lt. DB sollte man gleich die Initialisierung machen, damit der MPU bei CS = High nicht in den I2C Modus fällt. Das ist aber eher eine Sicherheitsmaßnahme, die nicht unbedingt sein muss, das kann also hier nicht der Fehler sein.
Die CS Leitung setze ich außerhalb der Funktion, da ich ja sonst immer nur ein Byte senden / empfangen könnnte.
Hier mal meine Lese-Routine:
Code:
uint8_t dump;
MpuCsLow;
dump = SpiTransfer(0xBB);
ax.bytes.byte2 = SpiTransfer(0x00);
ax.bytes.byte1 = SpiTransfer(0x00);
ay.bytes.byte2 = SpiTransfer(0x00);
ay.bytes.byte1 = SpiTransfer(0x00);
az.bytes.byte2 = SpiTransfer(0x00);
az.bytes.byte1 = SpiTransfer(0x00);
t.bytes.byte2 = SpiTransfer(0x00);
t.bytes.byte1 = SpiTransfer(0x00);
gx.bytes.byte2 = SpiTransfer(0x00);
gx.bytes.byte1 = SpiTransfer(0x00);
gy.bytes.byte2 = SpiTransfer(0x00);
gy.bytes.byte1 = SpiTransfer(0x00);
gz.bytes.byte2 = SpiTransfer(0x00);
gz.bytes.byte1 = SpiTransfer(0x00);
MpuCsHigh;
Wo sollten den da Wartezeiten sein? bzw. für was? Ich hab da keine.
Gruß
Chris
EDIT:
Hab hier mal schnell was zusammengezimmert, sollte funktionieren, musst nur noch ne Ausgabe o.ä. einbauen.
Code:
/*
MPU6000 SPI Test
*/
#define F_CPU 32000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <util/twi.h>
#include <math.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#define MpuCsLow (PORTC.OUTCLR = PIN4_bm)
#define MpuCsHigh (PORTC.OUTSET = PIN4_bm)
typedef union{
int16_t integer;
struct{
uint8_t byte1;
uint8_t byte2;
}bytes;
}int16byte;
int main(void);
void InitClock(void);
void InitSpi(void);
uint8_t SpiTransfer(uint8_t data);
void InitMpu(void);
void ReadMpu(void);
int16byte ax;
int16byte ay;
int16byte az;
int16byte t;
int16byte gx;
int16byte gy;
int16byte gz;
int16_t GyroX;
int16_t GyroY;
int16_t GyroZ;
int16_t Temperature;
int16_t AccX;
int16_t AccY;
int16_t AccZ;
int main(void)
{
InitClock();
InitSpi();
_delay_ms(50);
InitMpu();
_delay_ms(50);
//16MHz SPI
SPIC.CTRL = SPI_CLK2X_bm | SPI_ENABLE_bm | SPI_MASTER_bm | SPI_PRESCALER_DIV4_gc;
while(1)
{
ReadMpu();
//Print Data
_delay_ms(10);
}
}
void InitClock(void)
{
OSC.CTRL |= OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
}
void InitSpi(void)
{
PORTC.DIRSET = PIN7_bm | PIN5_bm | PIN4_bm;
//1MHz SPI
SPIC.CTRL = SPI_CLK2X_bm | SPI_ENABLE_bm | SPI_MASTER_bm | SPI_PRESCALER_DIV64_gc;
MpuCsHigh;
}
uint8_t SpiTransfer(uint8_t data)
{
uint8_t dump;
SPIC.DATA = data;
while(!(SPIC.STATUS & SPI_IF_bm))
dump = SPIC.STATUS;
return SPIC.DATA;
}
void InitMpu(void)
{
uint8_t dump;
MpuCsLow;
dump = SpiTransfer(106);
dump = SpiTransfer(0x10);
MpuCsHigh;
_delay_ms(1);
MpuCsLow;
dump = SpiTransfer(25);
dump = SpiTransfer(0x00);
MpuCsHigh;
_delay_ms(1);
MpuCsLow;
dump = SpiTransfer(26);
dump = SpiTransfer(0x03);
MpuCsHigh;
_delay_ms(1);
MpuCsLow;
dump = SpiTransfer(27);
dump = SpiTransfer(0x18);
MpuCsHigh;
_delay_ms(1);
MpuCsLow;
dump = SpiTransfer(28);
dump = SpiTransfer(0x00);
MpuCsHigh;
_delay_ms(1);
MpuCsLow;
dump = SpiTransfer(107);
dump = SpiTransfer(0x03);
MpuCsHigh;
}
void ReadMpu(void)
{
uint8_t dump;
MpuCsLow;
dump = SpiTransfer(0xBB);
ax.bytes.byte2 = SpiTransfer(0x00);
ax.bytes.byte1 = SpiTransfer(0x00);
ay.bytes.byte2 = SpiTransfer(0x00);
ay.bytes.byte1 = SpiTransfer(0x00);
az.bytes.byte2 = SpiTransfer(0x00);
az.bytes.byte1 = SpiTransfer(0x00);
t.bytes.byte2 = SpiTransfer(0x00);
t.bytes.byte1 = SpiTransfer(0x00);
gx.bytes.byte2 = SpiTransfer(0x00);
gx.bytes.byte1 = SpiTransfer(0x00);
gy.bytes.byte2 = SpiTransfer(0x00);
gy.bytes.byte1 = SpiTransfer(0x00);
gz.bytes.byte2 = SpiTransfer(0x00);
gz.bytes.byte1 = SpiTransfer(0x00);
MpuCsHigh;
GyroX = gx.integer;
GyroY = gy.integer;
GyroZ = gz.integer;
Temperature = t.integer;
AccX = ax.integer;
AccY = ay.integer;
AccZ = az.integer;
}
Lesezeichen