BMI270应用笔记1:BMI270结构体详解

struct bmi2_dev 是 BMI270(IMU 惯性测量单元)传感器驱动的核心设备配置结构体,相当于传感器的 "控制中枢"------ 它整合了传感器识别、硬件通信、功能配置、状态存储、算法补偿等全流程的关键参数,是驱动程序与硬件交互的核心数据载体,适配不同硬件平台(如 STM32、Linux)和芯片变体。

cpp 复制代码
/*!  @name Structure to define BMI2 sensor configurations */
struct bmi2_dev
{
    /*! Chip id of BMI2 */
    uint8_t chip_id;

    /*! The interface pointer is used to enable the user
     * to link their interface descriptors for reference during the
     * implementation of the read and write interfaces to the
     * hardware.
     */
    void *intf_ptr;

    /*! To store warnings */
    uint8_t info;

    /*! Type of Interface  */
    enum bmi2_intf intf;

    /*! To store interface pointer error */
    BMI2_INTF_RETURN_TYPE intf_rslt;

    /*! For switching from I2C to SPI */
    uint8_t dummy_byte;

    /*! Resolution for FOC */
    uint8_t resolution;

    /*! User set read/write length */
    uint16_t read_write_len;

    /*! Store load status value */
    uint8_t load_status;

    /*! Pointer to the configuration data buffer address */
    const uint8_t *config_file_ptr;

    /*! To define maximum page number */
    uint8_t page_max;

    /*! To define maximum number of input sensors/features */
    uint8_t input_sens;

    /*! To define maximum number of output sensors/features */
    uint8_t out_sens;

    /*! Indicate manual enable for auxiliary communication */
    uint8_t aux_man_en;

    /*! Defines manual read burst length for auxiliary communication */
    uint8_t aux_man_rd_burst_len;

    /*! Array of feature input configuration structure */
    const struct bmi2_feature_config *feat_config;

    /*! Array of feature output configuration structure */
    const struct bmi2_feature_config *feat_output;

    /*! Structure to maintain a copy of the re-mapped axis */
    struct bmi2_axes_remap remap;

    /*! Flag to hold enable status of sensors */
    uint64_t sens_en_stat;

    /*! Read function pointer */
    bmi2_read_fptr_t read;

    /*! Write function pointer */
    bmi2_write_fptr_t write;

    /*!  Delay function pointer */
    bmi2_delay_fptr_t delay_us;

    /*! To store the gyroscope cross sensitivity value */
    int16_t gyr_cross_sens_zx;

    /* gyro enable status, used as a flag in CRT enabling and aborting */
    uint8_t gyro_en : 1;

    /* advance power saving mode status, used as a flag in CRT enabling and aborting */
    uint8_t aps_status;

    /* used as a flag to enable variant specific features like crt */
    uint16_t variant_feature;

    /* To store hold the size of config file */
    uint16_t config_size;

    /*! Function pointer to get wakeup configurations */
    bmi2_wake_up_fptr_t get_wakeup_config;

    /*! Function pointer to set wakeup configurations */
    bmi2_wake_up_fptr_t set_wakeup_config;

    /*! Function pointer to get tap configurations */
    bmi2_tap_fptr_t get_tap_config;

    /*! Function pointer to set tap configurations */
    bmi2_tap_fptr_t set_tap_config;

    /*! Array of feature interrupts configuration structure */
    struct bmi2_map_int *map_int;

