// I2C адрес компаса по умолчанию
#define CMPS_ADR 0xC0
// Возвращает версию прошивки компаса
char cmps_firmware (void) {
char firmware = 0;
I2C_Init(100000); // Инициализация шины на скорости 100кбит/с
I2C_Start(); // Посылка стартового бита
I2C_Wr(CMPS_ADR); // Посылка адреса компаса
I2C_Wr(0x00); // Посылка адреса необходимого регистра
I2C_Repeated_Start(); // Посылка повторного стартового бита
I2C_Wr(CMPS_ADR+1); // Посылка адреса компаса с высоким уровнем
// бита R/W
firmware = I2C_Rd(0u); // Чтение значения регистра
I2C_Stop(); // Посылка стопового бита
return firmware;
}
// Возвращает азимут компаса как байт (0 - 255 на 360 градусов)
char cmps_azimuth_b (void) {
char azimuth = 0;
I2C_Init(100000);
I2C_Start();
I2C_Wr(CMPS_ADR);
I2C_Wr(0x01);
I2C_Repeated_Start();
I2C_Wr(CMPS_ADR+1);
azimuth = I2C_Rd(0u);
I2C_Stop();
return azimuth;
}
// Возвращает азимут компаса как слово
// (0 - 3599 соответствует 0 - 359.9 градусов)
int cmps_azimuth_w (void) {
char lo_byte = 0;
char hi_byte = 0;
int grade = 0;
I2C_Init(100000);
I2C_Start();
I2C_Wr(CMPS_ADR);
I2C_Wr(0x02);
I2C_Repeated_Start();
I2C_Wr(CMPS_ADR+1);
hi_byte = I2C_Rd(1u);
lo_byte = I2C_Rd(0u);
I2C_Stop();
grade = (hi_byte << 8) + lo_byte; // Суммирование старшего и младшего байтов
return grade;
}