ESP-SensairShuttle(ESP32-C5)开发调试记录:环境搭建、烧录、BMI270 通信排查
本文记录一次 ESP-SensairShuttle 开发板的完整上手过程,包括 ESP-IDF 环境配置、VS Code 烧录、串口监视、BMI270/BMM350 Shuttle Board 的 I2C/SPI 排查
1. 硬件简介
ESP-SensairShuttle 是乐鑫基于 ESP32-C5-WROOM-1-N16R8 推出的多模态感知开发板,适合做运动感知、语音交互、物联网监测、AI 玩具、智能家居等应用。
官方文档入口:
官方主板正面图:

官方功能框图:

我手上的实物如下,当前接了麦克风、扬声器,并安装了 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,再读取加速度和陀螺仪数据。
更多推荐



所有评论(0)