ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RT-Thread 集成 Bosch BMG160 三轴陀螺仪驱动:Bosch Sensortec Sensor API 移植与实战指南

RT-Thread 集成 Bosch BMG160 三轴陀螺仪驱动:Bosch Sensortec Sensor API 移植与实战指南 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载导读本文以 RT-Thread 仓库内 Nuvoton BSP 中随附的 BMG160 驱动包 README 为核心骨架完整讲解 Bosch Sensortec 官方 BMG160 三轴陀螺仪 Sensor API 驱动的文件构成、I2C/SPI 总线适配方式、初始化与电源管理、量程与带宽配置以及陀螺仪数据读取流程并结合 sensor_bmx055.c 与 bmg160.c 源码逐层印证底层实现。读完本文你将能够独立把 BMG160或 BMI055 / BMX055 中陀螺仪部分驱动移植进自己的 RT-Thread 工程完成从总线适配到陀螺数据输出的全流程。一、驱动包概览内容、适用传感器与版本根据 BMG160 驱动 README 的说明该包本质上是 Bosch Sensortec 官方发布的MEMS 陀螺仪 Sensor API 驱动而非特定于 RT-Thread 的封装。包内包含三个源文件文件作用版本bmg160.h寄存器地址定义、常量定义、数据类型定义与传感器驱动 API 声明V2.0.4bmg160.c传感器驱动 API 的全部实现V2.0.4bmg160_support.c用户指导示例总线读写模板、初始化、数据读取样例非必须集成V1.0.5驱动包支持以下传感器型号BMG160独立三轴陀螺仪BMI055由 bma2x2加速度计 bmg160陀螺仪组合而成的六轴传感器BMX055由 bma2x2 bmg160 bmm050磁力计组合而成的九轴传感器。在本仓库中该驱动正是作为 BMX055 九轴传感器包的一部分被引入。从 BMX055/SConscript 可以看到当配置宏NU_PKG_USING_BMX055开启时构建系统会把三个 Bosch 驱动源文件bma2x2.c、bmg160.c、bmm050.c连同传感器抽象层 sensor_bmx055.c 一起编译进工程并将三个驱动目录加入头文件搜索路径。版权声明本驱动代码版权归 Bosch Sensortec GmbH2010–2015所有详见 bmg160.c 与 bmg160.h 头部的许可声明。二、三个驱动文件的分工与集成原则2.1 bmg160.h —— 寄存器与类型定义的唯一权威来源bmg160.h承担三类职责1数据类型定义。驱动为兼容 Linux 内核态与用户态两种编译环境在__KERNEL__宏分支下引入linux/types.h否则根据__STDC_VERSION__C11/C99/其他自动选用stdint.h或手工 typedef 定义u8/s8/u16/s16/u32/s32/u64/s64等定长类型默认按 32 位机配置MACHINE_32_BIT。在 RT-Thread 这类用户态嵌入式编译环境中会自动走stdint.h分支无需额外处理。2总线函数指针与调用宏。这是整个驱动可移植性的关键。驱动通过一组宏把 API 内部的总线操作重定向到你的通信函数例如#define BMG160_BUS_WRITE_FUNC(device_addr, register_addr, register_data, wr_len) \ bus_write(device_addr, register_addr, register_data, wr_len) #define BMG160_BUS_READ_FUNC(device_addr, register_addr, register_data, rd_len) \ bus_read(device_addr, register_addr, register_data, rd_len) #define BMG160_BURST_READ_FUNC(device_addr, register_addr, register_data, rd_len) \ burst_read(device_addr, register_addr, register_data, rd_len) #define BMG160_DELAY_FUNC(delay_in_msec) delay_func(delay_in_msec)这些宏约定总线函数的统一参数顺序为(设备地址, 寄存器地址, 数据指针, 长度)返回类型为s8SPI 读操作要求寄存器地址最高位MSB置 1源码注释明确要求对 BMG160 地址做“MSB1”处理。3寄存器地址、位域与常量定义。驱动把全部寄存器地址、每个位域的POS/LEN/MSK/REG四元组以及功能常量集中定义在头文件中典型的寄存器地址包括寄存器地址用途BMG160_CHIP_ID_ADDR0x00芯片 ID复位后读回BMG160_RATE_X_LSB_ADDR~RATE_Z_MSB_ADDR0x02 ~ 0x07X/Y/Z 轴角速率数据各 16 位LSBMSBBMG160_TEMP_ADDR0x08温度数据BMG160_INTR_STAT0~3_ADDR0x09 ~ 0x0C中断状态BMG160_FIFO_STAT_ADDR0x0EFIFO 状态BMG160_RANGE_ADDR0x0F量程配置BMG160_BW_ADDR0x10带宽配置BMG160_MODE_LPM1_ADDR/LPM2_ADDR0x11 / 0x12电源模式BMG160_HIGH_BW_ADDR0x13高带宽/影子寄存器BMG160_BGW_SOFT_RST_ADDR0x14软复位BMG160_INTR_ENABLE0/1_ADDR0x15 / 0x16中断使能BMG160_INTR_MAP_ZERO/ONE/TWO_ADDR0x17 ~ 0x19中断映射BMG160_INTR_ZERO/ONE/TWO_ADDR0x1A ~ 0x1C中断配置BMG160_RST_LATCH_ADDR0x21复位与锁存BMG160_HIGHRATE_THRES/DURN_*0x22 ~ 0x27高角速率中断阈值/持续时间BMG160_SOC_ADDR0x31慢速偏移配置BMG160_A_FOC_ADDR0x32快速偏移配置BMG160_TRIM_NVM_CTRL_ADDR0x33NVM 控制BMG160_BGW_SPI3_WDT_ADDR0x34SPI3 模式 / I2C 看门狗BMG160_OFFSET_OFC1~OFC4_ADDR0x36 ~ 0x39偏移量校准BMG160_SELFTEST_ADDR0x3C自测试BMG160_FIFO_CGF1/0_ADDR、FIFO_DATA_ADDR0x3D / 0x3E / 0x3FFIFO 配置与数据对位域的操作统一通过头文件中的位切片宏完成#define BMG160_GET_BITSLICE(regvar, bitname) ((regvar bitname##__MSK) bitname##__POS) #define BMG160_SET_BITSLICE(regvar, bitname, val) \ ((regvar ~bitname##__MSK) | ((val bitname##__POS) bitname##__MSK))bmg160.c内所有 get/set API 都是在这套“寄存器地址 位域四元组 总线宏”基础上实现的。2.2 bmg160.c —— 70 余个 API 的完整实现bmg160.c共约 7000 行实现了从初始化、数据读取、量程/带宽配置、电源管理到中断、FIFO、NVM、自测试、偏移校准的全套 API。除个别私有函数外公开 API 均以BMG160_RETURN_FUNCTION_TYPE即s8为返回类型按“0 表示成功、-1 表示失败”的约定返回总线通信结果。全部函数通过全局指针p_bmg160访问配置结构体。入口函数bmg160_init()bmg160.c完成两件事将传入的struct bmg160_t *保存到全局p_bmg160通过BMG160_BUS_READ_FUNC读取 0x00 寄存器的芯片 ID并存入p_bmg160-chip_id作为总线通信是否正常的首个验证。2.3 bmg160_support.c —— 官方使用指南该文件不参与最终构建仅作为移植模板包含三部分内容总线读写样例BMG160_I2C_bus_read/write、BMG160_SPI_bus_read/write四个函数骨架内部注释标明了需要替换为真实 I2C/SPI 通信调用的位置如I2C_WRITE_STRING(DEV_ADDR, ARRAY, CNT1)返回值和成功/失败约定成功 0、失败 -1由使用者自行决定延时函数BMG160_delay_msek()需要填入平台延时实现数据读取模板bmg160_data_readout_template()演示完整的“初始化 → 配置 → 读取 → 休眠”流程。三、工程集成最小步骤与宏开关按 README 的集成说明只需将bmg160.h与bmg160.c加入工程即可bmg160_support.c仅作参考。在本仓库的 Nuvoton BSP 中这一步由 SConscript 自动完成只要在rtconfig.h中开启NU_PKG_USING_BMX055bmg160.c即被编译同时头文件搜索路径自动加入libraries/BMG160_driver/。调用驱动前的移植工作量集中在三处对应 README 中 Add your code 的要求实现总线读写函数向bmg160.bus_write/bmg160.bus_read填入符合s8 f(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)签名的函数实现延时函数填入bmg160.delay_msec确认 I2C 地址按硬件接线在 bmg160.h 中选择BMG160_I2C_ADDR1 (0x68)或BMG160_I2C_ADDR2 (0x69)SPI 模式无需设备地址。四、总线适配I2C 与 SPI 的接入方式4.1 官方支持的双接口README 明确本驱动同时支持 SPI 和 I2C。结构体struct bmg160_t通过函数指针解耦总线差异其成员包括BMG160_WR_FUNC_PTR写指针、BMG160_RD_FUNC_PTR读指针、BMG160_BRD_FUNC_PTR突发读指针、delay_msec延时指针、dev_addr设备地址、chip_id芯片 ID。bmg160_support.c中的I2C_routine()/SPI_routine()展示了标准绑定方式s8 I2C_routine(void) { bmg160.bus_write BMG160_I2C_bus_write; bmg160.bus_read BMG160_I2C_bus_read; bmg160.delay_msec BMG160_delay_msek; bmg160.dev_addr BMG160_I2C_ADDR1; /* 0x68 */ return BMG160_INIT_VALUE; }SPI 模式除无需dev_addr外读写时的寄存器地址最高位约定为读操作地址 MSB 置 1写操作地址 MSB 清 0见bmg160_support.c中BMG160_SPI_bus_read的reg_addr | MASK_DATA2处理。4.2 RT-Thread 实际实现以 rt_i2c_transfer 为底层仓库内 sensor_bmx055.c 给出了基于 RT-Thread I2C 框架的真实接入范例。bmx055_i2c_read_reg构造两个struct rt_i2c_msg先写寄存器地址再读数据调用rt_i2c_transfer(i2c_bus_dev, msgs, 2)完成一次完整事务写函数则使用RT_I2C_NO_START标志在已寻址的从机上连续写数据。这三个 Bosch 驱动共用同一对读写函数通过dev_addr区分三个从机地址。五、初始化流程与电源模式管理5.1 标准初始化序列结合bmg160_support.c的bmg160_data_readout_template()与sensor_bmx055.c的bmx055_init_gyro()推荐的初始化顺序为绑定总线读写与延时函数、设置设备地址调用bmg160_init(bmg160)读取芯片 ID调用bmg160_set_power_mode(BMG160_MODE_NORMAL)切入正常模式按需调用bmg160_set_bw()设置带宽、bmg160_set_range_reg()设置量程。com_rslt bmg160_init(gyro); com_rslt bmg160_set_power_mode(BMG160_MODE_NORMAL); com_rslt bmg160_set_bw(C_BMG160_BW_230HZ_U8X); com_rslt bmg160_get_range_reg(g_u8Range_gyro);注意时序约束源码注释明确NORMAL 模式下读写操作至少需要 2µs 空闲时间FASTPOWERUP / DEEPSUSPEND 模式则至少需要 450µs 延时否则读写可能失败。5.2 电源模式定义bmg160.h 定义的电源模式常量如下宏值说明BMG160_MODE_NORMAL0正常模式数据采集与读写BMG160_MODE_DEEPSUSPEND1深度休眠功耗最低仅保留接口选择BMG160_MODE_SUSPEND2挂起模式BMG160_MODE_FASTPOWERUP3快速上电模式BMG160_MODE_ADVANCEDPOWERSAVING4高级省电模式底层实现见 bmg160.c 的bmg160_get_power_mode函数读取 0x11LPM1bit5、bit7与 0x12LPM2bit6、bit7两个寄存器通过位组合反推出当前模式。例如ADVANCEDPOWERSAVING对应 LPM2 bit61DEEPSUSPEND对应 LPM1 组合为0x01或0x05FASTPOWERUP对应 LPM1 组合0x04且 LPM2 bit71。bmg160_set_power_mode()则对 0x11 / 0x12 寄存器的相关位域执行写操作完成切换。在 RT-Thread sensor 框架中陀螺仪的电源控制映射为RT_SENSOR_MODE_POWER_DOWN → BMG160_MODE_DEEPSUSPEND、RT_SENSOR_MODE_POWER_MEDIUM → BMG160_MODE_NORMAL见 sensor_bmx055.c。5.3 软复位与自测试驱动还提供bmg160_set_soft_rst()写 0x14 寄存器和bmg160_selftest(result)0x3C 寄存器含 BIST 触发与 RATEOK/BISTRDY/BISTFAIL 状态位等配套 API可在初始化失败或产线测试时使用。六、量程与带宽配置6.1 量程Rangebmg160.h 定义的量程常量与 0x0F 寄存器低 3 位的编码如下宏寄存器值量程BMG160_RANGE_20000x00±2000 dpsBMG160_RANGE_10000x01±1000 dpsBMG160_RANGE_5000x02±500 dpsBMG160_RANGE_2500x03±250 dpsBMG160_RANGE_1250x04±125 dps对应 API 为bmg160_set_range_reg(u8)/bmg160_get_range_reg(u8 *)。6.2 带宽Bandwidth0x10 寄存器低 3 位定义带宽对应常量及 API 注释中的映射宏寄存器值带宽BMG160_BW_500_HZ0x00500 HzBMG160_BW_230_HZ0x01230 HzBMG160_BW_116_HZ0x02116 HzBMG160_BW_47_HZ0x0347 HzBMG160_BW_23_HZ0x0423 HzBMG160_BW_12_HZ0x0512 HzBMG160_BW_64_HZ0x0664 HzBMG160_BW_32_HZ0x0732 Hz驱动同时提供C_BMG160_BW_*_U8X一套等价常量如C_BMG160_BW_230HZ_U8X 1bmg160_set_bw()会通过BMG160_SET_BITSLICE写 0x10 寄存器另有bmg160_set_high_bw()0x13 bit7用于开启高带宽模式。在 RT-Thread 的bmx055_set_odr()中采样率Hz与带宽常量按映射表匹配例如请求 230 Hz 对应BMG160_BW_230_HZ请求 12 Hz 对应BMG160_BW_12_HZ见 sensor_bmx055.c 的 gyro_odr 表。七、陀螺仪数据读取与单位换算7.1 数据读取 API驱动提供四档数据读取接口见 bmg160.cbmg160_get_data_X(s16 *)/get_data_Y/get_data_Z读取单轴 16 位角速率原始值寄存器 0x02~0x07bmg160_get_data_XYZ(struct bmg160_data_t *)一次读取三轴数据bmg160_get_data_XYZI(struct bmg160_data_t *)读取三轴数据并附带中断状态标志bmg160_get_temp(s8 *)读取 0x08 温度寄存器。struct bmg160_data_t包含datax/datay/datazs16 原始值与中断标志位字段。7.2 原始值到物理量的换算原始 16 位值本身是带符号的 LSB 计数需按量程换算为物理角速率。RT-Thread 集成中由get_mdps_value()完成sensor_bmx055.c各量程对应分辨率如下量程LSB 分辨率±125 dps3.8 mdps/LSB±250 dps7.6 mdps/LSB±500 dps15.3 mdps/LSB±1000 dps30.5 mdps/LSB±2000 dps61 mdps/LSB换算公式即物理角速率(mdps) 原始值 × 对应量程分辨率随后数据以 mdps 为单位通过 RT-Thread sensor 框架的data-data.gyro.x/y/z上报。7.3 典型读取循环struct bmg160_data_t gyro_xyzi; /* 读取三轴角速率及中断状态 */ com_rslt bmg160_get_data_XYZI(gyro_xyzi); /* 依据当前量程换算为 mdps */ int32_t x_mdps get_mdps_value(gyro_xyzi.datax); int32_t y_mdps get_mdps_value(gyro_xyzi.datay); int32_t z_mdps get_mdps_value(gyro_xyzi.dataz);八、与 RT-Thread Sensor 框架的对接方式在 Nuvoton BSP 中bmg160驱动通过 sensor_bmx055.c 封装为 RT-Thread 标准 sensor 设备注册名为bmx055_gyrort_hw_bmx055_init()通过rt_device_find(intf-dev_name)查找 I2C 总线设备然后依次初始化并注册磁力计、加速度计、陀螺仪三个 sensor 设备陀螺仪设备描述类型RT_SENSOR_TYPE_GYRO、厂商RT_SENSOR_VENDOR_BOSCH、单位RT_SENSOR_UNIT_MDPS、量程 125~2000、最小采集间隔acquire_min 100ms见 sensor_bmx055.cbmx055_fetch_data()在每次采集时调用bmg160_get_data_XYZI()并完成单位换算bmx055_control()处理RT_SENSOR_CTRL_GET_ID / SET_RANGE / SET_POWER_MODE / SET_ODR四个控制命令分别映射到bmg160_get_range_reg / bmg160_set_range_reg / bmg160_set_power_mode / bmg160_set_bw。因此如果只想单独使用 BMG160可以仿照bmx055_init_gyro()的模式自己实现一对基于rt_i2c_transfer的读写函数绑定到struct bmg160_t再直接调用bmg160_init及各 get/set API无需引入整个 BMX055 包。九、移植检查清单完成移植后建议依次核对bmg160_init()返回 0且bmg160.chip_id与 BMG160 数据手册的芯片 ID 一致证明总线通路正常读写操作前按电源模式满足 2µsNORMAL或 450µsFASTPOWERUP/DEEPSUSPEND的时序要求SPI 模式下寄存器地址 MSB 读写方向位设置正确I2C 地址 0x68 / 0x69 与硬件接线SDO 引脚电平一致量程与带宽配置后用get_*接口回读验证写操作生效陀螺仪静止时的三轴输出应在零点附近波动可配合偏移校准类 API如bmg160_set_offset()/ NVM 相关接口使用。版权说明本文涉及的 BMG160 驱动源码版权归 Bosch Sensortec GmbH2010–2015所有随 RT-Thread 开源仓库以 BSD 许可条款分发详见驱动文件头部许可声明。仓库中 Nuvoton 侧的 sensor 封装部分版权归 Nuvoton Technology Corp.以 Apache-2.0 许可发布见 sensor_bmx055.c 头部声明。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread Nuvoton 包中的 BMA2x2 加速度计驱动Bosch BMA2x2 传感器驱动包的集成与移植解析RT Thread Nuvoton 包中的 BMA2x2 加速度计驱动Bosch BMA2x2 传感器驱动包的集成与移植解析 本文以 RT Thread 仓库操作系统嵌入式物联网嵌入式OSRTOSTasmota 中的 BME680/BME688 传感器驱动Bosch BME68x Sensor API 解析与实战Tasmota 中的 BME680/BME688 传感器驱动Bosch BME68x Sensor API 解析与实战 本文以 Tasmota 仓库中 lib嵌入式物联网固件智能家居RT-Thread 集成 Bosch BMM050/BMM150 磁力计传感器驱动指南基于 Nuvoton BSP 的 BMM050_driver 源码解析RT Thread 集成 Bosch BMM050/BMM150 磁力计传感器驱动指南基于 Nuvoton BSP 的 BMM050_driver 源码解析操作系统嵌入式物联网嵌入式OSRTOS上一篇告别GIF加载烦恼android-gif-drawable多源加载全方案对比下一篇如何使用tealdeerRust打造的终极tldr客户端让命令行学习更简单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表