Guten abend,
bin mal wieder am verzweifeln.
Also... Ich versuche einen BMA020 über TWI zu konfigurieren und auszulesen.
Nun bin ich hergegangen und habe folgenden C-code gebastelt:
ähm ja...Code:/* * BMA020.c * * Created: 26.01.2014 14:28:04 * Author: Jimmy */ #include <avr/io.h> #include <avr/delay.h> #include <util/twi.h> int main(void) { // Portrichtung DDRD=0xFF; DDRC &= ~((1<<PC5) | (1<<PC4)); PORTC|=(1<<PC5) | (1<<PC4); _delay_ms(1000); DDRB=0xFF; // TWI Initialisieren TWBR=32; TWSR=0; TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // TWI starten while (!(TWCR & (1<<TWINT))); TWDR=0x70; // Adresse laden (schreiben) TWCR|=(1<<TWINT)|(1<<TWEN); // Adresse senden while(!(TWCR&(1<<TWINT))); PORTD=TWSR; TWDR=0x14; // Zielregister laden TWCR|=(1<<TWINT)|(1<<TWEN); // Zielreigster ansprechen while(!(TWCR&(1<<TWINT))); TWDR|=(1<<0); // Inhalt fürs Register 0x14h laden TWCR|=(1<<TWINT)|(1<<TWEN); // Inhalt senden while(!(TWCR&(1<<TWINT))); TWCR|=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // TWI beenden while(!(TWCR&(1<<TWINT))); while(1) { _delay_ms(1000); PORTB|=(1<<PB7); _delay_ms(1000); PORTB&=~(1<<PB7); } }
jetzt zu meinem Problemm. Ich verstehe nicht was der TWI da macht, bzw. warum er was falsches macht.
Laut Datenblatt des BMA020 soll das Protokoll zum Konfigurieren so aussehen:
TWI starten ---> BMA020-Schreib adresse --> welches Register --> Daten fürs Register --- > TWI Ende
Jetzt habe ich mit PORTD=TWSR; mir den Status auf eine LED-Anzeige legen lassen.
Dabei stelle ich folgendes fest:
Status nach dem Starten des TWI: 08hCode:TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // TWI starten while (!(TWCR & (1<<TWINT)));
Status nach Senden der Adresse: 18hCode:TWDR=0x70; // Adresse laden (schreiben) TWCR|=(1<<TWINT)|(1<<TWEN); // Adresse senden while(!(TWCR&(1<<TWINT))); PORTD=TWSR;
Status nach Senden des Zielregister: 10h (hier müsste aber 28h stehen)Code:TWDR=0x14; // Zielregister laden TWCR|=(1<<TWINT)|(1<<TWEN); // Zielreigster ansprechen while(!(TWCR&(1<<TWINT)));
Laut Datenblatt vom ATmega8 sind die 08h und 18h dort wo sie sind richtig.
Warum sendet der Controller nicht den Inhalt von TWDR wie gefordert, sondern wiederholt den Start des TWI?







Zitieren

Lesezeichen