AVR315: I2C Master kann nichts lesen

Gast #4418790
Lesenswert?
• ▲
▼
Hallo Forum,

ich möchte an meinem AVR (ATmega644P) einen Compass-Sensor auslesen 
(CMPS03: http://www.robot-electronics.co.uk/htm/cmps3tech.htm). Das soll 
über den I2C Bus geschehen. Zusätzlich hängt noch ein LDC Display an I2C 
(LCD03: http://www.robot-electronics.co.uk/htm/Lcd03tech.htm). Das 
funktioniert auch.

Als I2C-"Library" verwende ich den Code aus der Appnot AVR315: Using the 
TWI module as I2C master (http://www.atmel.com/images/doc2564.pdf).

Das Display funktioniert auch, aber ich kann nichts vom Bus lesen. Auch 
aus dem Beispiel der AppNote werde ich nicht wirklich schlau...

Pseudo-Code, wie es mal gehen soll:
1
uint16_t read_cmps03() {
2
    uint8_t buffer[4];
3
    buffer[0] = 0xC0 + TW_WRITE;
4
    buffer[1] = 2;
5
    TWI_Start_Transceiver_with_Data(buffer, 2);
6
    //read 2 bytes
7
    // keine Ahnung wie...
8
    return (buffer[1] << 8) + buffer[0];
9
}

Es würde mir im Prinzip schon reichen, wenn mir jemand erklären könnte, 
wie man mit der Lib Daten empfängt.

PS: ich habe leider keinen anderen I2C-Slave auslesen, weil ich keinen 
anderen habe. Damit kann ich nicht ausschließen, dass es am Kompass 
liegt.

mfG
nga
Persönliche Seite #4424545
Lesenswert?
• ▲
▼
Hallo,

das ist eigentlich ganz einfach:
zuerst muss man den buffer mit den Daten vorbereiten, also
1
uint8_t buffer[3];
2
buffer[0] = SLAVE_ADDRESS + TW_WRITE;
3
buffer[1] = 2; //das register 2 lesen
und diese daten verschicken:
1
TWI_Start_Transceiver_with_Data(buffer, 2);
Damit ist der erste Teil fertig.
DAnn geht es ans lesen der beiden Register:
Auch wieder den buffer vorbereiten und senden (Achtung: beim senden auf 
die 3 achten! DAs ist 1x die Adresse vom Slave und dann die Anzahl der 
zu Empfangenen Bytes)
1
buffer[0] = SLAVE_ADDRESS + TW_READ;
2
TWI_Start_Transceiver_with_Data(buffer, 3);
Dann eigentlich nur noch lesen:
1
if (TWI_Get_Data_From_Transceiver(buffer, 3)) return (buffer[1] << 8) + buffer[2];
2
else return CMPS03_READ_ERROR;
TWI_Get_Data_From_Transceiver gibt eine 0 zurück, wenn ein Fehler 
aufgetreten ist. Mit der Abfrage geht man sicher, dass man nur mit 
validen Daten rechnet.
PS: falls man sich wundert: buffer[0] enhält dann wieder die gesendete 
Slave-Adresse + das Read-Bit.

mfG
N.G.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.