Nein, du hast im Datenblatt nichts falsch verstanden. Offensichtlich verstehst du aber mich falsch. Ich kann dir erst helfen wenn du anfängst auf meine fragen einzugehen. Die wichtigste davon lautet:
Bekommst du auf eine read/write ein ACK?
die 2. wichtigste:
Warum zeigst du keinen vollständigen Code?
Du darfst den HMC nicht jedes mal neu initialisieren. Außerdem musst du nach der initialisierung warten bevor du ausliest. Des weiteren musst du die Daten anfordern und dann vollständig auslesen, nur denn zeigt der read Pointer beim nächsten mal wieder auf das X Register.
Hier funktionierender Coode von mir aus Basis der I2C Lib von Peter Fleury. Der Code läuft auf einem AVR. Am Prinzip ändert das aber nichts. Die read_hmc5843() kann 10 mal pro Sekunde aufgerufen werden.
Code:
#include <globals.h>
#include "i2cmaster.h"
#include <util/delay.h>
//#################################################################
unsigned char hmc5843_init(void){
_delay_ms(10); //nach Power up kurz warten
//Device ansprechbar?
if(i2c_start(HMC5843_ADDRESS+I2C_WRITE)){
i2c_stop();
return 1;
}
//Mode Register
if(i2c_write(0x02)){
return 2;
}
//Continous Mode auswählen (10Hz)
if(i2c_write(0x00)){
return 3;
}
i2c_stop();
return 0;
}
//#################################################################
unsigned char read_hmc5843(int* x, int* y, int* z){
if(i2c_start(HMC5843_ADDRESS+I2C_READ)){
i2c_stop();
return 1;
}
*x = (i2c_readAck() << 8); //MSB X
*x += i2c_readAck(); //LSB X
*y = (i2c_readAck() << 8); //MSB Y
*y += i2c_readAck(); //LSB Y
*z = (i2c_readAck() << 8); //MSB Z
*z += i2c_readAck(); //LSB Z + Stop Bedingung
//Read Pointer wieder auf 0x03 bringen
if(i2c_start(HMC5843_ADDRESS+I2C_READ)){
i2c_stop();
return 2;
}
i2c_readNak();
return 0; //Alles ok
}
Edit: Ok, der Schaltplan sieht gut aus
Was hast du für Kondensatoren verbaut? Das Datenblatt empfiehlt nicht umsons Low ESR Typen, der HMC ist hier sehr empfindlich, bei mir hat das ganze erst mit Keramik Kondensatoren funktioniert.
Edit #2: Ok, ich nehm alles zurück, jetzt haben wir ja ein schönes Programm - fein 
Edit #3: So... was mir aufgefallen ist:
- Du initialisierst den HMC direkt nach dem Power up. Das sollte man nicht machen. Ich meine die Wartezeit beträgt mindestens 10 ms, sicher bin ich mir da aber nicht mehr. Warten muss man aber auf jeden Fall.
- Ich kenne deine I2C Lib leider nicht. Aber hast du keine Möglichkeit von den I2C Funktionen Rückmeldung zu bekommen, ob der Slave überhaupt reagiert hat? Du gehst in deinem Programm einfach davon aus das alles Fehlerfrei funktioniert - was, wenn nicht?
- Der HMC gibt 2 Byte pro Raaumrichtung zurück. Dein x, y, z passt nicht zu der Raumrichtung welche durch die Variablenbezeichnung suggeriert wird. Siehe dazu mein Code.
- Mir ist nicht ganz klar was AckI2C, IdleI2C und DataRdyI2C machen. Aber in dem Block nach x = getcI2C(); kommt mal ein StopI2C();... bei allen folgenden Zugriffen jedoch nicht. Gewollt?
Lesezeichen