锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

LSM6DS3TR-C姿态传感器的使用(二)---HAL库硬件IIC和官方例程

时间:2022-08-19 16:00:02 mems传感器里面pw传感器

上一段记录,使用模拟IIC读取LSM6DS3TR数据,本记录使用硬件IIC和LSM6DS3TR官方例程,读取加速计、陀螺仪、温度数据,并用加速计数据装换角度。

官方网站的例程写得很好,感兴趣的网友可以下载下来看看,对自己的编程思路也提升,连接到下面。

(9条消息) LSM6DS3TR-C官网例程-单片机文档资源-CSDN文库

官方网站将使用的寄存器分别包装成结构体,例如如下:CTRL1_XL寄存器

typedef struct
{
#if DRV_BYTE_ORDER == DRV_LITTLE_ENDIAN
uint8_t bw0_xl : 1;
uint8_t lpf1_bw_sel : 1;
uint8_t fs_xl : 2;
uint8_t odr_xl : 4;
#elif DRV_BYTE_ORDER == DRV_BIG_ENDIAN
uint8_t odr_xl : 4;
uint8_t fs_xl : 2;
uint8_t lpf1_bw_sel : 1;
uint8_t bw0_xl : 1;
#endif /* DRV_BYTE_ORDER */
} lsm6ds3tr_c_ctrl1_xl_t;

(其他寄存器可自行下载官网程序查看)

官方网站还将配置寄存器的操作包装成函数,并采取正确的方式CTRL1_XL配置寄存器 例如,程序如下

int32_t lsm6ds3tr_c_xl_full_scale_set(stmdev_ctx_t *ctx,lsm6ds3tr_c_fs_xl_t val)
{
lsm6ds3tr_c_ctrl1_xl_t ctrl1_xl;
int32_t ret;

ret = lsm6ds3tr_c_read_reg(ctx, LSM6DS3TR_C_CTRL1_XL,(uint8_t *)&ctrl1_xl, 1);

if (ret == 0)
{
ctrl1_xl.fs_xl = (uint8_t) val;
ret = lsm6ds3tr_c_write_reg(ctx, LSM6DS3TR_C_CTRL1_XL,(uint8_t *)&ctrl1_xl, 1);
}

return ret;
}

我们主要看 紫色 函数如下:

int32_t lsm6ds3tr_c_read_reg(stmdev_ctx_t *ctx, uint8_t reg,uint8_t *data,uint16_t len)
{
int32_t ret;

ret = ctx->read_reg(ctx->handle, reg, data, len);

return ret;
}

int32_t lsm6ds3tr_c_write_reg(stmdev_ctx_t *ctx, uint8_t reg,uint8_t *data,uint16_t len)
{
int32_t ret;

ret = ctx->write_reg(ctx->handle, reg, data, len);

return ret;
}

要实现紫色字体标记的函数,必须实现 红字体标注的函数,所以红字体的函数是我们自己要实现的(具体实现函数,稍后贴在下面)。

红字体函数是结构体内的函数指针针。我们找到这个结构来查看内容,如下

typedef int32_t (*stmdev_write_ptr)(void *, uint8_t, const uint8_t *, uint16_t);
typedef int32_t (*stmdev_read_ptr)(void *, uint8_t, uint8_t *, uint16_t);

typedef struct
{
/** Component mandatory fields **/
stmdev_write_ptr write_reg;
stmdev_read_ptr read_reg;

/** Customizable optional pointer **/
void *handle;
} stmdev_ctx_t;

你看到了吗?因此,如果我们想实现这两个函数,我们只需要自己编写两个函数,然后让这两个指针指向我们在初始结构中编写的实现函数

现在先写两个实现函数:

static int32_t LSM6D3TR_write(void *handle, uint8_t reg, const uint8_t *bufp,uint16_t len)
{
HAL_I2C_Mem_Write(handle,LSM6DS3TR_C_I2C_ADD_L,reg,I2C_MEMADD_SIZE_8BIT,(uint8_t*)bufp,len,1000);//HAL库实现IIC写

/******如下是模拟IIC实现写***********************/

// LSM6D3S_Start();
// LSM6D3S_SendByte(LSM6DS3_I2C_ADDRESS);
// LSM6D3S_Wait_ACK();
// LSM6D3S_SendByte(reg);
// LSM6D3S_Wait_ACK();
// for(uint8_t i = 0;i < len; i )
// {
// LSM6D3S_SendByte(*(bufp i));
// }
// LSM6D3S_Wait_ACK();
// LSM6D3S_Stop();
return 0;
}

int32_t LSM6D3TR_read(void *handle, uint8_t reg, uint8_t *bufp,uint16_t len)
{
HAL_I2C_Mem_Read(handle,LSM6DS3TR_C_I2C_ADD_L, reg,I2C_MEMADD_SIZE_8BIT,(uint8_t *)bufp, len, 1000);//HAL库实现IIC读

/*******以下是模拟IIC实现读********/

// LSM6D3S_Start();
// LSM6D3S_SendByte(LSM6DS3_I2C_ADDRESS);
// LSM6D3S_Wait_ACK();
// LSM6D3S_SendByte(reg);
// LSM6D3S_Wait_ACK();
//
// LSM6D3S_Start();
// LSM6D3S_SendByte(LSM6DS3_I2C_ADDRESS 1);
// LSM6D3S_Wait_ACK();
//&bsp;  
//    for(uint8_t i=0;i //    {
//        *bufp=LSM6D3S_Read_Byte(1);
//        bufp++;
//    }
//    
//    *bufp = LSM6D3S_Read_Byte(0);    
//    
//    LSM6D3S_Stop();
    return 0;
}

实现函数编写完成,在看看是怎么将实现函数与官网函数连接在一起的,就用到结构体了,只需在结构体初始化时,指向实现函数就行了,如下:

void lsm6ds3tr_c_read_data_polling(void)
{
  /* Initialize mems driver interface */
  stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = LSM6D3TR_write;
  dev_ctx.read_reg = LSM6D3TR_read;

  dev_ctx.handle = &SENSOR_BUS;
  /* Init test platform */
//  platform_init();
  /* Wait sensor boot time */
//  platform_delay(BOOT_TIME);
    HAL_Delay(20);
  /* Check device ID */
  whoamI = 0;
  lsm6ds3tr_c_device_id_get(&dev_ctx, &whoamI);

  if ( whoamI != LSM6DS3TR_C_ID )
    while (1); /*manage here device not found */

  /* Restore default configuration */
  lsm6ds3tr_c_reset_set(&dev_ctx, PROPERTY_ENABLE);

......

.......

}

对于读取出来的数据,怎么装换成角度,自己查找资料,推荐网友分享

(9条消息) 三轴加速度计得到角度值原理_YW_1256的博客-CSDN博客_加速度计角度

工程代码下载如下:

(9条消息) LSM6DS3TR-C姿态传感器的使用(二)---HAL库硬件IIC和官方例程-单片机文档类资源-CSDN文库

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章