    /*! To define maximum number of interrupts */
    uint8_t sens_int_map;
};
成员名 类型 核心意义 & 作用 补充说明
chip_id uint8_t 芯片 ID(标识符)作用:驱动初始化时读取该值,验证是否正确识别到 BMI270(而非 BMI260 / 其他芯片),是硬件身份校验的关键。 不同 BMI2 系列芯片有固定 ID(如 BMI270 的 chip_id 为 0x24),读取失败则说明通信异常或硬件错误。
intf_ptr void * 接口通用指针作用:关联用户自定义的硬件接口描述符(如 I2C 的 HAL 句柄、SPI 的设备文件描述符、总线号 / 设备地址),实现驱动与底层硬件的解耦,提高可移植性。 例:STM32 中可指向I2C_HandleTypeDef,Linux 中可指向 SPI 设备的 fd,驱动读写时通过该指针访问具体硬件参数。
info uint8_t 警告 / 信息状态存储作用:记录非致命的运行警告(如参数配置不合法、通信轻微异常、配置未生效等),供用户排查问题(不影响传感器基本运行)。 区别于 "错误码",仅用于提示(如配置值超出硬件范围时标记为 0x01)。
intf enum bmi2_intf 通信接口类型作用:指定传感器与主控的通信方式(枚举值:BMI2_INTF_I2C/BMI2_INTF_SPI),驱动根据该值选择对应的通信协议逻辑。 核心区分 I2C/SPI,两种接口的读写时序、地址格式不同,需通过该参数适配。
intf_rslt BMI2_INTF_RETURN_TYPE 接口操作返回结果作用:存储最近一次读写操作的错误码(如成功、I2C 超时、SPI 通信失败、寄存器地址错误),是定位通信层问题的核心。 自定义类型(通常为 int8_t),0 表示成功,负数表示错误(如 - 1 = 超时,-2 = 地址错误)。
dummy_byte uint8_t 哑字节(占位 / 填充)作用:适配 SPI/I2C 接口切换的协议时序,SPI 读操作时需发送 1 个无用字节满足时序(I2C 无需使用)。 SPI 读流程:先发送寄存器地址 → 发送 dummy_byte → 接收数据,该参数用于填充这一步的无用字节。
resolution uint8_t FOC(力传感 / 数据分辨率)配置作用:设置加速度计 / 陀螺仪的测量分辨率(如 16 位 / 14 位),分辨率越高,数据精度越高,但可能降低输出速率。 FOC(Force-sensing Omni-directional Controller)是 BMI270 的力传感特性,该参数也服务于该功能的精度配置。
read_write_len uint16_t 单次读写长度作用:指定单次通信的最大 / 默认字节数(如读取加速度计 X/Y/Z 轴数据需 6 字节),避免单次读写过长导致超时,优化通信效率。 例:设置为 6 则单次读取 3 轴加速度计数据,设置为 8 则可同时读取加速度计 + 温度数据。
load_status uint8_t 配置文件加载状态作用:记录传感器固件 / 校准数据 / 功能配置文件的加载状态(0 = 未加载,1 = 加载中,2 = 加载完成,3 = 加载失败)。 配置文件是传感器正常工作的基础,该参数用于跟踪加载流程,失败时需重新加载。
config_file_ptr const uint8_t * 配置文件缓冲区指针作用:指向存储传感器配置数据(固件参数、校准系数、功能配置表)的内存地址,驱动从该地址读取数据并写入传感器寄存器完成初始化。 配置文件通常是芯片厂商提供的二进制文件,包含出厂校准、算法参数等关键数据。
page_max uint8_t 寄存器最大页号作用:BMI270 的寄存器按 "页" 划分(如页 0 = 基础配置,页 1 = 中断配置),该参数限制驱动访问的页范围,防止越界。 例:BMI270 最大页号为 0x05,访问 0x06 则触发错误。
input_sens uint8_t 输入型功能最大数量作用:限制 "原始数据类功能"(如加速度计、陀螺仪、温度原始数据)的配置上限,避免超出硬件能力。 输入功能:作为算法的原始输入,而非最终输出(如步数、姿态角)。
out_sens uint8_t 输出型功能最大数量作用:限制 "算法处理后功能"(如步数、敲击检测、姿态角)的配置上限,管理硬件资源分配。 输出功能:传感器内部算法处理后直接输出的结果,需占用硬件算力 / 内存。
aux_man_en uint8_t 辅助通信手动使能作用:使能 / 禁用 BMI270 的辅助接口(可连接磁力计等外部传感器),1 = 使能,0 = 禁用。 辅助接口用于扩展传感器功能(如 IMU + 磁力计实现 9 轴融合)。
aux_man_rd_burst_len uint8_t 辅助通信突发读取长度作用:配置通过辅助接口读取外部传感器数据时的单次 "突发读取" 字节数,优化通信效率(减少多次小批量读取)。 例:设置为 10 则单次读取外部磁力计 10 字节数据,而非分 10 次读 1 字节。
feat_config const struct bmi2_feature_config * 功能输入配置数组指针作用:指向各功能的基础配置结构体(如加速度计量程 ±2g/±8g、陀螺仪采样率 100Hz/1000Hz、低通滤波参数)。 每个数组元素对应一个功能(如加速度计),驱动通过该指针加载初始化配置。
feat_output const struct bmi2_feature_config * 功能输出配置数组指针作用:指向各功能的输出参数配置(如数据输出格式、中断触发条件、输出速率)。 例:配置步数检测功能的输出为 "每 10 步触发一次中断"。
remap struct bmi2_axes_remap 轴重映射结构体作用:解决传感器物理安装与逻辑轴不一致的问题(如倒装 / 侧装),重新映射 X/Y/Z 轴的方向 / 顺序,让输出数据与实际物理坐标系一致。 无需修改上层算法,仅通过该结构体适配硬件安装姿态。
sens_en_stat uint64_t 传感器使能状态标志(位域)作用:用 64 位的每 1bit 表示一个功能的使能状态(如 bit0 = 加速度计使能,bit1 = 陀螺仪使能,bit2 = 步数检测使能)。 64 位可支持大量功能(如 BMI270 的 20 + 种功能),快速查询 / 修改功能启用状态。
read bmi2_read_fptr_t 读函数指针作用:指向用户实现的 "从传感器寄存器读数据" 的函数,驱动不直接实现硬件读操作(适配不同平台)。 函数原型示例:int8_t (*bmi2_read_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint16_t len, void *intf_ptr)
write bmi2_write_fptr_t 写函数指针作用:指向用户实现的 "向传感器寄存器写数据" 的函数,原理同read 是驱动与硬件写操作的核心接口,适配 STM32/Linux 等不同平台的底层写逻辑。
delay_us bmi2_delay_fptr_t 微秒级延迟函数指针作用:指向用户实现的微秒延迟函数(如 STM32 的HAL_Delay_us、Linux 的usleep),用于寄存器写入后等待数据生效。 传感器部分寄存器写入后需几十微秒延迟,否则读取数据会错误。
gyr_cross_sens_zx int16_t 陀螺仪交叉灵敏度补偿值(Z 轴对 X 轴)作用:修正陀螺仪轴间干扰(如 X 轴旋转时 Z 轴检测到微小信号),提高陀螺仪测量精度。 出厂校准值,驱动读取后用于数据补偿,是硬件精度优化的关键。
gyro_en : 1 uint8_t(位域) 陀螺仪使能标志(仅 1 位)作用:专门用于 CRT(连续旋转跟踪)功能的使能 / 中止,位域设计节省内存。 1=CRT 功能中陀螺仪使能,0 = 禁用;仅占 1bit,比普通 uint8_t 节省 7bit 内存。
aps_status uint8_t 高级省电模式(APS)状态作用:存储 APS 模式当前状态(0 = 禁用,1 = 模式 1,2 = 模式 2),CRT 功能的运行策略会根据 APS 状态调整(如低功耗下降低采样率)。 APS 是 BMI270 的低功耗特性,平衡功耗与性能。
variant_feature uint16_t 变体特性使能标志作用:使能特定芯片变体的专属功能(如部分 BMI270 支持 CRT,基础版不支持),每 1bit 对应一个变体功能。 适配不同批次 / 版本的 BMI270,提高驱动兼容性。
config_size uint16_t 配置文件大小作用:记录config_file_ptr指向的配置文件总字节数,驱动加载时确认读取长度,避免越界或读取不完整。 配置文件通常为几百字节,该值是加载完整性校验的关键。
get_wakeup_config bmi2_wake_up_fptr_t 获取唤醒配置函数指针作用:指向读取 "唤醒功能配置" 的函数(如唤醒阈值、唤醒源、唤醒延迟)。 例:查询 "加速度计阈值超过 2g 时唤醒主控" 的当前配置。
set_wakeup_config bmi2_wake_up_fptr_t 设置唤醒配置函数指针作用:指向配置唤醒功能的函数,用于自定义唤醒条件(如设置唤醒阈值为 1.5g)。 BMI270 的低功耗核心功能,主控休眠时由传感器唤醒。
get_tap_config bmi2_tap_fptr_t 获取敲击配置函数指针作用:指向读取 "轻敲 / 双击检测" 配置的函数(如检测阈值、时间窗口、轴选择)。 例:查询双击检测的时间间隔是否为 500ms。
set_tap_config bmi2_tap_fptr_t 设置敲击配置函数指针作用:指向配置敲击检测的函数,自定义敲击识别规则。 智能穿戴设备常用功能(如双击亮屏)的核心配置接口。
map_int struct bmi2_map_int * 中断映射结构体指针作用:指向 "功能 - 中断引脚" 映射关系(如敲击检测映射到 INT1,步数计数映射到 INT2)。 管理传感器 2 个中断引脚的功能分配,适配不同应用场景。
sens_int_map uint8_t 最大中断映射数量作用:限制可映射到中断引脚的功能总数(如最多 8 个),防止超出硬件能力。 BMI270 硬件仅支持有限的中断映射,该参数避免配置越界。
相关推荐
童话名剑2 小时前
YOLO v5(学习笔记)
笔记·学习·yolo
程知农2 小时前
Android的配置笔记
android·笔记
求真求知的糖葫芦2 小时前
硅基 PA 学习笔记 (一)应用于毫米波5G的一种大功率宽带多初级基于DAT的Doherty功率放大器学习笔记(上)
笔记·学习·5g
小陈phd3 小时前
多模态大模型学习笔记(二十)—— 基于 Qwen的 LoRA 意图分类微调实战
笔记·学习·分类
CrystalShaw11 小时前
[AI codec]opus-1.6\DRED 编码侧 学习笔记
笔记·学习
sheeta199815 小时前
苍穹外卖Day05笔记
笔记
想搞艺术的程序员15 小时前
Java Survivor区学习笔记
java·笔记·学习·垃圾回收
不能隔夜的咖喱15 小时前
all-in-rag零散的笔记(自存/持续更新)
笔记