/*
* ________________________________________________________________________________________________________
* Copyright (c) 2017 InvenSense Inc. All rights reserved.
*
* This software, related documentation and any modifications thereto (collectively "Software") is subject
* to InvenSense and its licensors' intellectual property rights under U.S. and international copyright
* and other intellectual property rights laws.
*
* InvenSense and its licensors retain all intellectual property and proprietary rights in and to the Software
* and any use, reproduction, disclosure or distribution of the Software without an express license agreement
* from InvenSense is strictly prohibited.
*
* EXCEPT AS OTHERWISE PROVIDED IN A LICENSE AGREEMENT BETWEEN THE PARTIES, THE SOFTWARE IS
* PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* EXCEPT AS OTHERWISE PROVIDED IN A LICENSE AGREEMENT BETWEEN THE PARTIES, IN NO EVENT SHALL
* INVENSENSE BE LIABLE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
* DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THE SOFTWARE.
* ________________________________________________________________________________________________________
*/
#include "inv_imu_driver_advanced.h"
#include "inv_imu_defs.h"
/*************Betterlife ic debug***********/
#undef LOG_TAG_CONST
#define LOG_TAG "[ICM45686]"
#define LOG_ERROR_ENABLE
#define LOG_INFO_ENABLE
#include "debug.h"
/*
/* Static functions */
static int configure_serial_interface(inv_imu_device_t *s);
static int init_fifo_compression(inv_imu_device_t *s);
#if INV_IMU_FSYNC_SUPPORTED
static int init_fsync_tag(inv_imu_device_t *s);
#endif
/* Fail build if `condition` is true */
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2 * !!(condition)]))
/**
* @brief 初始化高级IMU设备
*
* 此函数对inv_imu_device_t结构体进行初始化,确保设备正常工作。主要包括:
* - 检查高级变量存储空间足够。
* - 必要的回调函数已赋值。
* - 设备供电正常。
* - 根据串行接口配置IMU。
* - 读取并验证设备标识符。
* - 对设备进行复位操作。
*
* @param s 指向inv_imu_device_t结构体的指针,用于存储IMU设备的状态和配置。
* @return int 返回初始化状态,INV_IMU_OK表示成功,其他值表示初始化过程中的错误。
*/
int inv_imu_adv_init(inv_imu_device_t *s)
{
// 初始化状态,假设没有错误
int status = INV_IMU_OK;
// 用于读取设备标识符
uint8_t whoami;
log_info("inv_imu_adv_init in\n");
// 确保高级变量空间足够大,否则编译时产生错误
BUILD_BUG_ON(sizeof(s->adv_var) < sizeof(inv_imu_adv_var_t));
// 确保必要的回调函数已赋值,否则返回错误
if (s->transport.read_reg == NULL || s->transport.write_reg == NULL ||
s->transport.sleep_us == NULL)
return INV_IMU_ERROR;
log_info("inv_imu_adv_init inv_imu_sleep_us in\n");
// 等待3毫秒,确保设备供电正常
inv_imu_sleep_us(s, 3000);
log_info("inv_imu_adv_init configure_serial_interface in\n");
// 根据串行接口配置IMU设备
status |= configure_serial_interface(s);
if (status)
return status;
log_info("inv_imu_adv_init inv_imu_get_who_am_i in\n");
while(whoami!=0xe9)
{
// 读取并验证设备标识符
status |= inv_imu_get_who_am_i(s, &whoami);
}
log_info("inv_imu_adv_init whoami=0xe9\n");
// 对设备进行复位操作
status |= inv_imu_adv_device_reset(s);
// 返回初始化状态
return status;
}
// 该函数 inv_imu_adv_device_reset 主要功能如下:
// 执行软复位操作。
// 获取端序(endianness)信息。
// 初始化FIFO配置:
// 禁用FIFO及其压缩功能。
// 将FIFO帧大小初始化为0。
// 初始化FIFO压缩相关变量。
// (可选)支持FSYNC时,初始化FSYNC标签变量。
// 返回执行状态。
int inv_imu_adv_device_reset(inv_imu_device_t *s)
{
int status = INV_IMU_OK;
inv_imu_adv_var_t *e = (inv_imu_adv_var_t *)s->adv_var;
status |= inv_imu_soft_reset(s);
/* Read endianness for further processing */
status |= inv_imu_get_endianness(s); /* Set `endianness_data` variable */
/* Set default FIFO configuration */
e->fifo_is_used = INV_IMU_DISABLE; /* FIFO disabled by default */
e->fifo_comp_en = INV_IMU_DISABLE; /* FIFO compression disabled by default */
/* From driver layer */
s->fifo_frame_size = 0; /* Init at 0 by default */
/* Initialize FIFO compression variables */
status |= init_fifo_compression(s);
#if INV_IMU_FSYNC_SUPPORTED
/* Initialize FSYNC tag variables */
status |= init_fsync_tag(s);
#endif
return status;
}
/**
* @brief 使能加速度计低功耗模式
*
* 该函数通过设置加速度计的工作模式为低功耗模式来达到省电的目的。
*
* @param s 指向inv_imu_device_t类型的指针,表示惯性测量单元设备
* @return int 返回设置加速度计模式的结果
* 0表示成功,非0表示失败
*/
int inv_imu_adv_enable_accel_lp(inv_imu_device_t *s)
{
// 调用inv_imu_set_accel_mode函数,将加速度计模式设置为低功耗模式
return inv_imu_set_accel_mode(s, PWR_MGMT0_ACCEL_MODE_LP);
}
/**
* @brief 使能加速度计低噪声模式
*
* 该函数通过设置加速度计的模式为低噪声模式来提高其数据精度。在低噪声模式下,
* 加速度计的数据更新率可能会降低,但是数据噪声会减少,适合对数据精度要求较高的应用场景。
*
* @param s 指向惯性测量单元设备结构体的指针
*
* @return 返回设置加速度计模式的结果
* 应用程序可以通过检查返回值来确定设置操作是否成功。
*/
int inv_imu_adv_enable_accel_ln(inv_imu_device_t *s)
{
// 将加速度计模式设置为低噪声模式
return inv_imu_set_accel_mode(s, PWR_MGMT0_ACCEL_MODE_LN);
}
// 该函数用于禁用IMU设备的加速度计。主要步骤如下:
// 读取电源管理寄存器PWR_MGMT0。
// 检查陀螺仪是否已关闭且使用了FIFO缓冲区,若是,则设置clear_fifo标志。
// 关闭加速度计。
// 若clear_fifo被设置,则重置FIFO缓冲区以清除所有数据。返回操作状态。
int inv_imu_adv_disable_accel(inv_imu_device_t *s)
{
int status = INV_IMU_OK;
inv_imu_adv_var_t *e = (inv_imu_adv_var_t *)s->adv_var;
pwr_mgmt0_t pwr_mgmt0;
int clear_fifo = 0;
status |= inv_imu_read_reg(s, PWR_MGMT0, 1, (uint8_t *)&pwr_mgmt0);
/*
* Check if accel is the last one enabled.
* If it is, set `clear_fifo` flag to reset fifo after accel is actually turned off.
*/
if ((pwr_mgmt0.gyro_mode == PWR_MGMT0_GYRO_MODE_OFF) && e->fifo_is_used) {
clear_fifo = 1;
}
/* Turn off accel */
status |= inv_imu_set_accel_mode(s, PWR_MGMT0_ACCEL_MODE_OFF);
if (clear_fifo) {
/* Reset FIFO to guarrantee no data is left after turning off all sensors. */
status |= inv_imu_adv_reset_fifo(s);
}
return status;
}
/**
* @brief 使能陀螺仪低噪声模式
*
* 该函数通过设置陀螺仪的工作模式为低噪声模式来提升测量精度。这对于需要高精度测量的应用场景非常有用。
*
* @param s 传感器设备指针,指向inv_imu_device_t类型的设备结构体
* @return 错误代码,表示设置陀螺仪模式的操
oHuanYing123
- 粉丝: 1
- 资源: 13
最新资源
- 【创新无忧】基于鹈鹕优化算法POA优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化极限学习机KELM实现故障诊断附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于天鹰优化算法AO优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化极限学习机KELM实现故障诊断附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于秃鹰优化算法BES优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于雾凇优化算法RIME优化广义神经网络GRNN实现光伏预测附matlab代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