kevin知识库
首页 / Tools / /tools/g-sensor-silan/
整理中 创建 2026/06/06 更新 2026/06/06

BMA253数据手册更新传感器的基本信息

#tools

G-sensor(士兰微)

笔记内容

BMA253数据手册更新传感器的基本信息

// 定位到 sensor_info_t bmi260_acc_info 结构体sensor_info_t bma253_acc_info = {
.name = "acc_bma253", // 修改名称
.vendor = "Bosch", // 修改厂商
.version = 1,
.sensor_type = SENSOR_TYPE_ACCELEROMETER,
.maxrange = 2 * STANDARD_GRAVITY, // BMA253支持±2g, ±4g, ±8g, ±16g,此处以±2g为例
.resolution = 0.0096145f, // 分辨率,详见下方说明
.power = 0.13f, // BMA253在Normal Mode下的功耗为130uA
.mindelay_us = 5000, // 最小延迟,根据支持的最高采样率而定
// ... 其他参数可以暂时保持不变
}

分辨率计算:根据手册第19页表5,BMA253在±2g量程下的分辨率为 0.98mg/LSB

将其转换为 m/s2 单位:0.98 * 9.80665 / 1000 = 0.0096145f

sensor_driver_accelerometer_sc7a20.c 文件中,sc7a20_acc_hw_info_t 结构体里的 slave_addr 被设置为 0x18

图片附件 图片附件 在UMS9360这种CH平台上,I2C2总线连接到的是哪个控制器呢?

参考资料:根据《Sensor Hub常见问题分析与解决指南V1.0.pdf》第 8 页 “2.1 硬件架构” 章节所述:“平台参考设计中一般将I2C2总线和I2C5总线划给Sensor Hub使用,其中cm4_i3c0/ch_i3c0控制器会与I2C2总线建立连接…”。

结论:这说明,您硬件上的 I2C2 总线,对应的是CH核心的第一个I2C/I3C控制器,即 **ch_i3c0**

从手册确定 ch_i3c0 控制器对应的逻辑总线号

图片附件 结论:这份手册白纸黑字地告诉我们,对于 UMS9360 平台,驱动代码中的逻辑总线 i2c0 (也就是第一个控制器 ch_i3c0)对应的值是 **0x10**,而不再是 0。 -----------------错误结论

芯片ID (WHO_AM_I):

  • 您的驱动中通过读取寄存器 0x0F 来检查芯片ID,期望值为 0x11
  • 根据《SC7A20H 说明书》第 12 页的寄存器列表, WHO_AM_I 寄存器的地址确实是 0Fh,其缺省值(Default Value)为 0x11

图片附件 控制与初始化寄存器:

驱动在初始化时向 CTRL_REG4 (23h) 写入 0x98。根据手册第 16 页,这个值将传感器量程设置为

±4G (FS[1:0]=01) ,这与您在 sensor_info_t 结构中定义的 maxrange = 4 * STANDARD_GRAVITY 相符。

在使能传感器时,向 CTRL_REG1 (20h) 写入 0x77。根据手册第 15 页,这个值将传感器设置为 400Hz 输出率的全工作模式,并使能所有三轴 。

如何计算出 0x98 (写入 0x23 寄存器)

目标: 设置传感器的基本参数,如测量范围(g-range)。

根据您的驱动代码 acc_sc7a20_sensor_hw_init() 函数,0x98 被写入到 0x23 寄存器。

  • 步骤 1: 查找寄存器定义我们查阅《SC7A20H 说明书》第 16 页,找到 “12.7 控制寄存器4(23h)” 。其位定义如下:
  • 步骤 2: 根据功能需求确定每一位的值
    • **SIM**** (B0)**: SPI 接口模式选择,I2C通信时此位无效,保持默认 0 即可 。
    • **ST[1:0]**** (B1, B2)**: 自测试使能,正常工作时应禁用,所以设为 00
    • **DLPF[0]**** (B3)**: 数字低通滤波器控制位,驱动中设为 1
    • **FS[1:0]**** (B4, B5)**: 全量程选择。您的驱动 sensor_info_t 结构中 maxrange 设为4g。根据手册第 16 页的表格,±4G 对应的 FS1-FS0 值为 01
    • **BLE**** (B6)**: 数据大小端选择,0 代表低字节在前 (小端模式),这是通用的模式 。
    • **BDU**** (B7)**: 块数据更新。设为 1 可以保证在读取数据时,高低字节来自同一次采样,避免数据错乱,是推荐的设置 。
  • 步骤 3: 组合为二进制并转换为十六进制 将上面确定的值从 B7 到 B0 组合起来: BDUBLEFS1FS0DLPF[0]ST1ST0SIM10011000 组合成一个8位的二进制数就是 10011000
    • 1001 (二进制) = 9 (十六进制)
    • 1000 (二进制) = 8 (十六进制)
    • 所以,二进制 10011000 等于十六进制的 **0x98**

如何计算出 0x77 (写入 0x20 寄存器)

目标: 使能传感器,让它开始工作并上报数据。

根据您的驱动代码 acc_sc7a20_sensor_enable() 函数,0x77 被写入到 0x20 寄存器 (SC7A20_ACC_CTL_MODE)。

  • 步骤 1: 查找寄存器定义我们查阅《SC7A20H 说明书》第 14 页,找到 “12.4 控制寄存器1(20h)” 。其位定义如下: 导出到 Google 表格

  • 步骤 2: 根据功能需求确定每一位的值

    • **Xen**, **Yen**, **Zen** (B0, B1, B2): 我们需要使能所有三轴来获取完整的加速度数据,所以这三位都应设为 1
    • **LPen**** (B3)**: 我们需要传感器工作在正常模式,而不是低功耗模式,所以 LPen 应设为 0
    • **ODR[3:0]**** (B4-B7)**: 这里设置数据输出率 (Output Data Rate)。驱动中设置了 0111。根据手册第 15 页的 “数据输出率的配置” 表格 , 0111 对应 400Hz 的数据输出率。这是一个常见的工作频率。
  • 步骤 3: 组合为二进制并转换为十六进制 将上面确定的值从 B7 到 B0 组合起来: ODR[3:0]LPenZenYenXen01110111 组合成一个8位的二进制数就是 01110111

    • 0111 (二进制) = 7 (十六进制)
    • 0111 (二进制) = 7 (十六进制)
    • 所以,二进制 01110111 等于十六进制的 **0x77**。 图片附件 图片附件
  • 数据读取:

  • 您的驱动从 0xa8 地址开始连续读取6个字节的数据。

  • 根据手册第 9 页的I2C操作说明,当子地址最高位置1时,表示地址自增。因此,从 0x28 (X轴低位数据寄存器) 开始的连续读取操作,其通信地址应为 0x28 | 0x80 = 0xA8

  • 数据转换:

  • 传感器是12位数据输出 。您的代码中 (signed short)(data[1] << 8 | data[0]) >> 4 的处理方式,是正确地将16位数据转换为12位有符号整数。

  • 在±4g量程下,手册第2页标明灵敏度为 2 mg/digit。您的代码中将12位数据除以 512.0f 再乘以 9.8f,换算下来与规格书中的灵敏度是一致的。数据转换逻辑正确。 图片附件