简介
FXOS8700CQ 6轴传感器是NXP推出的一款在小型 3 x 3 x 1.2 mm QFN 塑料封装中结合了先进的 3 轴加速度传感器(±2g/±4g/±8g) 和 3 轴磁力计传感器。
这款产品将14位加速度传感器和16位磁力计与高性能ASIC结合在一起构建电子罗盘解决方案,典型的方向分辨率为0.1°,罗盘方位精度误差小于5°,可满足很多应用。
特性
- 完整的6轴电子罗盘硬件解决方案,高度集成
- 1.95 V至3.6 V VDD电源电压,1.62 V至3.6 V VDDIO电压
- ±2g /±4g /±8g动态可选的加速度满量程范围
- ±1200μT磁传感器满量程范围
- 每个传感器的输出数据速率(ODR)为1.563 Hz至800 Hz,在两个传感器均处于激活状态的混合模式下时最高为400Hz
- 低噪声:在200-Hz时加速度噪声密度<126μg/√Hz Hz带宽,<100 nT /√Hz(100 Hz带宽时)电磁噪声密度
- 14位ADC分辨率用于加速度测量
- 16位ADC分辨率用于磁性测量
- 低功耗:100 Hz时电流消耗240μA,在25Hz且两个传感器均处于激活状态消耗80μA
- 嵌入式可编程加速度事件功能
- 跌落和运动检测
- 瞬态检测
- 矢量幅度变化检测
- 脉冲和拍击检测(单次和双次)ient方向检测(纵向/横向)
- 嵌入式可编程磁事件功能
- 阈值检测
- 矢量幅度变化检测
- Aut最小/最大不定磁检测
- 自动硬铁校准
具体特性详见 FXOS8700CQ-Datasheet
传感器代码的调试
- FXOS8700CQ的数字接口
- 传感器支持I2C和SPI接口通信,本次测试使用I2C来与传感器通信.
- I2C的从机地址可以通过外部引脚进行配置,具体如下
SA1 | SA0 | Slave Address |
---|---|---|
0 | 0 | 0x1E |
0 | 1 | 0x1D |
1 | 0 | 0x1C |
1 | 1 | 0x1F |
- FXOS8700CQ的寄存器定义
/**********************************************************
* Variables definition
*********************************************************/
/*
* 7-bit I2C slave address determined by SA1 and SA0 logic level
* inputs represented in the following table:
* SA1 | SA0 | Slave Address
* 0 | 0 | 0x1E
* 0 | 1 | 0x1D
* 1 | 0 | 0x1C
* 1 | 1 | 0x1F
*/
// Accel address
#define FXOS8700CQ_I2C_ADDR (0x1E << 1) //传感器的实际i2c地址还需要加上读写位
// WHO_AM_I register value
#define FXOS8700_WHOAMI_VALUE 0xC7
// Internal register definitions
#define FXOS8700CQ_STATUS 0x00
#define FXOS8700CQ_OUT_X_MSB 0x01
#define FXOS8700CQ_OUT_X_LSB 0x02
#define FXOS8700CQ_OUT_Y_MSB 0x03
#define FXOS8700CQ_OUT_Y_LSB 0x04
#define FXOS8700CQ_OUT_Z_MSB 0x05
#define FXOS8700CQ_OUT_Z_LSB 0x06
#define FXOS8700CQ_F_SETUP 0x09
#define FXOS8700CQ_TRIG_CFG 0x0A
#define FXOS8700CQ_SYSMOD 0x0B
#define FXOS8700CQ_INT_SOURCE 0x0C
#define FXOS8700CQ_WHO_AM_I 0x0D
#define FXOS8700CQ_XYZ_DATA_CFG 0x0E
#define FXOS8700CQ_HP_FILTER_CUTOFF 0x0F
#define FXOS8700CQ_PL_STATUS 0x10
#define FXOS8700CQ_PL_CFG 0x11
#define FXOS8700CQ_PL_COUNT 0x12
#define FXOS8700CQ_PL_BF_ZCOMP 0x13
#define FXOS8700CQ_PL_THS_REG 0x14
#define FXOS8700CQ_A_FFMT_CFG 0x15
#define FXOS8700CQ_A_FFMT_SRC 0x16
#define FXOS8700CQ_A_FFMT_THS 0x17
#define FXOS8700CQ_A_FFMT_COUNT 0x18
#define FXOS8700CQ_TRANSIENT_CFG 0x1D
#define FXOS8700CQ_TRANSIENT_SRC 0x1E
#define FXOS8700CQ_TRANSIENT_THS 0x1F
#define FXOS8700CQ_TRANSIENT_COUNT 0x20
#define FXOS8700CQ_PULSE_CFG 0x21
#define FXOS8700CQ_PULSE_SRC 0x22
#define FXOS8700CQ_PULSE_THSX 0x23
#define FXOS8700CQ_PULSE_THSY 0x24
#define FXOS8700CQ_PULSE_THSZ 0x25
#define FXOS8700CQ_PULSE_TMLT 0x26
#define FXOS8700CQ_PULSE_LTCY 0x27
#define FXOS8700CQ_PULSE_WIND 0x28
#define FXOS8700CQ_ASLP_COUNT 0x29
#define FXOS8700CQ_CTRL_REG1 0x2A
#define FXOS8700CQ_CTRL_REG2 0x2B
#define FXOS8700CQ_CTRL_REG3 0x2C
#define FXOS8700CQ_CTRL_REG4 0x2D
#define FXOS8700CQ_CTRL_REG5 0x2E
#define FXOS8700CQ_OFF_X 0x2F
#define FXOS8700CQ_OFF_Y 0x30
#define FXOS8700CQ_OFF_Z 0x31
#define FXOS8700CQ_M_DR_STATUS 0x32
#define FXOS8700CQ_M_OUT_X_MSB 0x33
#define FXOS8700CQ_M_OUT_X_LSB 0x34
#define FXOS8700CQ_M_OUT_Y_MSB 0x35
#define FXOS8700CQ_M_OUT_Y_LSB 0x36
#define FXOS8700CQ_M_OUT_Z_MSB 0x37
#define FXOS8700CQ_M_OUT_Z_LSB 0x38
#define FXOS8700CQ_CMP_X_MSB 0x39
#define FXOS8700CQ_CMP_X_LSB 0x3A
#define FXOS8700CQ_CMP_Y_MSB 0x3B
#define FXOS8700CQ_CMP_Y_LSB 0x3C
#define FXOS8700CQ_CMP_Z_MSB 0x3D
#define FXOS8700CQ_CMP_Z_LSB 0x3E
#define FXOS8700CQ_M_OFF_X_MSB 0x3F
#define FXOS8700CQ_M_OFF_X_LSB 0x40
#define FXOS8700CQ_M_OFF_Y_MSB 0x41
#define FXOS8700CQ_M_OFF_Y_LSB 0x42
#define FXOS8700CQ_M_OFF_Z_MSB 0x43
#define FXOS8700CQ_M_OFF_Z_LSB 0x44
#define FXOS8700CQ_MAX_X_MSB 0x45
#define FXOS8700CQ_MAX_X_LSB 0x46
#define FXOS8700CQ_MAX_Y_MSB 0x47
#define FXOS8700CQ_MAX_Y_LSB 0x48
#define FXOS8700CQ_MAX_Z_MSB 0x49
#define FXOS8700CQ_MAX_Z_LSB 0x4A
#define FXOS8700CQ_MIN_X_MSB 0x4B
#define FXOS8700CQ_MIN_X_LSB 0x4C
#define FXOS8700CQ_MIN_Y_MSB 0x4D
#define FXOS8700CQ_MIN_Y_LSB 0x4E
#define FXOS8700CQ_MIN_Z_MSB 0x4F
#define FXOS8700CQ_MIN_Z_LSB 0x50
#define FXOS8700CQ_TEMP 0x51
#define FXOS8700CQ_M_THS_CFG 0x52
#define FXOS8700CQ_M_THS_SRC 0x53
#define FXOS8700CQ_M_THS_X_MSB 0x54
#define FXOS8700CQ_M_THS_X_LSB 0x55
#define FXOS8700CQ_M_THS_Y_MSB 0x56
#define FXOS8700CQ_M_THS_Y_LSB 0x57
#define FXOS8700CQ_M_THS_Z_MSB 0x58
#define FXOS8700CQ_M_THS_Z_LSB 0x59
#define FXOS8700CQ_M_THS_COUNT 0x5A
#define FXOS8700CQ_M_CTRL_REG1 0x5B
#define FXOS8700CQ_M_CTRL_REG2 0x5C
#define FXOS8700CQ_M_CTRL_REG3 0x5D
#define FXOS8700CQ_M_INT_SRC 0x5E
#define FXOS8700CQ_A_VECM_CFG 0x5F
#define FXOS8700CQ_A_VECM_THS_MSB 0x60
#define FXOS8700CQ_A_VECM_THS_LSB 0x61
#define FXOS8700CQ_A_VECM_CNT 0x62
#define FXOS8700CQ_A_VECM_INITX_MSB 0x63
#define FXOS8700CQ_A_VECM_INITX_LSB 0x64
#define FXOS8700CQ_A_VECM_INITY_MSB 0x65
#define FXOS8700CQ_A_VECM_INITY_LSB 0x66
#define FXOS8700CQ_A_VECM_INITZ_MSB 0x67
#define FXOS8700CQ_A_VECM_INITZ_LSB 0x68
#define FXOS8700CQ_M_VECM_CFG 0x69
#define FXOS8700CQ_M_VECM_THS_MSB 0x6A
#define FXOS8700CQ_M_VECM_THS_LSB 0x6B
#define FXOS8700CQ_M_VECM_CNT 0x6C
#define FXOS8700CQ_M_VECM_INITX_MSB 0x6D
#define FXOS8700CQ_M_VECM_INITX_LSB 0x6E
#define FXOS8700CQ_M_VECM_INITY_MSB 0x6F
#define FXOS8700CQ_M_VECM_INITY_LSB 0x70
#define FXOS8700CQ_M_VECM_INITZ_MSB 0x71
#define FXOS8700CQ_M_VECM_INITZ_LSB 0x72
#define FXOS8700CQ_A_FFMT_THS_X_MSB 0x73
#define FXOS8700CQ_A_FFMT_THS_X_LSB 0x74
#define FXOS8700CQ_A_FFMT_THS_Y_MSB 0x75
#define FXOS8700CQ_A_FFMT_THS_Y_LSB 0x76
#define FXOS8700CQ_A_FFMT_THS_Z_MSB 0x77
#define FXOS8700CQ_A_FFMT_THS_Z_LSB 0x78
- FXOS8700CQ的初始化
初始化中配置了传感器的量程,采样速率,并配置了瞬态加速度中断,将产生的中断信道映射到INT2的引脚上。
/*******************************************************************************
* 名 称: Bsp_Fxos8700cqInit
* 功 能: Fxos8700cq传感器初始化
* 入口参数: 无
* 出口参数: 无
* 作 者: Roger-WY
* 创建日期: 2020-04-08
* 修 改:
* 修改日期:
* 备 注:
*******************************************************************************/
int8_t Bsp_Fxos8700cqInit(void)
{
static uint8_t whoAmI = 0;
int8_t ret = 0;
OS_ERR err;
Fxos8700cq_GpioInit();
/* 配置 FXOS8700CQ 传感器 */
Bsp_Fxos8700cqRdRegData(FXOS8700CQ_WHO_AM_I,&whoAmI,1);
if(FXOS8700_WHOAMI_VALUE == whoAmI)
{
//ACC
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x00) != 1) // CTRL_REG1, STANDBY
{
ret = -2;
}
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_XYZ_DATA_CFG,0x02) != 1) //XYZ_DATA_CFG, +-8g 0.488 mg/LSB 未打开高通滤波
{
ret = -2;
} else {
GetAccSensitivity(ACCEL_RANGE_8G); //根据设置的量程修改加速度分辨率
}
//--------------- 配置瞬时加速度中断相关寄存器--------------------//
//1 000 0101 瞬态加速度检测阈值设置(63mg/LSB)
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_THS,0x82) != 1)
{
ret = -2;
}
//see Table68
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_COUNT,0x02) != 1)
{
ret = -2;
}
/*000 1 1 1 1 0 使能Z,Y,X轴的瞬态加速度检测 关闭高通滤波
# TRANSIENT_CFG:
# tran_qs_ele = 1 => event latching enabled 锁存中断寄存器状态
# tran_qs_zefe = 1 => z-axis event detection enabled
# tran_qs_yefe = 1 => y-axis event detection enabled
# tran_qs_xefe = 1 => x-axis event detection enabled
# tran_qs_hpf_byp = 0 => high-pass filter is NOT bypassed 关闭高通滤波
*/
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_TRANSIENT_CFG,0x1E) != 1)
{
ret = -2;
}
//--------------- 配置中断相关寄存器--------------------//
//0 0 1 0 0 0 0 0 只使能了瞬态中断 //see page 47
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG4,0x20) != 1)
{
ret = -2;
}
//0 0 0 0 0 0 0 0 所有中断映射到INT2引脚上 //see page48
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG5,0x00) != 1)
{
ret = -2;
}
//0 1(睡眠模式下瞬态中断) 0 0 0 0(睡眠模式下加速度向量中断) 0(中断低电平有效) 1(开漏) //see page 47
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG3,0x41) != 1)
{
ret = -2;
}
//if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG2,0x07) != 1) // 0 0 0 00 1 11 使能自动休眠 低功耗过采样模式
//0 0 0 01(lownoise lowpower) 1(autosleep) 01
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG2,0x0D) != 1)
{
ret = -2;
}
//MAG Setup device for hybrid mode, enable hybrid mode auto-increment
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_M_CTRL_REG1,0x1F) != 1) // M_CTRL_REG1, Oversampling 16 100Hz hybrind, acc mag active
{
ret = -2;
}
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_M_CTRL_REG2,0x20) != 1) // M_CTRL_REG2, Jump to reg 0x33 after reading 0x06
{
ret = -2;
}
//if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x1D) != 1) // CTRL_REG1, Hybrid 100Hz, Low Noise, Active
// 00 011 0 0 1 设置休眠模式下采样率(00:50HZ) 输出数据的速率(011:100HZ) 正常模式(0) 开启工作(1)
//if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x19) != 1)
// 00 000 0 0 1 设置休眠模式下采样率(00:50HZ) 输出数据的速率(000:800HZ/400HZ) 正常模式(0) 开启工作(1)
if(Bsp_Fxos8700cqWrSingleCmd(FXOS8700CQ_CTRL_REG1,0x01) != 1)
{
ret = -2;
}
#ifdef USE_FXOS_INT1
Bsp_Fxos8700cqIntInit(); //中断初始化
OSSemCreate ((OS_SEM *)&SemFxos8700cqIntOne,
(CPU_CHAR *)"fxos8700cqint_Sem",
(OS_SEM_CTR )0,
(OS_ERR *)&err);
#endif
Bsp_Fxos8700cqClearIntFlag();
}
else
{
ret = -1; //无法识别芯片
}
return(ret);
}
- FXOS8700CQ读取传感器的值
- 读取温度值
读取温度值,需要开启磁力计的功能才能使用
/*******************************************************************************
* 名 称: Bsp_ReadFxos8700cqTemp
* 功 能: 读取Fxos8700cq传感器温度
* 入口参数: pTemp :温度值 -40~125℃
* 出口参数: 0:读取成功 1:读取失败
* 作 者: Roger-WY
* 创建日期: 2020-04-08
* 修 改:
* 修改日期:
* 备 注: 读取温度,需要先打开磁力计
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqTemp(int8_t *pTemp)
{
uint8_t ctemp = 0;
if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_TEMP,&ctemp,1))
{
*pTemp = (int8_t)((int8_t)ctemp * 0.96);
return 0;
}
return -1;
}
```c
- 读取加速度值
```c
/*******************************************************************************
* 名 称: Bsp_ReadFxos8700cqAcc
* 功 能: 读取Fxos8700cq传感器加速度
* 入口参数: pAcc :加速度值
* 出口参数: 0:读取成功 1:读取失败
* 作 者: Roger-WY
* 创建日期: 2020-04-08
* 修 改:
* 修改日期:
* 备 注:
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqAcc(fxos8700RawData_t *pAcc)
{
uint8_t acc_buf[6] = {0};
if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_OUT_X_MSB,acc_buf,6))
{
pAcc->x = (int16_t)(((acc_buf[0] << 8) | acc_buf[1])) >> 2;
pAcc->y = (int16_t)(((acc_buf[2] << 8) | acc_buf[3])) >> 2;
pAcc->z = (int16_t)(((acc_buf[4] << 8) | acc_buf[5])) >> 2;
pAcc->x *= accSensitivity;
pAcc->y *= accSensitivity;
pAcc->z *= accSensitivity;
return 0;
}
return -1;
}
- 读取磁力计的值
/*******************************************************************************
* 名 称: Bsp_ReadFxos8700cqMagn
* 功 能: 读取Fxos8700cq传感器磁力计
* 入口参数: pMagnData :磁力计的值
* 出口参数: 0:读取成功 1:读取失败
* 作 者: Roger-WY
* 创建日期: 2020-04-08
* 修 改:
* 修改日期:
* 备 注: 磁力计的分辨率为 0.1uT/LSB
*******************************************************************************/
int8_t Bsp_ReadFxos8700cqMagn(fxos8700RawData_t *pMagnData)
{
uint8_t magn_buf[6] = {0};
if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_M_OUT_X_MSB,magn_buf,6))
{
pMagnData->x = ((magn_buf[0] << 8) | magn_buf[1]);
pMagnData->y = ((magn_buf[2] << 8) | magn_buf[3]);
pMagnData->z = ((magn_buf[4] << 8) | magn_buf[5]);
pMagnData->x *= 0.1; //0.1uT/LSB
pMagnData->y *= 0.1;
pMagnData->z *= 0.1;
return 0;
}
return -1;
}
- 连续读取加速度和磁力计的值
如果要连续读取,需要先配置磁力计M_CTRL_REG2寄存器在读取0x06寄存器后跳转到0x33寄存器
/*******************************************************************************
* 名 称: Bsp_ReadAccelMagnData
* 功 能: 连续读取Fxos8700cq传感器加速度和磁力计的值
* 入口参数: pAccelData: 加速度的值 pMagnData :磁力计的值
* 出口参数: 0:读取成功 1:读取失败
* 作 者: Roger-WY
* 创建日期: 2020-04-08
* 修 改:
* 修改日期:
* 备 注: 需要配置磁力计M_CTRL_REG2寄存器在读取0x06寄存器后跳转到0x33寄存器
*******************************************************************************/
int16_t Bsp_ReadAccelMagnData(fxos8700RawData_t *pAccelData, fxos8700RawData_t *pMagnData)
{
uint8_t buf[13] = {0};
if(Bsp_Fxos8700cqRdRegData(FXOS8700CQ_STATUS,buf,13))
{
pAccelData->x = (int16_t)(((buf[1] << 8) | buf[2])) >> 2;
pAccelData->y = (int16_t)(((buf[3] << 8) | buf[4])) >> 2;
pAccelData->z = (int16_t)(((buf[5] << 8) | buf[6])) >> 2;
pAccelData->x *= accSensitivity;
pAccelData->y *= accSensitivity;
pAccelData->z *= accSensitivity;
pMagnData->x = ((buf[7] << 8) | buf[8]);
pMagnData->y = ((buf[9] << 8) | buf[10]);
pMagnData->z = ((buf[11] << 8) | buf[12]);
pMagnData->x *= 0.1; //0.1uT/LSB
pMagnData->y *= 0.1;
pMagnData->z *= 0.1;
return 0;
}
return -1;
}