Skip to content

Commit

Permalink
Add mag data read function
Browse files Browse the repository at this point in the history
  • Loading branch information
mokhwasomssi committed Aug 13, 2021
1 parent 52753ec commit 2c4c5b5
Show file tree
Hide file tree
Showing 10 changed files with 6,235 additions and 5,348 deletions.
92 changes: 61 additions & 31 deletions icm20948.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ static float accel_scale_factor;
*
* read_single_register(userbank ub, uint8_t reg)
* read_multiple_register(userbank ub, uint8_t reg, uint8_t len)
*
* write_single_register(userbank ub, uint8_t reg, uint8_t val)
* void write_multiple_register(userbank ub, uint8_t reg, uint8_t* val, uint8_t len)
* write_multiple_register(userbank ub, uint8_t reg, uint8_t* val, uint8_t len)
*
* read_single_mag_register()
* write_single_mag_register()
* read_single_mag_register(uint8_t reg)
* read_multiple_mag_register(uint8_t reg, uint8_t len)
* write_single_mag_register(uint8_t reg, uint8_t val)
*/
static void cs_high()
{
Expand Down Expand Up @@ -68,7 +68,7 @@ static uint8_t read_single_register(userbank ub, uint8_t reg)
static uint8_t* read_multiple_register(userbank ub, uint8_t reg, uint8_t len)
{
uint8_t read_reg = READ | reg;
static uint8_t reg_val[MAX_READ];
static uint8_t reg_val[6];

select_user_bank(ub);

Expand Down Expand Up @@ -108,16 +108,22 @@ static void write_multiple_register(userbank ub, uint8_t reg, uint8_t* val, uint

static uint8_t read_single_mag_register(uint8_t reg)
{
uint8_t reg_val;

write_single_register(ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
write_single_register(ub_3, B3_I2C_SLV0_REG, reg);
write_single_register(ub_3, B3_I2C_SLV0_CTRL, 0x81);

HAL_Delay(1);
reg_val = read_single_register(ub_0, B0_EXT_SLV_SENS_DATA_00);
return read_single_register(ub_0, B0_EXT_SLV_SENS_DATA_00);
}

return reg_val;
static uint8_t* read_multiple_mag_register(uint8_t reg, uint8_t len)
{
write_single_register(ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
write_single_register(ub_3, B3_I2C_SLV0_REG, reg);
write_single_register(ub_3, B3_I2C_SLV0_CTRL, 0x80 | len);

HAL_Delay(1);
return read_multiple_register(ub_0, B0_EXT_SLV_SENS_DATA_00, len);
}

static void write_single_mag_register(uint8_t reg, uint8_t val)
Expand Down Expand Up @@ -190,28 +196,6 @@ void icm20948_accel_read_g(axises* data)
}


/* AK09916 Main Functions */
void ak009916_init()
{
icm20948_i2c_master_reset();
icm20948_i2c_master_enable();
icm20948_i2c_master_clk_frq(7);

ak09916_soft_reset();
ak09916_operation_mode_setting(continuous_measurement_100hz);
}

void ak09916_mag_read(axises* data)
{

}

void ak09916_mag_read_t(axises* data)
{

}


/* ICM-20948 Sub Functions */
bool icm20948_who_am_i()
{
Expand Down Expand Up @@ -468,6 +452,52 @@ void icm20948_accel_full_scale_select(accel_full_scale full_scale)
}


/* AK09916 Main Functions */
void ak009916_init()
{
icm20948_i2c_master_reset();
icm20948_i2c_master_enable();
icm20948_i2c_master_clk_frq(7);

ak09916_soft_reset();
ak09916_operation_mode_setting(continuous_measurement_100hz);
}

bool ak09916_mag_read(axises* data)
{
uint8_t* temp;
uint8_t drdy, hofl; // data ready, overflow

drdy = read_single_mag_register(MAG_ST1) & 0x01;
if(!drdy) return false;

temp = read_multiple_mag_register(MAG_HXL, 6);

hofl = read_single_mag_register(MAG_ST2) & 0x08;
if(hofl) return false;

data->x = (int16_t)(temp[1] << 8 | temp[0]);
data->y = (int16_t)(temp[3] << 8 | temp[2]);
data->z = (int16_t)(temp[5] << 8 | temp[4]);

return true;
}

bool ak09916_mag_read_uT(axises* data)
{
axises temp;

bool new_data = ak09916_mag_read(&temp);
if(!new_data) return false;

data->x = (float)(temp.x * 0.15);
data->y = (float)(temp.y * 0.15);
data->z = (float)(temp.z * 0.15);

return true;
}


/* AK09916 Sub Functions */
bool ak09916_who_am_i()
{
Expand Down
26 changes: 6 additions & 20 deletions icm20948.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@
#define READ 0x80
#define WRITE 0x00

#define MAX_READ 6


/* Typedefs */
typedef enum
Expand Down Expand Up @@ -74,22 +72,6 @@ typedef enum
} operation_mode;


/* Static Functions */
// static void cs_high();
// static void cs_low();

// static void select_user_bank(userbank ub);

// static uint8_t read_single_register(userbank ub, uint8_t reg);
// static uint8_t* read_multiple_register(userbank ub, uint8_t reg, uint8_t len);

// static void write_single_register(userbank ub, uint8_t reg, uint8_t val);
// static void write_multiple_register(userbank ub, uint8_t reg, uint8_t* val, uint8_t len);

// static uint8_t read_single_mag_register(uint8_t reg);
// static void write_single_mag_register(uint8_t reg, uint8_t val);


/* ICM-20948 Main Functions */
void icm20948_init();

Expand All @@ -102,11 +84,14 @@ void icm20948_accel_read_g(axises* data);

/* ICM-20948 Sub Functions */
bool icm20948_who_am_i();

void icm20948_device_reset();

void icm20948_wakeup();
void icm20948_sleep();

void icm20948_spi_slave_enable();

void icm20948_i2c_master_reset();
void icm20948_i2c_master_enable();
void icm20948_i2c_master_clk_frq(uint8_t config); // 0 - 15
Expand All @@ -131,12 +116,13 @@ void icm20948_accel_full_scale_select(accel_full_scale full_scale);
/* AK09916 Main Functions */
void ak009916_init();

void ak09916_mag_read(axises* data);
void ak09916_mag_read_t(axises* data);
bool ak09916_mag_read(axises* data); // 16bits ADC value
bool ak09916_mag_read_uT(axises* data);


/* AK09916 Sub Functions */
bool ak09916_who_am_i();

void ak09916_soft_reset();
void ak09916_operation_mode_setting(operation_mode mode);

Expand Down
7 changes: 6 additions & 1 deletion stm32f411_fw_icm20948/Core/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@
/* USER CODE BEGIN PV */
axises my_gyro;
axises my_accel;
axises my_mag;
axises my_mag2;

uint8_t mag_data[6];
uint8_t* temp2;
uint8_t status;
/* USER CODE END PV */

Expand Down Expand Up @@ -108,9 +112,10 @@ int main(void)

/* USER CODE BEGIN 3 */


icm20948_gyro_read(&my_gyro);
icm20948_accel_read(&my_accel);
ak09916_mag_read(&my_mag);
ak09916_mag_read_uT(&my_mag2);


}
Expand Down
Binary file modified stm32f411_fw_icm20948/Debug/stm32f411_fw_icm20948.bin
Binary file not shown.
Binary file modified stm32f411_fw_icm20948/Debug/stm32f411_fw_icm20948.elf
Binary file not shown.
Loading

0 comments on commit 2c4c5b5

Please sign in to comment.