16 #include "clock_config.h" 18 #include "fsl_debug_console.h" 21 #include "fsl_common.h" 22 #include "freemaster.h" 23 #include "freemaster_serial_uart.h" 26 #include "Driver_I2C.h" 29 #include "issdk_hal.h" 30 #include "gpio_driver.h" 37 #define FXOS8700_NUM_REGISTERS (FXOS8700_A_FFMT_THS_Z_LSB + 1) 38 #define FF_A_FFMT_THS (0x08) 39 #define A_FFMT_COUNT (0x18) 40 #define PL_COUNT (0x15) 41 #define ASLP_COUNTER (0x07) 42 #define ACCEL_2G_SENS (0.000244) 43 #define ACCEL_4G_SENS (0.000488) 44 #define ACCEL_8G_SENS (0.000976) 46 #define RAW_ACCELMAG_DATA_SIZE (12U) 47 #define MAX8BITSTORAGE (255U) 224 static FMSTR_U8 recBuffer[1024*10];
237 static void init_freemaster_uart(
void);
355 FMSTR_TSA_TABLE_END()
357 FMSTR_TSA_TABLE_LIST_BEGIN()
358 FMSTR_TSA_TABLE(main_table)
359 FMSTR_TSA_TABLE_LIST_END()
372 recBuffCfg.name =
"FXOS8700 3-Axis Accelerometer Data";
384 uint16_t ffmt_incr = 0;
385 uint16_t pulse_incr = 0;
386 uint16_t orient_incr = 0;
387 uint16_t vecm_incr = 0;
407 init_freemaster_uart();
411 if (ARM_DRIVER_OK != status)
417 status = I2Cdrv->PowerControl(ARM_POWER_FULL);
418 if (ARM_DRIVER_OK != status)
424 status = I2Cdrv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
425 if (ARM_DRIVER_OK != status)
546 rawData.
accel[0] /= 4;
548 rawData.
accel[1] /= 4;
550 rawData.
accel[2] /= 4;
563 else if (regdata == 2)
573 registers.
accel[0] = (float) (rawData.
accel[0] * sensitivity);
574 registers.
accel[1] = (float) (rawData.
accel[1] * sensitivity);
575 registers.
accel[2] = (float) (rawData.
accel[2] * sensitivity);
608 PRINTF(
"\r\n Mag offset X = %f Y = %f Z = %f\r\n", offnoise_data.
mag_off[0], offnoise_data.
mag_off[1], offnoise_data.
mag_off[2]);
645 if (orient_incr == 1)
801 offnoiseptr->
offx = 0.0;
802 offnoiseptr->
offy = 0.0;
803 offnoiseptr->
offz = 0.0;
804 offnoiseptr->
rmsx = 0.0;
805 offnoiseptr->
rmsy = 0.0;
806 offnoiseptr->
rmsz = 0.0;
823 static uint16_t cntr=0;
827 static float xx[
N], yy[
N], zz[
N];
828 static float xm[
N], ym[
N], zm[
N];
829 static float xsq[
N], ysq[
N], zsq[
N];
831 static float sumx=0.0;
832 static float sumy=0.0;
833 static float sumz=0.0;
843 am[0]=rawData->
accel[0]*sens;
844 am[1]=rawData->
accel[1]*sens;
845 am[2]=rawData->
accel[2]*sens;
865 offnoiseptr->
offx=0-sumx;
866 offnoiseptr->
offy=0-sumy;
867 offnoiseptr->
offz=1-sumz;
888 offnoiseptr->
rmsx=pow(stdx,0.5);
889 offnoiseptr->
rmsy=pow(stdy,0.5);
890 offnoiseptr->
rmsz=pow(stdz,0.5);
897 sumx = sumy = sumz = 0;
898 stdx = stdy = stdz = 0;
909 static uint16_t cntr=0;
913 static float xx[
N], yy[
N], zz[
N];
914 static float xm[
N], ym[
N], zm[
N];
915 static float xsq[
N], ysq[
N], zsq[
N];
921 static float sumx=0.0;
922 static float sumy=0.0;
923 static float sumz=0.0;
938 mm[0]=rawData->
mag[0]*sens;
939 mm[1]=rawData->
mag[1]*sens;
940 mm[2]=rawData->
mag[2]*sens;
972 if(Bx[0] > xx[j]) Bx[0]=xx[j];
973 if(Bx[1] < xx[j]) Bx[1]=xx[j];
974 if(By[0] > yy[j]) By[0]=yy[j];
975 if(By[1] < yy[j]) By[1]=yy[j];
976 if(Bz[0] > zz[j]) Bz[0]=zz[j];
977 if(Bz[1] < zz[j]) Bz[1]=zz[j];
980 offnoiseptr->
mag_off[0]=0.5*(Bx[0]+Bx[1]);
981 offnoiseptr->
mag_off[1]=0.5*(By[0]+By[1]);
982 offnoiseptr->
mag_off[2]=0.5*(Bz[0]+Bz[1]);
1000 offnoiseptr->
mag_rms[0]=pow(stdx,0.5);
1001 offnoiseptr->
mag_rms[1]=pow(stdy,0.5);
1002 offnoiseptr->
mag_rms[2]=pow(stdz,0.5);
1006 sumx = sumy = sumz = 0;
1007 stdx = stdy = stdz = 0;
1017 static void init_freemaster_uart(
void)
1019 uart_config_t config;
1030 UART_GetDefaultConfig(&config);
1031 config.baudRate_Bps = 115200U;
1032 config.enableTx =
false;
1033 config.enableRx =
false;
1038 FMSTR_SerialSetBaseAddress((UART_Type*)BOARD_DEBUG_UART_BASEADDR);
1040 #if FMSTR_SHORT_INTR || FMSTR_LONG_INTR 1047 #if FMSTR_SHORT_INTR || FMSTR_LONG_INTR 1065 #if defined __CORTEX_M && (__CORTEX_M == 4U)
FMSTR_TSA_TABLE_BEGIN(main_table)
Target Side Addressable (TSA) table created for this application.
uint8_t trigger_accel_offnoise
int32_t FXOS8700_I2C_Initialize(fxos8700_i2c_sensorhandle_t *pSensorHandle, ARM_DRIVER_I2C *pBus, uint8_t index, uint16_t sAddress, uint8_t whoAmi)
The interface function to initialize the sensor.
#define FXOS8700_PL_CFG_DBCNTM_CLEAR_MODE
#define FXOS8700_A_FFMT_CFG_YEFE_RAISE_EVENT
This structure defines the fxos8700 raw data buffer.
#define FXOS8700_NUM_REGISTERS
void mag_off_noise(fxos8700_accelmagdata_t *rawData, fxos8700_offset_noise_t *offnoiseptr)
Function to measure magnetometer offset noise.
uint8_t complete_mag_offnoise
This structure defines the Write command List.
#define FXOS8700_M_CTRL_REG2_M_AUTOINC_MASK
#define FXOS8700_CTRL_REG5_INT_CFG_DRDY_MASK
#define FXOS8700_CTRL_REG4_INT_EN_DRDY_EN
#define FXOS8700_A_FFMT_CFG_XEFE_MASK
fxos8700_offset_noise_t offnoise_data
const registerreadlist_t FXOS8700_ALL_REG_READ[]
Defines the register read list to read all-registers.
status_t SMC_SetPowerModeVlpr(void *arg)
Configures the system to VLPR power mode. API name used from Kinetis family to maintain compatibility...
#define FXOS8700_M_CTRL_REG1_M_OS_MASK
int32_t apply_register_read(fxos8700_i2c_sensorhandle_t FXOS8700drv, uint8_t offset, uint8_t *value)
Function to apply FXOS8700 register read operation.
#define FXOS8700_M_CTRL_REG1_M_HMS_MASK
This structure defines the fxos8700 offset and noise calculation parameters.
#define FXOS8700_WHO_AM_I_PROD_VALUE
const registerreadlist_t cFXOS8700_ffmt_src[]
Defines the register read list to read FFMT Source.
#define FXOS8700_CTRL_REG1_DR_MASK
#define BOARD_DEBUG_UART_CLK_FREQ
int main(void)
Main function.
Access structure of the GPIO Driver.
#define FXOS8700_M_CTRL_REG1_M_HMS_HYBRID_MODE
int32_t apply_register_write(fxos8700_i2c_sensorhandle_t FXOS8700drv, uint8_t offset, uint8_t value)
Function to apply FXOS8700 register write operation.
#define FXOS8700_A_FFMT_CFG_OAE_FREEFALL
fxos8700_allregs_t registers
#define FXOS8700_CTRL_REG4_INT_EN_FFMT_MASK
#define FXOS8700_INT_SOURCE_SRC_FFMT_MASK
uint8_t trigger_mag_offnoise
#define __END_WRITE_DATA__
FMSTR_REC_BUFF recBuffCfg
#define FXOS8700_M_CTRL_REG2_M_AUTOINC_HYBRID_MODE
typedef int32_t(DATA_FORMAT_Append_t))(void *pData
The interface function to append the data on the formated stream.
This structure defines the fxos8700 all registers metadata.
#define FXOS8700_A_FFMT_CFG_OAE_MASK
#define FXOS8700_CTRL_REG3_PP_OD_MASK
#define I2C_S_SIGNAL_EVENT
This defines the sensor specific information for I2C.
int32_t FXOS8700_I2C_Configure(fxos8700_i2c_sensorhandle_t *pSensorHandle, const registerwritelist_t *pRegWriteList)
The interface function to configure he sensor.
#define FXOS8700_INT_SOURCE_SRC_A_VECM_MASK
int32_t FXOS8700_I2C_ReadData(fxos8700_i2c_sensorhandle_t *pSensorHandle, const registerreadlist_t *pReadList, uint8_t *pBuffer)
The interface function to read the sensor data.
#define FXOS8700_CTRL_REG4_INT_EN_DRDY_MASK
#define BOARD_BootClockRUN
#define FXOS8700_PL_CFG_DBCNTM_MASK
void(* registeridlefunction_t)(void *userParam)
This is the register idle function type.
GENERIC_DRIVER_GPIO Driver_GPIO_KSDK
#define FXOS8700_A_FFMT_CFG_ZEFE_RAISE_EVENT
GENERIC_DRIVER_GPIO * pGpioDriver
#define FXOS8700_M_CTRL_REG1_M_ACAL_MASK
#define BOARD_UART_IRQ_HANDLER
fxos8700_operation_type
Defines host operation types.
#define FXOS8700_CTRL_REG5_INT_CFG_DRDY_INT2
#define FXOS8700_INT_SOURCE_SRC_LNDPRT_MASK
#define __END_READ_DATA__
#define FXOS8700_XYZ_DATA_CFG_FS_MASK
#define FXOS8700_CTRL_REG1_DR_HYBRID_100_HZ
#define FXOS8700_CTRL_REG4_INT_EN_FFMT_EN
#define FXOS8700_INT_SOURCE_SRC_PULSE_MASK
#define BOARD_DEBUG_UART_BASEADDR
const registerwritelist_t fxos8700_Config_Hybrid[]
Defines the register write list to configure FXOS8700 in Hybrid mode.
fxos8700_accelmagdata_t rawData
enum fxos8700_operation_type fxos8700_operation_type_t
Defines host operation types.
uint8_t readall_value[FXOS8700_NUM_REGISTERS]
#define FXOS8700_CTRL_REG2_MODS_HIGH_RES
#define FXOS8700_XYZ_DATA_CFG_FS_2G_0P244
#define FXOS8700_A_FFMT_THS_DBCNTM_MASK
#define FXOS8700_A_VECM_THS_MSB_A_VBECM_THS_MASK
void offset_noise_init(fxos8700_offset_noise_t *offnoiseptr)
Function to initialize offset noise measurement.
void accel_off_noise(fxos8700_accelmagdata_t *rawData, fxos8700_offset_noise_t *offnoiseptr, float sens)
Function to measure accelerometer offset noise.
#define FXOS8700_PL_BF_ZCOMP_ZLOCK_MASK
void(* toggle_pin)(pinID_t aPinId)
const registerreadlist_t cFXOS8700_whoami[]
Defines the register read list to read the Data Ready Status.
The fxos8700_drv.h file describes the fxos8700 driver interface and structures.
#define FXOS8700_M_CTRL_REG1_M_ACAL_DISABLE
#define FXOS8700_PL_BF_ZCOMP_BKFR_MASK
#define FXOS8700_CTRL_REG2_MODS_MASK
status_t SMC_SetPowerModeWait(void *arg)
Configures the system to WAIT power mode. API name used from Kinetis family to maintain compatibility...
int32_t apply_register_readall(fxos8700_i2c_sensorhandle_t FXOS8700drv)
Function to apply FXOS8700 register read-all operation.
void(* pin_init)(pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
This structure defines the Read command List.
const registerreadlist_t cFXOS8700_fs_src[]
Defines the register read list to read the FullScale range.
const registerreadlist_t cFXOS8700_pl_status[]
Defines the register read list to read the PL Status.
void fxos8700_isr_callback(void *pUserData)
ISR for FXOS8700 data ready event.
gpioHandleKSDK_t GREEN_LED
uint8_t reg_addr[FXOS8700_NUM_REGISTERS]
#define I2C_S_DEVICE_INDEX
#define FXOS8700_CTRL_REG3_PP_OD_PUSH_PULL
void FXOS8700_I2C_SetIdleTask(fxos8700_i2c_sensorhandle_t *pSensorHandle, registeridlefunction_t idleTask, void *userParam)
: The interface function to set the I2C Idle Task.
#define FXOS8700_CTRL_REG3_IPOL_MASK
#define FXOS8700_A_FFMT_THS_THS_MASK
void BOARD_InitDebugConsole(void)
#define FXOS8700_PL_CFG_PL_EN_MASK
#define FXOS8700_A_VECM_THS_MSB_A_VBECM_DBCNTM_MASK
#define FXOS8700_DR_STATUS_ZYXDR_MASK
#define FXOS8700_I2C_ADDR
#define FXOS8700_A_FFMT_CFG_YEFE_MASK
uint8_t complete_accel_offnoise
void BOARD_InitPins(void)
Configures pin routing and optionally pin electrical features.
int32_t update_dropdown_selection(fxos8700_allregs_t *registers, uint8_t caller)
Function to update dropdown selection.
#define FXOS8700_A_FFMT_CFG_ZEFE_MASK
const registerreadlist_t cFXOS8700_int_src[]
Defines the register read list to read the Interrupt Source.
#define FXOS8700_CTRL_REG3_IPOL_ACTIVE_HIGH
#define FXOS8700_PL_CFG_PL_EN_ENABLE
#define FXOS8700_M_CTRL_REG1_M_OS_OSR0
volatile bool bFxos8700DataReady
#define FXOS8700_A_FFMT_CFG_XEFE_RAISE_EVENT