- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: MPU-6000 per SPI ansteuern

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    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;
    }
    Geändert von Che Guevara (24.11.2014 um 14:45 Uhr)

Ähnliche Themen

  1. Mpu-6050
    Von inka im Forum Robby RP6
    Antworten: 12
    Letzter Beitrag: 29.05.2013, 09:41
  2. Digitalpotio über SPI ansteuern
    Von shedepe im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 17.04.2013, 18:53
  3. Digitalpotio über SPI ansteuern
    Von shedepe im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 13.04.2013, 19:32
  4. Problem mit MPU-6050
    Von ni.c im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 06.04.2012, 11:53
  5. Max 7221 über SPI ansteuern --> Probleme :(
    Von Razer im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.05.2006, 16:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress