Guten Abend,
ich versuche gerade mit dem STK500 über i2c den MPU6050 auszulesen.
Leider scheitert es schon beim starten.
Gibt es möglicherweiße irgendwas STK500 spezifischen, damit i2c dort
auch funktioniert? Hat jemand sonst noch irgendwelche Ideen, wie ich dem
Problem auf die Schliche kommen kann?
Wie ich sehe, sind auf dem Sensorboard bereits die PullUps drauf:
https://docs.google.com/file/d/0B3ASxBYiXsrDX3oyMzhfLWtiTkE/image?pagenumber=1&w=800
(R1 und R2).
Das kann also schonmal ausgeschlossen werden.
Vom Code her kann da eigentlich auch nicht viel falsch sein,
da ich Peter Fleurys Code benutze.
Die i2c_start habe ich nur etwas verändert, damit ich sehe, wo er
abbricht (zweites return 1 => return 2):
1 | unsigned char i2c_start(unsigned char address)
|
2 | {
|
3 | uint8_t twst;
|
4 |
|
5 | // send START condition
|
6 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
7 |
|
8 | // wait until transmission completed
|
9 | while(!(TWCR & (1<<TWINT)));
|
10 |
|
11 | // check value of TWI Status Register. Mask prescaler bits.
|
12 | twst = TW_STATUS & 0xF8;
|
13 | if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
|
14 |
|
15 | // send device address
|
16 | TWDR = address;
|
17 | TWCR = (1<<TWINT) | (1<<TWEN);
|
18 |
|
19 | // wail until transmission completed and ACK/NACK has been received
|
20 | while(!(TWCR & (1<<TWINT)));
|
21 |
|
22 | // check value of TWI Status Register. Mask prescaler bits.
|
23 | twst = TW_STATUS & 0xF8;
|
24 | if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 2; // Hier tritt immer der Fehler auf!
|
25 |
|
26 | return 0;
|
27 |
|
28 | }
|
1 | int main(void)
|
2 | {
|
3 | unsigned char ret;
|
4 |
|
5 | uart_init();
|
6 |
|
7 | i2c_init();
|
8 |
|
9 | delay_ms(1000);
|
10 |
|
11 | ret = i2c_start(adrMPU6050/*+I2C_WRITE*/);
|
12 |
|
13 | switch(ret) {
|
14 | case 0: uart_puts("Works!\n"); break;
|
15 | case 1: uart_puts("Error1!\n"); break;
|
16 | case 2: uart_puts("Error2!\n"); break;
|
17 | default: uart_puts("Something else ... \n"); break;
|
18 | }
|
19 |
|
20 | i2c_stop();
|
21 |
|
22 | for(;;);
|
23 | }
|
Kann es sein, dass ich mit #define SCL_CLOCK 100000L die Taktrate zu
groß/klein gewählt habe?
Ansonsten bin ich mit meinem Latein am Ende.
Irgendwelche Ideen um den Fehler einzugrenzen?
Liebe Grüße!
PS: Das Datenblatt gibt es hier:
http://invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf