Вот код основной:
CODE
void HMC5843(void)
{
//unsigned char xh, xl, yh, yl, zh, zl;
long xo, yo, zo;
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x00); //confA reg
i2cWaitForComplete();
i2cWrite_Data(0x70); //value for confA
i2cWaitForComplete();
i2cSendStop();
delay_ms(5);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x01); //confB reg
i2cWaitForComplete();
i2cWrite_Data(0xA0); //value for confB
i2cWaitForComplete();
i2cSendStop();
delay_ms(5);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x02); //mode register
i2cWaitForComplete();
i2cWrite_Data(0x01); //continuous measurement mode
i2cWaitForComplete();
//status_er = i2cGetStatus();
//i2cCheckForMT_SLA();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x09); //status register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cRead_Address(0x3D); //write to HMC
i2cWaitForComplete();
reg_stcmp = i2cRead_Data(); //status register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x02); //mode register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
//must read all six registers plus one to move the pointer back to 0x03
i2cSendStart();
i2cWaitForComplete();
i2cRead_Address(0x3D); //read from HMC
i2cWaitForComplete();
i2cReceiveByte(TRUE);
//i2cWaitForComplete();
xh = i2cRead_Data(); //x high byte
i2cWaitForComplete();
i2cReceiveByte(TRUE);
i2cWaitForComplete();
xl = i2cRead_Data(); //x low byte
i2cWaitForComplete();
xo = xl|(xh << 8);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yh = i2cRead_Data(); //y high byte
i2cWaitForComplete();
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yl = i2cRead_Data(); //y low byte
i2cWaitForComplete();
yo = yl|(yh << 8);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zh = i2cRead_Data();
i2cWaitForComplete(); //z high byte
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zl = i2cRead_Data(); //z low byte
i2cWaitForComplete();
zo = zl|(zh << 8);
//i2cRead_Data(); //must reach 0x09 to go back to 0x03
//i2cWaitForComplete();
// i2cReceiveByte(TRUE);
//i2cWaitForComplete();
status_er = i2cGetStatus();
i2cSendStop();
}
void main(void)
{
//unsigned char xh, xl, yh, yl, zh, zl;
long xo, yo, zo;
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x00); //confA reg
i2cWaitForComplete();
i2cWrite_Data(0x70); //value for confA
i2cWaitForComplete();
i2cSendStop();
delay_ms(5);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x01); //confB reg
i2cWaitForComplete();
i2cWrite_Data(0xA0); //value for confB
i2cWaitForComplete();
i2cSendStop();
delay_ms(5);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x02); //mode register
i2cWaitForComplete();
i2cWrite_Data(0x01); //continuous measurement mode
i2cWaitForComplete();
//status_er = i2cGetStatus();
//i2cCheckForMT_SLA();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x09); //status register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cRead_Address(0x3D); //write to HMC
i2cWaitForComplete();
reg_stcmp = i2cRead_Data(); //status register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
i2cSendStart();
i2cWaitForComplete();
i2cWrite_Address(0x3C); //write to HMC
i2cWaitForComplete();
i2cWrite_Data(0x02); //mode register
i2cWaitForComplete();
i2cSendStop();
delay_ms(10);
//must read all six registers plus one to move the pointer back to 0x03
i2cSendStart();
i2cWaitForComplete();
i2cRead_Address(0x3D); //read from HMC
i2cWaitForComplete();
i2cReceiveByte(TRUE);
//i2cWaitForComplete();
xh = i2cRead_Data(); //x high byte
i2cWaitForComplete();
i2cReceiveByte(TRUE);
i2cWaitForComplete();
xl = i2cRead_Data(); //x low byte
i2cWaitForComplete();
xo = xl|(xh << 8);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yh = i2cRead_Data(); //y high byte
i2cWaitForComplete();
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yl = i2cRead_Data(); //y low byte
i2cWaitForComplete();
yo = yl|(yh << 8);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zh = i2cRead_Data();
i2cWaitForComplete(); //z high byte
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zl = i2cRead_Data(); //z low byte
i2cWaitForComplete();
zo = zl|(zh << 8);
//i2cRead_Data(); //must reach 0x09 to go back to 0x03
//i2cWaitForComplete();
// i2cReceiveByte(TRUE);
//i2cWaitForComplete();
status_er = i2cGetStatus();
i2cSendStop();
}
void main(void)