// Compile with: // gcc -g -Wall -Wextra -Wno-missing-field-initializers -I. -Ilinux -I/usr/lib/gcc/arm-linux-gnueabihf/4.6/include -static i2cget.c i2cbusses.c util.c -o i2cget #include #include #include #include #include #include #include #include int main() { int res, file; char filename[20] = "/dev/i2c-0"; int axis = 0, byte = 0, count = 0; file = open_i2c_dev(0, filename, 0); set_slave_addr(file, 0x0e, 0); // set registers // DR(3) OS(2) FR(1) unsigned char reg0 = (0b000 << 5) + (0b00 << 3) + (0 << 2) // TRIG(1) ACT(1) + (0 << 1) + (1 << 0); // ARST(1) Res(1) RAW(1) RST(1) Res(4) unsigned char reg1 = (0b1 << 7) + (0b0 << 5) + (0b0 << 4); i2c_smbus_write_byte_data(file, 0x10, reg0); i2c_smbus_write_byte_data(file, 0x11, reg1); // set x, y, z offset i2c_smbus_write_byte_data(file, 0x09, 0); i2c_smbus_write_byte_data(file, 0x0A, 0); i2c_smbus_write_byte_data(file, 0x0B, 0); i2c_smbus_write_byte_data(file, 0x0C, 0); i2c_smbus_write_byte_data(file, 0x0D, 0b11110110); i2c_smbus_write_byte_data(file, 0x0E, 0b11111111); float fullScale = 925.0; while ( 1 ) { count++; res = i2c_smbus_read_byte_data(file, 0x00); if ( res != 0xff ) continue; for ( axis = 0; axis < 3; axis++ ) { int value = 0; for ( byte = 0; byte <= 1; byte++ ) { value += i2c_smbus_read_byte_data(file, axis*2 + 1 + byte) << (1-byte)*8; } if ( value >= (1 << 15) ) { value -= 1 << 16; } printf("%i ", (int) ( value / fullScale * 360 )); } printf("\n"); fflush(stdout); } exit(0); }