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