ak-kr-project/Core/Src/LSM9DS1.c

130 lines
3.1 KiB
C
Raw Normal View History

#include "main.h"
#include "LSM9DS1.h"
#include "lcd.h"
#define FAILSAFE_PRE_OP for (size_t t = 0; t < 5; t++) {
#define FAILSAFE_POST_OP_ACCEL(prefix) if (op_result) print_error_accel(op_result, err_count, t, prefix); else break; }
#define FAILSAFE_POST_OP_MAGNET(prefix) if (op_result) print_error_magnet(op_result, err_count, t, prefix); else break; }
extern I2C_HandleTypeDef hi2c1;
static void print_error_message(HAL_StatusTypeDef result, size_t *err_count, size_t t, char *prefix)
{
DISPLAY_SET_CURSOR(1, 0);
display_write_data_seq(prefix);
display_write_data_byte(' ');
(*err_count)++;
display_write_data_byte('1' + t);
display_write_data_seq("/5 ");
switch (result) {
case HAL_ERROR:
display_write_data_seq("ERROR");
break;
case HAL_BUSY:
display_write_data_seq("BUSY");
break;
case HAL_TIMEOUT:
display_write_data_seq("TIMEOUT");
break;
}
HAL_Delay(1000);
}
static void print_error_accel(HAL_StatusTypeDef result, size_t *err_count, size_t t, char *prefix)
{
DISPLAY_CLEAR;
display_write_data_seq("LSM9DS1 Accel");
print_error_message(result, err_count, t, prefix);
}
static void print_error_magnet(HAL_StatusTypeDef result, size_t *err_count, size_t t, char *prefix)
{
DISPLAY_CLEAR;
display_write_data_seq("LSM9DS1 Magnet");
print_error_message(result, err_count, t, prefix);
}
void LSM9DS1_test_accel(void)
{
DISPLAY_CLEAR;
display_write_data_seq("LSM9DS1 Accel");
HAL_StatusTypeDef op_result;
uint8_t buffer[6];
size_t err_count = 0;
// enable sampling at 10 Hz
buffer[0] = 0x20;
buffer[1] = 0x20;
FAILSAFE_PRE_OP;
op_result = HAL_I2C_Master_Transmit(&hi2c1, 0xD6, buffer, 2, 1000);
FAILSAFE_POST_OP_ACCEL("E");
HAL_Delay(100);
// set future read address
buffer[0] = 0x28;
FAILSAFE_PRE_OP;
op_result = HAL_I2C_Master_Transmit(&hi2c1, 0xD6, buffer, 1, 1000);
FAILSAFE_POST_OP_ACCEL("A");
// read from registers sequentially
FAILSAFE_PRE_OP;
op_result = HAL_I2C_Master_Receive(&hi2c1, 0xD7, buffer, 6, 1000);
FAILSAFE_POST_OP_ACCEL("R");
if (!err_count) {
DISPLAY_SET_CURSOR(1, 1);
display_write_data_seq("OK");
} else {
DISPLAY_SET_CURSOR(1, 0);
display_write_data_byte('0' + ((err_count / 10) % 10));
display_write_data_byte('0' + (err_count % 10));
display_write_data_seq(" errors");
}
}
void LSM9DS1_cleanup_accel(void)
{
// power down the accelerometer
uint8_t buffer[2] = {0x20, 0x00};
HAL_I2C_Master_Transmit(&hi2c1, 0xD6, buffer, 2, 1000);
}
void LSM9DS1_test_magnet(void)
{
DISPLAY_CLEAR;
display_write_data_seq("LSM9DS1 Magnet");
HAL_StatusTypeDef op_result;
uint8_t buffer[6];
size_t err_count = 0;
// set future read address
buffer[0] = 0x28;
FAILSAFE_PRE_OP;
op_result = HAL_I2C_Master_Transmit(&hi2c1, 0x3C, buffer, 1, 1000);
FAILSAFE_POST_OP_ACCEL("A");
// read from registers sequentially
FAILSAFE_PRE_OP;
op_result = HAL_I2C_Master_Receive(&hi2c1, 0x3D, buffer, 6, 1000);
FAILSAFE_POST_OP_ACCEL("R");
if (!err_count) {
DISPLAY_SET_CURSOR(1, 1);
display_write_data_seq("OK");
} else {
DISPLAY_SET_CURSOR(1, 0);
display_write_data_byte('0' + ((err_count / 10) % 10));
display_write_data_byte('0' + (err_count % 10));
display_write_data_seq(" errors");
}
}