先附代码:
/* sensor control reg */
#define LSM6DSL_FIFO_CTRL5 0X0A
#define LSM6DSL_CTRL1_XL 0X10
#define LSM6DSL_CTRL2_G 0X11
#define LSM6DSL_CTRL3_C 0X12
#define LSM6DSL_CTRL4_C 0X13
#define LSM6DSL_CTRL5_C 0X14
#define LSM6DSL_CTRL6_C 0X15
#define LSM6DSL_CTRL7_G 0X16
#define LSM6DSL_CTRL8_XL 0X17
#define LSM6DSL_CTRL9_XL 0X18
#define LSM6DSL_CTRL10_C 0X19
#define LSM6DSL_INT1_CTRL 0X0D
#define LSM6DSL_INT2_CTRL 0X0E
#define LSM6DSL_WHO_AM_I 0x0F //get id
/* sensor output data */
#define LSM6DSL_OUTX_L_G 0X22
#define LSM6DSL_OUTX_H_G 0X23
#define LSM6DSL_OUTY_L_G 0X24
#define LSM6DSL_OUTY_H_G 0X25
#define LSM6DSL_OUTZ_L_G 0X26
#define LSM6DSL_OUTZ_H_G 0X27
#define LSM6DSL_OUTX_L_XL 0X28
#define LSM6DSL_OUTX_H_XL 0X29
#define LSM6DSL_OUTY_L_XL 0X2A
#define LSM6DSL_OUTY_H_XL 0X2B
#define LSM6DSL_OUTZ_L_XL 0X2C
#define LSM6DSL_OUTZ_H_XL 0X2D
#define LSM6DSL_SENSORHUB1_REG 0X2E
#define LSM6DSL_SENSORHUB2_REG 0X2F
#define LSM6DSL_SENSORHUB3_REG 0X30
#define LSM6DSL_SENSORHUB4_REG 0X31
#define LSM6DSL_SENSORHUB5_REG 0X32
#define LSM6DSL_SENSORHUB6_REG 0X33
#define LSM6DSL_SENSORHUB7_REG 0X34
#define LSM6DSL_SENSORHUB8_REG 0X35
#define LSM6DSL_SENSORHUB9_REG 0X36
#define LSM6DSL_SENSORHUB10_REG 0X37
#define LSM6DSL_SENSORHUB11_REG 0X38
#define LSM6DSL_SENSORHUB12_REG 0X39
#define LSM6DSL_FIFO_STATUS1 0X3A
#define LSM6DSL_FIFO_STATUS2 0X3B
#define LSM6DSL_FIFO_STATUS3 0X3C
#define LSM6DSL_FIFO_STATUS4 0X3D
#define LSM6DSL_FIFO_DATA_OUT_L 0X3E
#define LSM6DSL_FIFO_DATA_OUT_H 0X3F
#define LSM6DSL_TIMESTAMP0_REG 0X40
#define LSM6DSL_TIMESTAMP1_REG 0X41
#define LSM6DSL_TIMESTAMP2_REG 0X42
#define LSM6DSL_STEP_TIMESTAMP_L 0X49
#define LSM6DSL_STEP_TIMESTAMP_H 0X4A
#define LSM6DSL_STEP_COUNTER_L 0X4B
#define LSM6DSL_STEP_COUNTER_H 0X4C
#define LSM6DSL_SENSORHUB13_REG 0X4D
#define LSM6DSL_SENSORHUB14_REG 0X4E
#define LSM6DSL_SENSORHUB15_REG 0X4F
#define LSM6DSL_SENSORHUB16_REG 0X50
#define LSM6DSL_SENSORHUB17_REG 0X51
#define LSM6DSL_SENSORHUB18_REG 0X52
#define LSM6DSL_FUNC_SRC1 0X53
#define LSM6DSL_FUNC_SRC2 0X54
#define LSM6DSL_TAP_CFG 0X58
#define LSM6DSL_TAP_THS_6D 0X59
#define LSM6DSL_INT_DUR2 0X5A
#define LSM6DSL_WAKE_UP_THS 0X5B
#define LSM6DSL_WAKE_UP_DUR 0X5C
#define LSM6DSL_FREE_FALL 0X5D
#define LSM6DSL_MD1_CFG 0X5E
#define LSM6DSL_MD2_CFG 0X5F
/************** Access Device RAM *******************/
#define LSM6DSL_MASTER_CMD_CODE 0X60
#define LSM6DSL_SENS_SYNC_SPI_ERROR_CODE 0X61
/************** Embedded functions register mapping *******************/
#define LSM6DSL_OUT_MAG_RAW_X_L 0x66
#define LSM6DSL_OUT_MAG_RAW_X_H 0x67
#define LSM6DSL_OUT_MAG_RAW_Y_L 0x68
#define LSM6DSL_OUT_MAG_RAW_Y_H 0x69
#define LSM6DSL_OUT_MAG_RAW_Z_L 0x6A
#define LSM6DSL_OUT_MAG_RAW_Z_H 0x6B
#define LSM6DSL_X_OFS_USR 0x73
#define LSM6DSL_Y_OFS_USR 0x74
#define LSM6DSL_Z_OFS_USR 0x75
#define LSM6DSL_STATUS_REG 0x1E
/*******************************************************************************
* Register : CTRL1_XL
* Address : 0X10
* Bit Group Name: FS_XL
* Permission : RW
*******************************************************************************/
typedef enum {
LSM6DSL_FS_XL_2g = 0x00,
LSM6DSL_FS_XL_16g = 0x04,
LSM6DSL_FS_XL_4g = 0x08,
LSM6DSL_FS_XL_8g = 0x0C,
} LSM6DSL_FS_XL_t;
/*******************************************************************************
* Register : CTRL1_XL
* Address : 0X10
* Bit Group Name: ODR_XL
* Permission : RW
*******************************************************************************/
typedef enum {
LSM6DSL_ODR_XL_POWER_DOWN = 0x00,
LSM6DSL_ODR_XL_13Hz = 0x10,
LSM6DSL_ODR_XL_26Hz = 0x20,
LSM6DSL_ODR_XL_52Hz = 0x30,
LSM6DSL_ODR_XL_104Hz = 0x40,
LSM6DSL_ODR_XL_208Hz = 0x50,
LSM6DSL_ODR_XL_416Hz = 0x60,
LSM6DSL_ODR_XL_833Hz = 0x70,
LSM6DSL_ODR_XL_1660Hz = 0x80,
LSM6DSL_ODR_XL_3330Hz = 0x90,
LSM6DSL_ODR_XL_6660Hz = 0xA0,
LSM6DSL_ODR_XL_13330Hz = 0xB0,
} LSM6DSL_ODR_XL_t;
extern short Ax,Ay,Az;
extern short Gx,Gy,Gz;
/******USE SPI MODEL****/
void LSM6DSL_Init_spi(void) ;
void LSM6DSL_Get_RawAcc(void); // 获取加速度值
void LSM6DSL_Get_RawGryo(void); // 获取陀螺仪值
void LSM6DSL_Init_spi(void)
{
// LSM6DSL_Write_Reg(LSM6DSL_CTRL2_G,0X1C); //陀螺仪12.5hz,2000dps
LSM6DSL_Write_Reg(LSM6DSL_CTRL2_G,0X40); //陀螺仪12.5hz,2000dps
LSM6DSL_Write_Reg(LSM6DSL_CTRL10_C,0x38); //使能陀螺仪X,Y,Z轴 //启用内置功能和加速计过滤器的功能 使能计步器算法 使能倾斜的计算
//唤醒中断寄存器配置
LSM6DSL_Write_Reg(LSM6DSL_CTRL1_XL,0x60); // Acc = 416Hz(高性能模式)加速度±2g
LSM6DSL_Write_Reg(LSM6DSL_TAP_CFG,0x90); //启用中断 X方向上启用
// LSM6DSL_Write_Reg(LSM6DSL_TAP_CFG,0x1E); //关闭中断 XYZ方向上启用
LSM6DSL_Write_Reg(LSM6DSL_WAKE_UP_DUR,0x00);
LSM6DSL_Write_Reg(LSM6DSL_WAKE_UP_THS,0x02);
LSM6DSL_Write_Reg(LSM6DSL_MD1_CFG,0x20); //启用INT1唤醒事件路由
// 6D Orientation Configuration 根据需求自行添加 (正反面值有差异)
LSM6DSL_Write_Reg(LSM6DSL_TAP_THS_6D,0x40); //4D/6D功能的阈值 60 degrees(度)
LSM6DSL_Write_Reg(LSM6DSL_CTRL8_XL,0x01); //LPF2对6D功能选择
```void LSM6DSL_Init_spi(void)
{
#if 1
// LSM6DSL_Write_Reg(LSM6DSL_CTRL2_G,0X1C); //陀螺仪12.5hz,2000dps
LSM6DSL_Write_Reg(LSM6DSL_CTRL2_G,0X40); //陀螺仪12.5hz,2000dps
LSM6DSL_Write_Reg(LSM6DSL_CTRL10_C,0x38); //使能陀螺仪X,Y,Z轴 //启用内置功能和加速计过滤器的功能 使能计步器算法 使能倾斜的计算
//唤醒中断寄存器配置
LSM6DSL_Write_Reg(LSM6DSL_CTRL1_XL,0x60); // Acc = 416Hz(高性能模式)加速度±2g
LSM6DSL_Write_Reg(LSM6DSL_TAP_CFG,0x90); //启用中断 X方向上启用
// LSM6DSL_Write_Reg(LSM6DSL_TAP_CFG,0x1E); //关闭中断 XYZ方向上启用
LSM6DSL_Write_Reg(LSM6DSL_WAKE_UP_DUR,0x00);
LSM6DSL_Write_Reg(LSM6DSL_WAKE_UP_THS,0x02);
LSM6DSL_Write_Reg(LSM6DSL_MD1_CFG,0x20); //启用INT1唤醒事件路由
// 6D Orientation Configuration 根据需求自行添加 (正反面值有差异)
LSM6DSL_Write_Reg(LSM6DSL_TAP_THS_6D,0x40); //4D/6D功能的阈值 60 degrees(度)
LSM6DSL_Write_Reg(LSM6DSL_CTRL8_XL,0x01); //LPF2对6D功能选择
}
short Ax,Ay,Az;
short Gx,Gy,Gz;
/************************* 获取加速度值 **********************/
void LSM6DSL_Get_RawAcc(void) //SPI协议
{
uint8_t buf[6];
LSM6DSL_Get_RawGryo();
if((LSM6DSL_Read_Reg(LSM6DSL_STATUS_REG)&0x01)!=0) //有数据生成
{
buf[0]= LSM6DSL_Read_Reg(LSM6DSL_OUTX_H_XL);
buf[1]= LSM6DSL_Read_Reg(LSM6DSL_OUTX_L_XL);
buf[2]= LSM6DSL_Read_Reg(LSM6DSL_OUTY_H_XL);
buf[3]= LSM6DSL_Read_Reg(LSM6DSL_OUTY_L_XL);
buf[4]= LSM6DSL_Read_Reg(LSM6DSL_OUTZ_H_XL);
buf[5]= LSM6DSL_Read_Reg(LSM6DSL_OUTZ_L_XL);
Ax=(buf[0]<<8)|buf[1];
Ay=(buf[2]<<8)|buf[3];
Az=(buf[4]<<8)|buf[5];
}
}
/******************** 获取陀螺仪值 ************************/
//int16_t Gx,Gy,Gz;
void LSM6DSL_Get_RawGryo(void) //SPI协议
{
uint8_t buf[6];
if((LSM6DSL_Read_Reg(LSM6DSL_STATUS_REG)&0x02)!=0) //有数据生成
{
buf[0]= LSM6DSL_Read_Reg(LSM6DSL_OUTX_H_G);
buf[1]= LSM6DSL_Read_Reg(LSM6DSL_OUTX_L_G);
buf[2]= LSM6DSL_Read_Reg(LSM6DSL_OUTY_H_G);
buf[3]= LSM6DSL_Read_Reg(LSM6DSL_OUTY_L_G);
buf[4]= LSM6DSL_Read_Reg(LSM6DSL_OUTZ_H_G);
buf[5]= LSM6DSL_Read_Reg(LSM6DSL_OUTZ_L_G);
Gx=(buf[0]<<8)|buf[1];
Gy=(buf[2]<<8)|buf[3];
Gz=(buf[4]<<8)|buf[5];
}
}
main.c中
while (1)
{
LSM6DSL_Get_RawAcc(); // 获取加速度值
Delay_ms(10);
LSM6DSL_Get_RawGryo(); // 获取陀螺仪值
Delay_ms(10);
}