本文记录一次 ESP-SensairShuttle 开发板的完整上手过程,包括 ESP-IDF 环境配置、VS Code 烧录、串口监视、BMI270/BMM350 Shuttle Board 的 I2C/SPI 排查

1. 硬件简介

ESP-SensairShuttle 是乐鑫基于 ESP32-C5-WROOM-1-N16R8 推出的多模态感知开发板,适合做运动感知、语音交互、物联网监测、AI 玩具、智能家居等应用。

官方文档入口:

https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp-sensairshuttle/user_guide_v1.0.html

官方主板正面图:

在这里插入图片描述

官方功能框图:

在这里插入图片描述

我手上的实物如下,当前接了麦克风、扬声器,并安装了 BMI270 & BMM350 Shuttle Board:

在这里插入图片描述

板上主要资源:

模块 作用
ESP32-C5-WROOM-1-N16R8 主控,支持 2.4/5 GHz Wi-Fi 6、BLE、802.15.4
MIC 接口 外接麦克风
SPK 接口 外接扬声器
Shuttle Board 接口 可接 Bosch 传感器子板
BMI270 六轴 IMU,加速度计 + 陀螺仪
BMM350 三轴磁力计
LCD 接口 可接 1.83 英寸 ST7789P3 屏幕

官方 BMI270 & BMM350 子板图:

在这里插入图片描述

2. 开发环境

使用环境:

系统:Windows
IDE:VS Code
插件:Espressif IDF
ESP-IDF:v5.5.4
目标芯片:esp32c5
串口:COM3
烧录方式:UART

VS Code 工程状态:

在这里插入图片描述

2.1 ESP-IDF 安装

一开始 VS Code 插件提示找不到 EIM:

ESP-IDF Install Manager: 未找到 EIM 可执行文件

GitHub 下载不稳定,因此改用乐鑫官方离线安装包:

https://dl.espressif.com/dl/esp-idf/

最终安装:

ESP-IDF Tools Offline 5.5.4
安装路径:D:\Espressif

2.2 工程目录

工程目录结构:

esp-sensairshuttle-esp32-c5/
  CMakeLists.txt
  main/
    CMakeLists.txt
    main.c
  components/
    bmi270/
  sdkconfig
  .vscode/
    settings.json

关键 VS Code 配置:

{
  "idf.adapterTargetName": "esp32c5",
  "idf.portWin": "COM3",
  "idf.flashBaudRate": "115200",
  "idf.monitorBaudRate": "115200",
  "idf.flashType": "UART",
  "idf.currentSetup": "D:/Espressif/frameworks/esp-idf-v5.5.4/"
}

3. 烧录与串口监视

常用流程:

ESP-IDF: Set Espressif Device Target
选择 esp32c5

ESP-IDF: Select Port to Use
选择 COM3

ESP-IDF: Build, Flash and Monitor

烧录时如果卡在:

Connecting...

需要按住板子上的 BOOT 键,看到:

Writing at ...

之后松开 BOOT。

注意:

Flash 烧录时:可能需要按 BOOT
Monitor 查看日志时:不要按 BOOT

如果 Monitor 里看到:

waiting for download

说明板子还在下载模式,松开 BOOT 后重新上电或按 RESET。

成功烧录日志示例:

Chip is ESP32-C5 (revision v1.0)
Features: Wi-Fi 6 (dual-band), BT 5 (LE), IEEE802.15.4
Wrote 196608 bytes at 0x00010000
Hash of data verified.
Leaving...
Hard resetting via RTS pin...

4. 最小测试程序

最开始使用简单日志程序确认烧录和运行正常:

#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

static const char *TAG = "sensairshuttle";

