TI BP-BASSENSORSMKII开发板实战:多传感器集成与数据融合应用

发布时间:2026/6/30 8:44:09
TI BP-BASSENSORSMKII开发板实战:多传感器集成与数据融合应用 1. 从零到一BP-BASSENSORSMKII BoosterPack 开箱与核心价值解析如果你正在寻找一款能够快速验证物联网或嵌入式系统传感器方案的开发板那么德州仪器TI的BP-BASSENSORSMKII BoosterPack绝对值得你花时间深入了解。这不是一块普通的传感器扩展板而是一个集成了六种高精度、高可靠性传感器的“瑞士军刀”专为TI的LaunchPad生态系统设计。我拿到这块板子后第一感觉就是它的集成度非常高从环境感知到运动追踪几乎覆盖了物联网节点所需的大部分基础传感功能。对于从事智能家居、楼宇自动化、环境监测或者任何需要多传感器数据融合项目的开发者来说它能让你跳过繁琐的传感器选型、电路设计和底层驱动调试直接进入应用逻辑开发效率提升不是一点半点。这块板子的核心价值在于其“即插即用”的便利性和TI官方提供的完整软件支持。它集成了TI自家的高精度温度传感器TMP117、温湿度一体传感器HDC2080、环境光传感器OPT3001、霍尔效应传感器DRV5055-Q1以及来自博世Bosch的BMI160惯性测量单元IMU和BMM150磁力计。这意味着在一块小小的板卡上你就能同时获取温度、湿度、光照、磁场强度、加速度、角速度以及地磁场方向等九轴数据。对于需要复杂状态感知的应用比如室内定位、姿态检测、环境质量监控等这块板子提供了一个近乎完美的硬件原型平台。接下来我将结合我的实际使用经验带你从硬件拆解到软件实战彻底玩转这块功能强大的传感器开发板。2. 硬件深度剖析板载传感器特性与接口设计2.1 板载传感器全家福与性能解读BP-BASSENSORSMKII的硬件设计非常紧凑所有传感器都布局在一块标准的BoosterPack尺寸板卡上。我们先来逐一认识一下这六位“主角”了解它们的特性和在项目中的典型应用场景。TMP117高精度数字温度传感器这是TI的明星产品一款16位分辨率的温度传感器。它的精度非常高典型值±0.1°C并且功耗极低。与常见的DS18B20或LM75相比TMP117通过I2C接口通信速率更快精度也更高一个数量级。它非常适合需要精确温度测量的场景比如医疗设备、恒温恒湿控制或者高精度环境监测站。在板子上它通过一根附带的3英寸排线引出这设计很贴心因为温度传感器对热源敏感远离主控板和其它发热元件能获得更准确的环境温度读数。HDC2080低功耗数字温湿度传感器这是一颗集成了温度和湿度测量的传感器。它的湿度测量范围是0-100% RH精度在典型条件下可达±2%。对于楼宇自动化中的舒适度控制HVAC或者农业温室监测它是核心器件。HDC2080同样通过I2C通信并且具有可编程的中断功能当温度或湿度超过设定阈值时可以主动通知MCU这对于低功耗设计至关重要——MCU大部分时间可以休眠只有传感器报警时才唤醒处理。OPT3001环境光传感器这颗传感器测量的是人眼可见的光照强度单位是勒克斯Lux。它的测量范围非常宽从0.01 Lux到83k Lux足以覆盖从黑暗房间到阳光直射下的各种环境。在自动调光屏幕、智能照明系统中OPT3001可以直接提供符合人眼感知的光照数据无需复杂的算法转换。它也是I2C接口并且自带数字输出抗干扰能力比模拟光敏电阻强得多。DRV5055-Q1模拟式霍尔效应传感器这是一个比较特别的成员因为它输出的是模拟电压信号而不是数字信号。它通过感知磁场强度来输出电压变化测量范围是±20mT到±100mT具体取决于型号。你需要使用LaunchPad上的ADC模数转换器来读取它的电压值再根据数据手册中的灵敏度参数单位是mV/mT换算成磁场强度。它常用于非接触式位置检测、转速测量通过检测磁铁旋转或者电流检测等场景。Bosch BMI160 6轴惯性测量单元IMUBMI160集成了一个3轴加速度计和一个3轴陀螺仪是运动感知的核心。加速度计测量的是比力可以感知倾斜、振动、冲击陀螺仪测量的是角速度可以感知旋转。两者结合就能实现基本的姿态估计和运动跟踪。BMI160本身性能强悍支持高达1600Hz的加速度计输出和3200Hz的陀螺仪输出并且内置了数字运动处理器DMP可以减轻主控MCU的运算负担。Bosch BMM150 3轴数字磁力计BMM150测量的是地球磁场或附近磁铁在X、Y、Z三个方向上的磁场强度。它与BMI160组合通过I2C次级接口连接到BMI160由BMI160统一管理并输出9轴数据加速度3轴 陀螺仪3轴 磁力计3轴。这构成了一个完整的“电子罗盘”或姿态参考系统AHRS可以计算出设备相对于地理北极的航向角Yaw对于无人机、机器人、导航设备来说是关键传感器。注意板上的TMP117、HDC2080、OPT3001和BMI160这四个器件共享同一组I2C总线SCL和SDA。这意味着它们具有不同的I2C从机地址主控MCU需要通过地址来区分并与它们通信。后续在软件部分我们会详细讲解如何寻址。2.2 接口、供电与堆叠注意事项BP-BASSENSORSMKII严格遵循TI LaunchPad的40引脚BoosterPack标准。板卡边缘有两排插针公头用于插入底层的LaunchPad同时板卡上也焊接了两排插孔母座允许你将另一块BoosterPack堆叠在上面。这种设计提供了极大的灵活性。电源设计整个板卡由底层的LaunchPad通过J1.1引脚3V3统一供电。这里有一个关键细节需要特别注意HDC2080和DRV5055-Q1的电源是受控的。查看原理图你会发现它们的3.3V供电并非直接连接而是通过一个MOSFET开关Q2和Q1控制。要使能HDC2080你需要将J1.6引脚拉低逻辑0要使能DRV5055-Q1则需要将J1.24引脚拉低。这种设计是为了实现超低功耗当你不使用某个传感器时可以彻底关断其电源实现零功耗。在编写软件时务必在初始化传感器前先通过GPIO控制这两个引脚给传感器上电。I2C地址表这是软件驱动的基础你必须清楚每个传感器的“门牌号”。以下是板上所有I2C设备的7位地址这是最常用的表示法设备7位二进制地址7位十六进制地址OPT300110001000x44TMP11710010000x48HDC208010000000x40BMM15000011010x13BMI16011010010x69堆叠警告虽然板子支持堆叠但你必须谨慎考虑。传感器对外部环境非常敏感。如果你在BASSensors板卡上方堆叠另一块板卡可能会产生以下影响热影响上层板卡的发热元件如电源芯片、主控MCU会加热空气导致下方的温度、湿度传感器读数严重偏离真实环境温度。遮挡影响上层板卡会完全遮挡住OPT3001环境光传感器使其无法接收到真实的环境光。电磁干扰上层板卡上的数字电路、开关电源会产生电磁场干扰下方的DRV5055-Q1霍尔传感器和BMM150磁力计的读数导致数据跳变或基线漂移。因此我的建议是尽量避免在BASSensors上方堆叠其他板卡。如果必须堆叠请确保上层板卡有足够的开孔或远离传感器区域并评估其对测量精度的影响。3. 软件开发环境搭建与示例工程解析3.1 开发工具链选择与项目导入要驱动这块传感器板卡你需要一块TI的LaunchPad作为主控。BP-BASSENSORSMKII兼容多款SimpleLink MCU LaunchPad包括基于CC13xx/CC26xx系列的无线MCU LaunchPad如CC1352R和基于MSP432的微控制器LaunchPad。TI为这些平台提供了统一的软件支持包——SimpleLink SDK以及一个名为Sensor and Actuator Plugin (SAIL)的插件。所有示例代码都包含在SAIL插件中。开发环境IDE选择你有三个主流选择Code Composer Studio (CCS)TI官方的集成开发环境功能最全与TI芯片和SDK集成度最高调试体验好。推荐版本v7.1.0或更高。IAR Embedded Workbench for ARM第三方商业IDE以优秀的代码优化著称在业界拥有大量用户。需要v7.80.3或更高版本。Keil MDK-ARM同样是流行的ARM开发环境。需要MDK-ARM v5或更高版本。对于初学者或者希望快速上手的开发者我强烈推荐使用CCS Cloud。这是一个基于浏览器的在线IDE无需在本地安装几个GB的软件包。你只需要一个TI账户用USB线连接LaunchPad打开浏览器就能开始编码、编译和调试。它预置了SAIL插件和所有示例项目导入过程几乎是傻瓜式的能帮你绕过最令人头疼的环境配置环节。导入示例项目的实操步骤以CCS Desktop为例确保你已经安装了对应你LaunchPad型号的SimpleLink SDK例如MSP432P401R LaunchPad需要安装SimpleLink MSP432 SDK。安装SAIL插件。通常安装SDK时会自动包含或者你可以从TI官网单独下载。打开CCS选择或创建一个工作空间Workspace。点击菜单栏的Project-Import CCS Projects...。在弹出的对话框中点击Browse导航到SAIL插件的安装目录。路径通常类似于C:\ti\sail_x_xx_xx_xx\examples\rtos\[你的LaunchPad型号]\sail\。在这个sail文件夹下你会看到五个子文件夹分别对应五个传感器示例adcdrv5055,i2cHDC2080,i2copt3001,i2cTMP117,i2cbmi160。选择你想导入的项目文件夹例如i2copt3001。CCS会自动识别项目文件并在列表中显示。勾选它然后点击Finish。项目导入后在Project Explorer中就能看到它。右键点击项目选择Build Project进行编译。编译成功后连接LaunchPad点击Debug按钮即可将程序下载到板子上运行。实操心得有时CCS导入项目后项目图标上会有一个小的红叉但这不一定是错误。先尝试编译很多警告或路径问题在编译过程中会自动解决。如果编译失败最常见的问题是编译器版本或SDK路径不对。检查项目属性右键项目 - Properties中的Build-General设置确保选择了正确的编译器版本和SDK路径。3.2 示例代码结构深度解读我们以i2copt3001这个读取环境光传感器的示例项目为例来剖析一下TI示例代码的典型结构。理解这个结构对你修改代码、创建自己的项目至关重要。打开项目后你会看到类似如下的文件结构具体因LaunchPad型号和IDE略有差异i2copt3001/ ├── tirtos/ │ ├── ccs/ # CCS项目配置文件 (.project, .cproject) │ ├── gcc/ # GCC编译器配置如果使用 │ └── iar/ # IAR项目文件 (.eww, .ewp) ├── i2copt3001.c # 主应用程序源文件包含main()和任务函数 ├── board.h # 板级支持包头文件定义了本板卡LaunchPadBASSensors的引脚、外设映射 ├── [LaunchPad].c # 对应LaunchPad的初始化代码如MSP_EXP432P401R.c ├── [LaunchPad].h # 对应LaunchPad的宏定义 ├── ccfg.c # 芯片配置文件设置时钟、看门狗等 └── README.html # 项目说明文档核心文件i2copt3001.c解析 这个文件是程序的入口和逻辑核心。我们来看一下它的典型工作流程// 1. 包含必要的头文件 #include ti/drivers/I2C.h #include board.h // ... 其他头文件 // 2. 全局变量和定义 #define OPT3001_SLAVE_ADDRESS 0x44 // OPT3001的I2C地址 #define OPT3001_REG_RESULT 0x00 // 光照数据结果寄存器 #define OPT3001_REG_CONFIG 0x01 // 配置寄存器 // ... 其他寄存器定义 // 3. 任务函数MainThread void *mainThread(void *arg0) { // 3.1 初始化板载外设由Board_init()完成 Board_init(); // 3.2 打开I2C驱动实例 I2C_Handle i2cHandle; I2C_Params i2cParams; I2C_Params_init(i2cParams); i2cParams.bitRate I2C_400kHz; // 设置I2C速率400kHz是常用速率 i2cHandle I2C_open(Board_I2C0, i2cParams); // Board_I2C0在board.h中定义 // 3.3 配置OPT3001传感器 uint8_t txBuffer[3]; txBuffer[0] OPT3001_REG_CONFIG; // 要写的寄存器地址 txBuffer[1] 0xCE; // 配置值高字节例如连续转换模式自动量程 txBuffer[2] 0x10; // 配置值低字节 I2C_Transaction i2cTransaction; i2cTransaction.slaveAddress OPT3001_SLAVE_ADDRESS; i2cTransaction.writeBuf txBuffer; i2cTransaction.writeCount 3; i2cTransaction.readBuf NULL; i2cTransaction.readCount 0; I2C_transfer(i2cHandle, i2cTransaction); // 执行I2C写操作 // 3.4 主循环读取数据并打印 while (1) { // 发送读取结果寄存器的命令 txBuffer[0] OPT3001_REG_RESULT; i2cTransaction.writeCount 1; i2cTransaction.readBuf rxBuffer; // rxBuffer是接收缓冲区 i2cTransaction.readCount 2; // 结果寄存器是2字节 if (I2C_transfer(i2cHandle, i2cTransaction)) { // 读取成功将原始数据转换为勒克斯值 uint16_t rawData (rxBuffer[0] 8) | rxBuffer[1]; float lux convertToLux(rawData); // 调用转换函数 // 通过UART打印结果 printf(Light Intensity: %.2f Lux\n, lux); } else { // I2C通信失败处理 printf(I2C read failed!\n); } // 延时一段时间例如1秒 sleep(1); } }关键点解析Board_init()这个函数至关重要它初始化了LaunchPad上所有用到的外设包括I2C、UART用于打印、GPIO等。它会根据board.h和[LaunchPad].c中的配置将MCU的物理引脚与软件驱动关联起来。对于BASSensors板卡board.h已经定义好了哪个I2C实例如Board_I2C0连接到了板载传感器的共享I2C总线上。I2C驱动流程TI的驱动模型非常清晰。首先用I2C_open()打开一个I2C实例然后配置I2C_Params主要是速率。所有的读写操作都通过填充一个I2C_Transaction结构体然后调用I2C_transfer()函数来完成。这个函数是阻塞式的会等待传输完成或超时。传感器配置每个传感器都有其特定的配置寄存器。示例代码中通常会给出一个合理的默认配置如连续转换、自动量程。你需要根据实际应用调整这些配置。例如对于OPT3001如果你知道光照范围固定可以设置为固定量程以提高转换速度如果追求低功耗可以设置为单次转换模式让MCU大部分时间休眠。数据转换从传感器读回的是原始寄存器值Raw Data需要根据数据手册中的公式转换为有意义的物理量。示例代码中通常包含convertToLux(),convertToTemp()这样的辅助函数。务必仔细查阅每个传感器的数据手册理解转换公式和系数的含义这对于保证测量精度至关重要。其他几个示例项目i2cHDC2080,i2cTMP117,i2cbmi160的结构与此类似只是传感器地址、配置寄存器和数据转换函数不同。adcdrv5055项目稍有不同因为它读取的是模拟传感器所以核心是配置和读取MCU内部的ADC然后将ADC值转换为电压再根据DRV5055的灵敏度转换为磁场强度mT。4. 多传感器数据融合与实战应用进阶4.1 从独立读取到协同工作构建你自己的传感器应用官方示例是分立的每个程序只读取一个传感器。但在实际项目中我们往往需要同时获取所有传感器的数据并进行融合处理。例如一个智能环境监测节点需要同时上报温度、湿度、光照和运动状态。这就需要你创建一个新的工程将多个传感器的驱动代码整合在一起。整合步骤与核心挑战创建新工程最简单的方法是在CCS中复制一个现有的示例工程如i2copt3001重命名为你自己的项目名如sensor_fusion_demo。合并初始化代码将其他示例中传感器初始化的代码片段复制到你的mainThread函数中。特别注意由于所有I2C传感器共享总线你只需要打开一个I2C实例I2C_Handle所有传感器都通过这个实例通信。处理时序与冲突I2C总线是半双工的同一时间只能有一个主设备MCU和一个从设备传感器通信。你需要安排好读取各个传感器的顺序避免逻辑混乱。一种简单的做法是顺序读取先读OPT3001再读HDC2080然后读TMP117最后读BMI160/BMM150。可以在每次读取间加入微小延时。电源管理别忘了HDC2080和DRV5055-Q1需要GPIO控制上电。在你的初始化代码中应该先配置对应的GPIO引脚为输出模式然后拉低使能传感器电源。数据打包与传输读取到所有数据后你需要决定如何处理它们。可以打包成一个结构体通过UART以JSON或自定义二进制格式发送到上位机也可以使用无线LaunchPad如CC1352R通过蓝牙或Sub-1GHz无线发送出去。一个简单的多传感器读取循环框架void sensorReadTask(void) { I2C_Handle i2c initI2C(); // 初始化I2C enableSensorPower(); // 使能HDC2080和DRV5055电源 // 初始化各个传感器写配置寄存器 initOPT3001(i2c); initHDC2080(i2c); initTMP117(i2c); initBMI160(i2c); // BMI160初始化会同时配置BMM150 while(1) { SensorData_t data; // 自定义的数据结构体 data.lux readOPT3001(i2c); data.temp_hdc readHDC2080Temp(i2c); data.humidity readHDC2080Humidity(i2c); data.temp_tmp readTMP117(i2c); readBMI160(i2c, data.accel, data.gyro); // 读取加速度和陀螺仪 readBMM150(i2c, data.mag); // 通过BMI160读取磁力计数据 data.magneticField readDRV5055ADC(); // 读取ADC值并转换 // 处理或发送data sendDataViaUART(data); Task_sleep(1000 * 1000 / Clock_tickPeriod); // 休眠1秒 } }4.2 传感器数据融合入门从9轴数据到姿态角当你同时拥有BMI1606轴IMU和BMM1503轴磁力计的数据时你就获得了9自由度9-DoF的原始数据。这些数据本身很有用但通过传感器融合算法我们可以得到更稳定、更有意义的姿态信息——即设备相对于地理坐标系的俯仰角Pitch、横滚角Roll和航向角Yaw。为什么需要融合加速度计静止时可以测量重力方向从而计算出俯仰和横滚角。但对运动加速度敏感设备移动时会产生巨大误差。陀螺仪通过积分角速度可以得到角度变化短期精度高且不受线性运动影响。但存在漂移误差积分时间越长累积误差越大。磁力计可以感知地磁场方向用于校正航向角Yaw。但极易受环境中铁磁物质干扰如电脑、桌子。融合算法的目的就是取长补短结合加速度计长期稳定纠正陀螺仪漂移和磁力计提供绝对航向参考来修正陀螺仪积分得到的结果从而输出稳定、准确的姿态角。入门级融合算法互补滤波对于嵌入式系统一种简单有效的算法是互补滤波。其核心思想是对高频信号快速变化信任陀螺仪对低频信号缓慢变化信任加速度计和磁力计。下面是一个高度简化的伪代码概念// 假设 dt 为采样时间间隔angle 为当前估计的角度gyro_rate 为陀螺仪角速度accel_angle 为加速度计计算的角度 float complementaryFilter(float angle, float gyro_rate, float accel_angle, float dt, float alpha) { // alpha 是滤波系数0alpha1决定了信任加速度计的程度 // 角度 旧角度 陀螺仪积分 * (1-alpha) 加速度计角度 * alpha angle angle gyro_rate * dt * (1-alpha) (accel_angle - angle) * alpha; return angle; }对于航向角Yaw可以将accel_angle替换为由加速度计和磁力计共同计算出的“参考航向角”。进阶选择Mahony或Madgwick滤波对于要求更高的应用可以使用更成熟的姿态估计算法如Mahony滤波或Madgwick滤波。这些算法基于四元数运算能更优雅地处理三维空间旋转精度更高抗干扰能力更强。TI的SAIL插件或Bosch的BMI160驱动库中可能已经包含了这些算法的实现或者你可以寻找开源的嵌入式C语言库如MadgwickAHRS移植到你的项目中。实战建议如果你的应用对姿态精度要求不高或者MCU资源紧张可以从互补滤波开始。如果要做无人机、机器人或VR/AR设备那么投入时间研究并实现Mahony/Madgwick滤波是必要的。在调试时务必通过串口将原始传感器数据加速度、角速度、磁场和融合后的姿态角四元数或欧拉角实时发送到上位机如使用Python的Matplotlib进行可视化这是调试融合算法最有效的方法。5. 常见问题排查与调试技巧实录在实际使用BP-BASSENSORSMKII的过程中你几乎一定会遇到一些问题。下面是我总结的一些典型问题及其解决方法希望能帮你少走弯路。5.1 硬件连接与电源问题问题1连接LaunchPad后传感器完全没有反应I2C扫描不到任何设备。检查步骤物理连接确保BoosterPack已经牢固地插入LaunchPad的插槽中没有针脚弯曲或错位。检查LaunchPad本身是否供电正常电源指示灯亮。电源使能确认你是否在代码中正确初始化了GPIO并将J1.6HDC2080使能和J1.24DRV5055使能引脚拉低了。用万用表测量这两个传感器附近的3.3V引脚是否有电。I2C上拉电阻LaunchPad上通常已经集成了I2C总线的上拉电阻通常是4.7kΩ。如果使用自定义底板请确保SCL和SDA线上有上拉电阻到3.3V。地址冲突使用一个简单的I2C扫描程序很多IDE的示例中都有扫描0x00到0x7F之间的地址看是否能发现设备。如果扫描不到可能是总线通信失败如果扫描到的地址不对可能是地址配置错误。问题2TMP117温度读数不准或无法读取。检查步骤排线连接TMP117是通过附带的柔性排线连接的。务必注意排线的方向金属触点面朝下插入连接器黑色卡扣朝上锁紧。插反了会导致接触不良。热源干扰TMP117对热源非常敏感。确保排线末端的传感器部分远离LaunchPad的MCU、电源芯片等发热元件也避免用手直接触摸传感器芯片。5.2 软件编译与运行问题问题3编译示例工程时报错找不到头文件或链接错误。原因与解决这几乎总是开发环境配置问题。检查SDK路径在CCS中右键项目 - Properties - Build - General。确保Products/Repositories和Compiler/Linker的路径指向你已安装的正确版本的SimpleLink SDK。检查SAIL插件路径确认你导入的项目路径确实在SAIL插件的examples目录下。有时手动复制项目文件夹会导致相对路径失效。重新导入/重建索引尝试关闭CCS删除项目所在工作空间下的.metadata文件夹先备份然后重新启动CCS并导入项目。或者在项目上右键 - Index - Rebuild。问题4程序可以下载但UART没有输出或者输出乱码。检查步骤串口配置确认你的上位机串口工具如Putty、Tera Term的配置与代码中UART的配置一致波特率通常是115200、数据位8、停止位1、无校验。LaunchPad虚拟串口许多LaunchPad通过USB实现了一个虚拟串口CDC。你需要安装对应的USB转串口驱动如TI的MSP430 USB CDC驱动。在设备管理器中查看是否正确识别。引脚复用检查board.h和[LaunchPad].c文件确认UART使用的引脚没有被其他功能占用。有些LaunchPad的UART引脚可能与板载调试器共享需要跳线帽设置。5.3 传感器数据异常问题问题5BMI160/BMM150数据噪声大或者磁力计读数受LaunchPad本身影响。原因LaunchPad上的MCU、电源电路、甚至USB数据线都会产生交变磁场干扰敏感的磁力计。解决方案校准在使用磁力计前必须进行校准。执行“八字”校准法将板子在空间各个方向缓慢旋转画“8”字期间持续读取磁力计数据记录下X, Y, Z三个方向的最大值和最小值计算偏移量硬铁干扰和缩放比例软铁干扰。将校准参数保存下来后续读数进行补偿。远离干扰源如果可能将BASSensors板卡通过排线延长远离LaunchPad主板。软件滤波对原始数据进行软件滤波如滑动平均滤波或低通滤波可以平滑掉高频噪声。问题6DRV5055霍尔传感器读数不变化或始终为0。检查步骤电源使能确认J1.24引脚已被拉低用万用表测量DRV5055的VCC引脚是否有3.3V。ADC配置检查代码中ADC的配置是否正确例如参考电压、采样通道、分辨率。DRV5055输出的是模拟电压需要LaunchPad的ADC去读取。磁铁测试DRV5055是单极或双极锁存型霍尔传感器具体看型号。用一块小磁铁靠近传感器芯片表面有标记感应面通常在印有型号的那一面观察ADC读数是否发生跳变。注意磁铁的极性。电压换算ADC读回来的是数字值需要根据ADC的参考电压和分辨率换算成电压值Vout。然后再根据DRV5055数据手册中的灵敏度例如DRV5055A1是5mV/mT将电压转换为磁场强度磁场强度(mT) (Vout - Vout_q) / 灵敏度。其中Vout_q是零磁场时的静态输出电压典型值为0.6V或2.5V取决于型号。调试多传感器系统分而治之是最有效的策略。先确保每个传感器单独工作正常利用TI提供的独立示例然后再尝试将它们整合到一个工程中。充分利用UART打印调试信息将关键步骤的状态、读取的原始数据、转换后的物理量都打印出来这是定位问题最快的方法。