Forum: Mikrocontroller und Digitale Elektronik MPU9250 antwortet nicht


von Stefan D. (mackie05)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich versuche gerade ein MPU9250 Sensor Board über SPI mit einem 
ATMega328P ans Laufen zu bekommen. Habe wie im Datenblatt beschrieben 
das MPU9250 Board mit dem ATMega über SPI(SDI <=> MOSI, SDO <=> MISO, 
nCS <=> CS, SCLK <=> SCK) mittels Level Shifter von 5V <=> 3,3V 
verkabelt.

Das Senden klappt, allerdings erhalte ich als Antwort auf MISO immer nur 
0x00. Auf dem Oszilloskopbild ist eine "Who_Am_I" Anfrage(0xF5 Kurve 
cyan) zu sehen, auf die der MPU9250(Kurve rosa) mit einem 0x71 antworten 
sollte. Jede andere Anfrage wird auch nur mit 0x00 beantwortet.

Hat jemand eine Idee warum MISO immer nur 0x00 schickt?

Danke im Voraus.

Hier mein Code:
1
/* Controller: Atmega328P @ 5V @ 16MHz, MPU9250 @ 3.3V connected over SPI via level shifter 
2
 */ 
3
4
5
#ifndef F_CPU
6
#define F_CPU 16000000UL                  // Takt als Long definieren
7
#endif
8
9
#define Read_Flag        0x80
10
#define MPUREG_USER_CTRL    0x6A
11
#define MPUREG_PWR_MGMT_1    0x6B
12
#define MPUREG_PWR_MGMT_2    0x6C
13
#define MPUREG_GYRO_CONFIG    0x1B
14
#define MPUREG_ACCEL_CONFIG    0x1C
15
#define MPUREG_ACCEL_CONFIG_2  0x1D
16
#define MPUREG_I2C_MST_CTRL    0x24
17
#define MPUREG_WHO_AM_I      0x75
18
19
#define CS            PD7
20
#define SS            PB2
21
#define MOSI          PB3  
22
#define MISO          PB4
23
#define SCK            PB5
24
25
#include <inttypes.h>
26
#include <avr/io.h>
27
#include <util/delay.h>
28
29
30
void Init_SPI_Master(void);
31
void Init_MPU9250(void);
32
void Master_Send(void);
33
void Write_Reg( uint8_t WriteAddr, uint8_t WriteData );
34
void Read_Reg(uint8_t ReadAddr, uint8_t ReadData);  
35
36
37
// --------------- INITS -------------------
38
39
void Init_SPI_Master(void)              // Intialization Routine Master Mode
40
{
41
  volatile char IOReg;
42
  DDRB |= (1<<SS)|(1<<MOSI)|(1<<SCK);        // set PB2(/SS), PB3(MOSI), PB5(SCK) as output
43
  DDRD |=  (1<<CS);                // Chipselect
44
  SPCR  = (1<<MSTR)|(1<<SPE)|(1<<SPR0);      // Prescaler 16 -> SPI Speed 1 MHz
45
  IOReg   = SPSR;                         // clear SPIF bit in SPSR
46
  IOReg   = SPDR;
47
}
48
49
void Init_MPU9250(void)
50
{
51
  Write_Reg(MPUREG_PWR_MGMT_1, 0x80);        // Reset Device
52
  Write_Reg(MPUREG_PWR_MGMT_1, 0x01);        // Clock Source
53
  Write_Reg(MPUREG_PWR_MGMT_2, 0x00);        // Enable Acc & Gyro
54
  Write_Reg(MPUREG_GYRO_CONFIG, 0x18);      // +-2000dps   
55
  Write_Reg(MPUREG_ACCEL_CONFIG, 0x08);      // +-4G
56
  Write_Reg(MPUREG_ACCEL_CONFIG_2, 0x09);      // Set Acc Data Rates, Enable Acc LPF , Bandwidth 184Hz
57
  Write_Reg(MPUREG_USER_CTRL, 0x20);        // I2C Master mode
58
  Write_Reg(MPUREG_I2C_MST_CTRL, 0x0D);      // I2C configuration multi-master  IIC 400KHz
59
}
60
61
// ------------- Functions ----------------
62
63
void Master_Send(int cData)              // Sending Routine Master Mode (interrupt controlled)
64
{
65
  PORTD &= ~(1<<CS);                // Chipselect auf low
66
  SPDR = cData;                  /* Start transmission */
67
  while(!(SPSR & (1<<SPIF)));            /* Wait for transmission complete */
68
  PORTD |=(1<<CS);                // Chipselect auf high 
69
}
70
71
void Write_Reg( uint8_t WriteAddr, uint8_t WriteData )
72
{
73
  Master_Send(WriteAddr);              // Adresse senden
74
  _delay_us(2);  
75
  Master_Send(WriteData);              // Data senden
76
  _delay_us(10000);
77
}
78
79
void Read_Reg(uint8_t ReadAddr, uint8_t ReadData)
80
{
81
  Master_Send(ReadAddr|Read_Flag);
82
  _delay_us(2);
83
  Master_Send(ReadData);
84
  _delay_us(50);
85
}
86
87
int main(void)
88
{
89
    Init_SPI_Master();
90
  Init_MPU9250();
91
  
92
  while(1)
93
    {
94
    Read_Reg(MPUREG_WHO_AM_I, 0x00);
95
    _delay_us(10);     
96
    }
97
}

von Georg I. (dschi-ai)


Lesenswert?

Du musst CS=low, Register Adresse, ein Byte lesen, dann erst wieder 
CS=high. Während einem Lese/Schreibvorgang muss CS komplett low sein.

von Stefan D. (mackie05)


Angehängte Dateien:

Lesenswert?

Hallo Georg

das war der entscheidende Hinweis!!! Jetzt klappt es! Vielen Dank.

Gruß Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.