Files

165 lines
4.3 KiB
C
Raw Permalink Normal View History

#include "main.h"
#include <stdbool.h>
#include "bmm350.h"
#include "bmm350_defs.h"
#include "bmm350_oor.h"
#include "FreeRTOS.h"
#include "cmsis_os2.h"
// I2C Handle
extern I2C_HandleTypeDef hi2c1;
extern osThreadId_t defaultTaskHandle;
extern osThreadId_t xIMU_Task;
extern osThreadId_t xMagn_Task;
//extern osThreadId_t xData_Task;
// ICM45686
typedef struct {
SPI_HandleTypeDef *hspi;
GPIO_TypeDef *GPIO_Port;
uint16_t GPIO_Pin;
uint8_t acc_fs;
uint8_t gyro_fs;
uint8_t odr;
float acc_ssf;
float gyro_ssf;
bool calibated;
// float accel_bias[3];
// float gyro_bias[3];
float imu_bias[7];
} ICM45686_HandleTypeDef;
typedef struct {
float processed_imu_data[7];
} ICM45686_Data;
// dataframe for sending quaternions over usb
typedef struct __attribute__((packed)) {
uint8_t StartByte;
uint8_t SensorAddress;
float qw;
float qx;
float qy;
float qz;
uint8_t EndByte;
} QuaternionData;
// enum to hold the packet dataframe data
typedef enum {
PACKET_START_BYTE = 0xDE,
PACKET_END_BYTE = 0xAD
} Packet_Bytes;
typedef enum {
ICM45686_WHO_AM_I = 0x72, // 0x72 = 01110010, dann den wert NIX(???)) einfach nur lesen
ICM45686_ACCEL_CONFIG0 = 0x1B,
ICM45686_GYRO_CONFIG0 = 0x1C,
ICM45686_FIFO_CONFIG0 = 0x1D,
ICM45686_PWR_MGMT0 = 0x10,
ICM45686_ODR_DECIMATE_CONFIG = 0x40,
ICM45686_ACCEL_DATA = 0x00,
ICM45686_GYRO_DATA = 0x06,
ICM45686_FIFO_COUNT = 0x12,
ICM45686_FIFO_DATA = 0x14
} ICM45686_registers;
typedef enum {
ICM45686_ACC_FS_32G = 0x00,
ICM45686_ACC_FS_16G = 0x10,
ICM45686_ACC_FS_8G = 0x20,
ICM45686_ACC_FS_4G = 0x30,
ICM45686_ACC_FS_2G = 0x40,
} ICM45686_ACC_CONF;
//typedef enum {
// ICM45686_ACC_SSF_32G = 16384.0,
// ICM45686_ACC_SSF_16G = 8192.0,
// ICM45686_ACC_SSF_8G = 4096.0,
// ICM45686_ACC_SSF_4G = 2048.0,
// ICM45686_ACC_SSF_2G = 1024.0,
//} ICM45686_ACC_FACTORS;
static const float ICM45686_ACC_SSF [5] = {
1024.0f, 2048.0f, 4096.0f, 8192.0f, 16384.0f
};
typedef enum {
ICM45686_GYRO_FS_4000DPS = 0x00,
ICM45686_GYRO_FS_2000DPS = 0x10,
ICM45686_GYRO_FS_1000DPS = 0x20,
ICM45686_GYRO_FS_500DPS = 0x30,
ICM45686_GYRO_FS_250DPS = 0x40,
ICM45686_GYRO_FS_125DPS = 0x50,
ICM45686_GYRO_FS_62_5DPS = 0x60,
ICM45686_GYRO_FS_31_25DPS = 0x70,
ICM45686_GYRO_FS_15_625DPS = 0x80,
} ICM45686_GYRO_CONF;
//typedef enum {
// ICM45686_GYRO_SSF_4000DPS = 2097.2,
// ICM45686_GYRO_SSF_2000DPS = 1048.6,
// ICM45686_GYRO_SSF_1000DPS = 524.3,
// ICM45686_GYRO_SSF_500DPS = 262.0,
// ICM45686_GYRO_SSF_250DPS = 131.0,
// ICM45686_GYRO_SSF_125DPS = 65.8,
// ICM45686_GYRO_SSF_62_5DPS = 32.8,
// ICM45686_GYRO_SSF_31_25DPS = 16.4,
// ICM45686_GYRO_SSF_15_626DPS = 8.2,
//} ICM45686_GYRO_FACTORS;
static const float ICM45686_GYRO_SSF [9] = {
8.2f, 16.4f, 32.8f, 65.5f, 131.0f, 262.0f, 524.3f, 1048.6f, 2097.2f
};
typedef enum {
ICM45686_ODR_6_4kHz_LN = 0x03 ,
ICM45686_ODR_3_2kHz_LN = 0x04,
ICM45686_ODR_1_6kHz_LN = 0x05,
ICM45686_ODR_800Hz_LN = 0x06,
ICM45686_ODR_400Hz_LNLP = 0x07,
ICM45686_ODR_200Hz_LNLP = 0x08,
ICM45686_ODR_100Hz_LNLP = 0x09,
ICM45686_ODR_50Hz_LNLP = 0x0A,
ICM45686_ODR_25Hz_LNLP = 0x0B,
ICM45686_ODR_12_5Hz_LNLP = 0x0C,
ICM45686_ODR_6_26Hz_LP = 0x0D,
ICM45686_ODR_3_125Hz_LP = 0x0E,
ICM45686_ODR_1_5625Hz_LP = 0x0F
} ICM45686_ODR;
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *I2C_address);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *I2C_address);
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
// ICM45686
void init_icm(ICM45686_HandleTypeDef *imu);
HAL_StatusTypeDef read_icm (ICM45686_HandleTypeDef *imu, uint8_t tx[], uint8_t rx[]);
HAL_StatusTypeDef read_icm_dma (ICM45686_HandleTypeDef *imu, uint8_t tx[], uint8_t rx[]);
HAL_StatusTypeDef write_icm (ICM45686_HandleTypeDef *imu, uint8_t tx[]);
void calibrate_icm (ICM45686_HandleTypeDef * imu, int samples);
// BMM350 - Declarations of read/write/delay functions for the BMM350 API
void bmm_init_DWT(void);
BMM350_INTF_RET_TYPE bmm350_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
BMM350_INTF_RET_TYPE bmm350_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
void bmm350_delay(uint32_t period_us, void *intf_ptr);
int8_t init_bmm(struct bmm350_dev *dev);
// structs that hold the sensor data
typedef struct {
uint8_t raw_imu[14];
uint8_t raw_magn [9];
} raw_sensor_data;