hi Tomas,
I'm really sorry for late reply but i had a big issue on another project so i hadn't a lot of time...
you can see below my Arduino source code :
I can see if there is a mistake...
Many thanks for your help.
regards,
Nicolas.
#include <Wire.h>
#define MAG_ADDR 0x0E // 7-bit address for the MAG3110, doesn't change
void setup()
{
pinMode(38, INPUT);
Serial.begin(115200); // start serial for output
Wire.begin(); // join i2c bus (address optional for master)
config(); // turn the MAG3110 on
}
void loop()
{
if (digitalRead(38) == HIGH){
print_values();
}
}
void config(void)
{
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x10); // ctrl register1
Wire.write(0x00); // Standby
Wire.endTransmission(); // stop transmitting
delay(15);
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x11); // ctrl register2
Wire.write(0x80); // send 0x80, enable auto resets
Wire.endTransmission(); // stop transmitting
delay(15);
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x11); // ctrl register2
Wire.write(0x30); // send 0x80, enable auto resets
Wire.endTransmission(); // stop transmitting
delay(15);
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x10); // ctrl register1
Wire.write(0xC9); // send 0x01, active mode
Wire.endTransmission(); // stop transmitting
}
void print_values(void)
{
int LSB_MASK = 0x00FF;
Serial.write(0x01);
int16_t X_T = readx();
Serial.write(X_T>>8); // MSB
Serial.write(X_T & LSB_MASK); // LSB
int16_t Y_T = ready();
Serial.write(Y_T>>8); // MSB
Serial.write(Y_T & LSB_MASK); // LSB
int16_t Z_T = readz();
Serial.write(Z_T>>8); // MSB
Serial.write(Z_T & LSB_MASK); // LSB
Serial.write(0x02);
}
//////////////////////////////// Read X /////////////////////////////////////
int16_t readx(void)
{
byte xl = 0;
byte xh = 0; // define the MSB and LSB
int16_t xout = 0;
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x01); // x MSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
xh = Wire.read(); // receive the byte
}
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x02); // x LSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
xl = Wire.read(); // receive the byte
}
//xl = 0; // Ici on met le lsb à 0 pour éviter les fluctuations
xout = (xl|(xh << 8)); // concatenate the MSB and LSB
return xout;
}
//////////////////////////////// Read Y /////////////////////////////////////
int16_t ready(void)
{
byte yl = 0;
byte yh = 0; // define the MSB and LSB
int16_t yout = 0;
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x03); // y MSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
yh = Wire.read(); // receive the byte
}
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x04); // y LSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
yl = Wire.read(); // receive the byte
}
//yl = 0; // Ici on met le lsb à 0 pour éviter les fluctuations
yout = (yl|(yh << 8)); // concatenate the MSB and LSB
return yout;
}
//////////////////////////////// Read Z /////////////////////////////////////
int16_t readz(void)
{
byte zl = 0;
byte zh = 0; // define the MSB and LSB
int16_t zout = 0;
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x05); // z MSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
zh = Wire.read(); // receive the byte
}
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x06); // z LSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
zl = Wire.read(); // receive the byte
}
//zl = 0; // Ici on met le lsb à 0 pour éviter les fluctuations
zout = (zl|(zh << 8)); // concatenate the MSB and LSB
return zout;
}
//////////////////////////////// Read CTRL_REG_2 /////////////////////////////////////
byte readctrl2(void)
{
byte CTRL2; // define the MSB and LSB
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x11); // z MSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
CTRL2 = Wire.read(); // receive the byte
}
return CTRL2;
}
//////////////////////////////// Read CTRL_REG_1 /////////////////////////////////////
byte readctrl1(void)
{
byte CTRL1; // define the MSB and LSB
Wire.beginTransmission(MAG_ADDR); // transmit to device 0x0E
Wire.write(0x10); // z MSB reg
Wire.endTransmission(); // stop transmitting
delayMicroseconds(2); // needs at least 1.3us free time between start and stop
Wire.requestFrom(MAG_ADDR, 1); // request 1 byte
while(Wire.available()) // slave may send less than requested
{
CTRL1 = Wire.read(); // receive the byte
}
return CTRL1;
}