Forum: Mikrocontroller und Digitale Elektronik AVR315: I2C Master kann nichts lesen


von nga (Gast)


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

von N. G. (newgeneration) Benutzerseite


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.

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.