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 | }
|