void app_main(void)
{
    ESP_LOGI(TAG, "ESP-SensairShuttle ESP32-C5 started");

    while (1) {
        ESP_LOGI(TAG, "running");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

运行成功:

I sensairshuttle: ESP-SensairShuttle ESP32-C5 started
I sensairshuttle: running

5. BMI270/BMM350 接口分析

官方 Shuttle Board 接口原理图:

在这里插入图片描述

根据官方原理图,主板到 Shuttle Board 的相关连接包括:

BM_SCK/SCL -> GPIO3
BM_SDI/SDA -> GPIO2
BM_SDO     -> GPIO9
BM_CS      -> GPIO10
BM_G1      -> GPIO28
BM_G2      -> GPIO0

也就是说,这个接口同时兼容 I2C/SPI:

I2C:
SCL = GPIO3
SDA = GPIO2

SPI:
SCK  = GPIO3
MOSI = GPIO2
MISO = GPIO9
CS   = GPIO10

6. I2C 扫描尝试

最初尝试用 I2C 扫描 BMI270/BMM350:

BMI270 常见地址:0x68 / 0x69
BMM350 常见地址:0x14

但扫描结果始终是:

i2c.master: probe device timeout
No I2C devices found

随后尝试:

SDA/SCL 正反两种组合
SDO/G1/G2 多种电平组合
只探测 0x14、0x68、0x69

仍然没有设备响应。读取 I2C 空闲电平:

SDA=1
SCL=1

说明总线没有被短路拉低,但设备没有 ACK。最终判断:这块 BMI270&BMM350 子板在当前硬件连接下更适合按 SPI 方式访问。

7. SPI 读取 BMI270 CHIP_ID

根据原理图改用 SPI:

SCK  = GPIO3
MOSI = GPIO2
MISO = GPIO9
CS   = GPIO10

BMI270 的 CHIP_ID 寄存器:

地址:0x00
正常值:0x24

注意:BMI270 SPI 读取有 dummy byte。读取寄存器时需要发送 3 字节,取第 3 字节作为真实数据。

static esp_err_t bmi270_read_reg(uint8_t reg, uint8_t *value)
{
    uint8_t tx[3] = {reg | 0x80, 0x00, 0x00};
    uint8_t rx[3] = {0};
    spi_transaction_t trans = {
        .length = 24,
        .tx_buffer = tx,
        .rx_buffer = rx,
    };

    esp_err_t ret = spi_device_transmit(bmi270_spi, &trans);
    if (ret == ESP_OK) {
        *value = rx[2];
    }
    return ret;
}

成功日志:

BMI270 SPI initialized: SCK=GPIO3 MOSI=GPIO2 MISO=GPIO9 CS=GPIO10
BMI270 CHIP_ID register = 0x24 OK

这说明:

BMI270 子板连接正常
SPI 引脚正确
SPI 读寄存器流程正确

8. 为什么直接读六轴数据是 0

后续尝试直接写寄存器启用加速度计和陀螺仪:

ACC_CONF
ACC_RANGE
GYR_CONF
GYR_RANGE
PWR_CTRL

结果六轴数据一直是:

acc[g] x=+0.000 y=+0.000 z=+0.000
gyro[dps] x=+0.0 y=+0.0 z=+0.0

原因是 BMI270 与一些普通 IMU 不同,它需要先上传 Bosch 配置文件,内部状态变为初始化成功后,测量数据才会正常输出。

9. 接入 Espressif BMI270 组件

从 Espressif Component Registry 下载了官方 bmi270 组件:

components/bmi270/
  include/bmi270.h
  include_priv/bmi270_priv.h
  src/bmi270.c

官方组件自带:

bmi270_config_file[]
配置文件上传流程
ODR/range 配置
加速度/陀螺仪归一化读取

但该组件当前限制是:

SPI interface is currently not supported

因此做了本地修改:

1. bmi270_driver_config_t 增加 spi_handle
2. bmi270_create() 支持 BMI270_USE_SPI
3. read_register() 增加 SPI 读逻辑
4. write_register() 增加 SPI 写逻辑
5. 移除 sensor_hub 依赖,只保留低层驱动

工程中的 main.c 改为调用官方 API:

const bmi270_driver_config_t driver_config = {
    .interface = BMI270_USE_SPI,
    .spi_handle = bmi270_spi,
};

ESP_ERROR_CHECK(bmi270_create(&driver_config, &bmi270));

const bmi270_config_t measurement_config = {
    .acce_odr = BMI270_ACC_ODR_100_HZ,
    .acce_range = BMI270_ACC_RANGE_2_G,
    .gyro_odr = BMI270_GYR_ODR_100_HZ,
    .gyro_range = BMI270_GYR_RANGE_2000_DPS,
};

ESP_ERROR_CHECK(bmi270_start(bmi270, &measurement_config));

10. 当前调试状态

当前 SPI 读 CHIP_ID 已确认成功:

CHIP_ID = 0x24

但 BMI270 配置文件上传后,内部状态仍为:

BMI270 internal status after config upload: 0x00

错误日志:

BMI270: Could not initialize the device in time
BMI270: Failed to send the configuration file
sensairshuttle: bmi270_create failed: ESP_ERR_TIMEOUT

进一步诊断:

PWR_CONF before write: 0xFF
PWR_CONF after write: 0x03
INIT_CTRL before write: 0x00
INIT_CTRL after write: 0x00

这说明:

SPI 读 CHIP_ID 正常
但 SPI 写配置/控制寄存器仍需继续校准
配置文件尚未被 BMI270 正确接收

下一步应继续排查:

1. SPI 读写 dummy byte 是否一致
2. SPI 多字节写 INIT_DATA 的时序
3. INIT_CTRL 写 1 后是否应该有更长延时
4. SPI mode 0 / mode 3 差异
5. 是否需要严格参考 Bosch BMI270 SensorAPI 的 SPI read/write 回调

11. 常见问题总结

11.1 Monitor 看到 waiting for download

原因:板子仍在下载模式。

处理:

松开 BOOT
按 RESET
或拔插 USB,重新上电时不要按 BOOT

11.2 烧录 Write timeout

处理:

烧录波特率降到 115200
换 USB 数据线
换 USB 口
关闭串口助手/Monitor
按住 BOOT 再 Flash

11.3 Checksum mismatch

说明当前 Monitor 的固件不是最新 build 的固件,需要重新 Flash:

ESP-IDF: Build, Flash and Monitor

11.4 BMI270 I2C 扫不到

这块子板当前实测 I2C 没有 ACK,SPI 可以读到 CHIP_ID=0x24,建议优先走 SPI。

11.5 BMI270 六轴全 0

只写普通配置寄存器不够,BMI270 需要上传 Bosch 配置文件。

12. 面向六足仿生足式无人机的应用思路

这块 ESP-SensairShuttle 很适合在六足仿生足式无人机中做:

1. 姿态/震动/跌倒检测
2. 声音触发与语音交互
3. 扬声器状态提示/报警
4. Wi-Fi/BLE 数据上报
5. Web 控制台或云平台接入

推荐系统分工:

六足运动主控:步态、舵机、姿态闭环
ESP-SensairShuttle:传感器、语音、联网、状态提示

示例功能:

BMI270 检测倾倒 -> 扬声器报警 -> Web 页面显示故障
麦克风检测拍手 -> 切换步态模式
Wi-Fi 上传姿态和电池状态 -> 物联网比赛展示

13. 小结

本次调试完成了:

ESP-IDF v5.5.4 环境搭建
VS Code ESP-IDF 插件配置
ESP32-C5 烧录和 Monitor
BMI270 I2C 扫描排查
BMI270 SPI CHIP_ID 读取成功
Espressif BMI270 组件本地集成
SPI 版 BMI270 初始化问题定位

当前最重要的阶段性结论:

ESP-SensairShuttle 上的 BMI270&BMM350 子板,当前实测 SPI 通信可用;
BMI270 CHIP_ID 可稳定读到 0x24;
完整六轴数据读取还需要继续完善 BMI270 配置文件上传的 SPI 写入流程。

后续建议优先对照 Bosch BMI270 SensorAPI 的 SPI 回调,实现完全兼容的 read/write/delay,再读取加速度和陀螺仪数据。

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