BMA253数据手册更新传感器的基本信息
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,换算下来与规格书中的灵敏度是一致的。数据转换逻辑正确。 图片附件