aux_bmm150

Example of the component espressif/bmi270_sensor v0.4.0
# 通过 BMI270 AUX 接口控制 BMM150

[English](README.md)

本示例演示如何通过 BMI270 的 AUX 接口访问外部 BMM150 磁力计,完成设备唤醒、Chip ID 校验、工作模式配置、原始数据读取与休眠释放,涵盖以下四个公开接口:
- `bmi270_aux_set_config()`
- `bmi270_aux_get_config()`
- `bmi270_aux_read()`
- `bmi270_aux_write()`

## 硬件连接

通信链路为:`ESP32 -> BMI270 (主 I2C) -> BMM150 (AUX I2C)`

默认预设适配 **M5Stack AtomS3R** 开发板:

| 信号 / 参数 | AtomS3R 默认配置 | 说明 |
| --- | --- | --- |
| SDA / SCL | GPIO45 / GPIO0 | ESP32-S3 到 BMI270 主总线(400 kHz) |
| BMI270 主地址 | `0x68` | SDO 接地 |
| ASDA / ASCL | 板载互联 | BMI270 辅助 I2C 接口连接至 BMM150 |
| BMM150 AUX 地址 | `0x10` | 对应从机 AUX 地址 |
| ASDA 内部上拉 | 2 kΩ | 由 BMI270 内部上拉配置提供 |

若使用其他开发板,请将磁力计连接至 BMI270 的 **ASDA** 与 **ASCL** 引脚,确保共地与必要总线上拉,并在配置中修改对应的 GPIO 与从机地址。

## 构建与运行

1. 进入示例目录,设置目标芯片并构建:
   ```sh
   idf.py set-target esp32s3
   idf.py menuconfig
   idf.py build
   ```
2. 烧录并打开监视器:
   ```sh
   ESPBAUD=921600 idf.py -p PORT flash monitor
   ```

在 `menuconfig` 的 **BMI270 AUX BMM150 Example Configuration** 中可调整引脚、从机地址、轮询间隔及采样帧数。

## 执行流程

1. **总线与传感器初始化**:创建主 I2C 总线并初始化 BMI270。
2. **AUX 模式配置**:关闭省电模式,配置 ASDA 上拉,启用 AUX 8 字节手工模式并读回核对。
3. **使能 AUX 电源**:调用 `bmi2_sensor_enable()` 使能 AUX 通道。
4. **唤醒与识别 BMM150**:向 `0x4B` 寄存器写入唤醒指令,延时后读取 `0x40` 验证 Chip ID(固定为 `0x32`)。
5. **配置测量模式**:设置 XY/Z 重复采样次数,将工作模式配置为 10 Hz 正常模式。
6. **循环读取数据**:从 `0x42` 寄存器连续读取 8 字节数据帧,解析 X/Y/Z 轴原始数值与霍尔电阻值(RHALL)。
7. **安全释放**:达到预设帧数或检测到异常后,将 BMM150 置于休眠,禁用 AUX 并释放传感器与总线资源。

## 输出说明

启动成功后输出初始信息及 CSV 采样数据:

```text
AUX manual mode, address=0x10, 8-byte read burst
BMM150 chip ID=0x32
BMM150 normal mode at 10 Hz, XY repetitions=9, Z repetitions=15
timestamp_us,mag_x_raw,mag_y_raw,mag_z_raw,rhall,valid
```

| CSV 字段 | 含义 |
| --- | --- |
| `timestamp_us` | ESP32 读取该帧数据的主机微秒时间戳 |
| `mag_x_raw`、`mag_y_raw` | 13 位有符号原始 ADC 读数 |
| `mag_z_raw` | 15 位有符号原始 ADC 读数 |
| `rhall` | 14 位无符号霍尔电阻值(供补偿算法使用) |
| `valid` | 数据有效标志,读数溢出或 RHALL 为 0 时标为 0,正常为 1 |

> **提示**:本示例输出为 ADC 原始计数值。若需将读数转换为微特斯拉(µT)物理量或计算航向,需结合 BMM150 出厂校准参数进行温度与霍尔补偿(可配合官方 `espressif/bmm150` 组件使用)。

默认在输出 20 帧数据后自动退出并释放资源:
```text
Finished after 20 frames
Sensor and bus released
```
若需连续输出,可在 `menuconfig` 中将输出帧数(`CONFIG_AUX_BMM150_FRAME_COUNT`)设置为 `0`。

To create a project from this example, run:

idf.py create-project-from-example "espressif/bmi270_sensor=0.4.0:aux_bmm150"

or download archive (~9.02 KB)