LSM6DSL之SPI驱动

先附代码:



/* 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);

  }

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值