整理中 创建 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`,换算下来与规格书中的灵敏度是一致的。**数据转换逻辑正确。**
图片附件