00001 #include "i2c_compass.h"
00002
00003
00004 static const unsigned int SW_VERSION_REG = 0
00005 , HEADING_BYTE_REG = 1, HEADING_WORD_REG = 2;
00006
00007
00008 static short serial_clock_pin, serial_data_pin;
00009
00010 int getCompassRegisterValue(int i2c_reg);
00011
00012
00013 int initializeCompass(int scl_pin, int sda_pin) {
00014 serial_clock_pin = scl_pin;
00015 serial_data_pin = sda_pin;
00016
00017 I2CSPEED (50);
00018
00019 WAIT(1);
00020 return getCompassSoftwareVersion();
00021 }
00022
00023
00024 int getCompassHeadingByte() {
00025
00026 return getCompassRegisterValue(HEADING_BYTE_REG);
00027 }
00028
00029
00030 int getCompassHeadingWord() {
00031
00032 return getCompassRegisterValue(HEADING_WORD_REG);
00033 }
00034
00035
00036 int getCompassSoftwareVersion() {
00037 return getCompassRegisterValue(SW_VERSION_REG);
00038 }
00039
00040 static char i2c_out_list[1];
00041 static char i2c_in_list[2];
00042 static int compass_flag = 0;
00043 static int i2c_delay_timer = 0;
00044
00045
00046 int getCompassRegisterValue(int i2c_reg) {
00047 i2c_in_list[0] = 0x00;
00048 i2c_in_list[1] = 0x00;
00049 i2c_out_list[0] = (char)i2c_reg;
00050
00051
00052 compass_flag = I2COUT(serial_data_pin, serial_clock_pin, 0xC0, 1, i2c_out_list);
00053 if(compass_flag == 0) return -1;
00054
00055
00056 i2c_delay_timer = TIMER;
00057 while ((TIMER - i2c_delay_timer) < 50);
00058
00059 if(i2c_reg == 2 || i2c_reg == 4 || i2c_reg == 6 || i2c_reg == 8 || i2c_reg == 10) {
00060 I2CIN(serial_data_pin, serial_clock_pin, 0xC1, -1, -1, -1, -1, -1, 2, i2c_in_list);
00061 return (i2c_in_list[0] << 8) + i2c_in_list[1];
00062 } else if(i2c_reg == 0 || i2c_reg == 1 || i2c_reg == 12 || i2c_reg == 13 || i2c_reg == 14)
00063 I2CIN(serial_data_pin, serial_clock_pin, 0xC1, -1, -1, -1, -1, -1, 1, i2c_in_list);
00064 return i2c_in_list[0];
00065 }