You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何基于XMC1100 2Go开发板通过I2C读取3D磁传感器数据

刚上手英飞凌这款3D Magnetic Sensor 2Go开发板是吧?我之前折腾过同款,给你捋一遍从配置到读取数据的完整流程,帮你避开我踩过的坑。

1. 先搞定开发环境

首先得装英飞凌的DAVE™ 5(DAVE 4也能用,但5版本更稳定),安装过程中记得勾选XMC1系列的支持包。装好后直接导入开发板的官方示例项目——在DAVE的Project Wizard里搜“3D Magnetic Sensor 2Go”,导入后会自动帮你配置好XMC1100的基础外设,省得你手动配引脚和时钟。

2. 搞懂传感器的I2C基础参数

这款开发板搭配的是TLI493D 3D磁传感器,它的默认7位I2C地址是0x35(开发板出厂时A0/A1引脚接GND,地址固定为这个值)。

你得记几个关键寄存器:

  • 0x00:控制寄存器,用来切换测量模式(默认是低功耗模式,我们要改成连续测量)
  • 0x02~0x07:X/Y/Z轴的高低位数据寄存器(每个轴占16位,但有效数据是低12位,高位4位是状态标识)
3. 配置XMC1100的I2C外设

如果用了官方示例,I2C其实已经配置好了,但还是确认下细节:

  • 打开DAVE的Configuration Editor,找到I2C Master模块
  • 引脚对应:XMC1100的P0.4是SDA,P0.5是SCL(开发板上已经和传感器连好,不用改动)
  • 波特率设为100kHz(传感器默认支持这个速率,别设太高避免通信失败)
  • 保存配置后,DAVE会自动生成对应的初始化代码。
4. 编写传感器数据读取代码

直接用DAVE生成的I2C API读写就行,不用自己写底层时序,效率高还不容易错。

第一步:配置传感器为连续测量模式

先给传感器的控制寄存器0x00写值,切换到连续测量模式:

#include "DAVE.h"

#define SENSOR_I2C_ADDR 0x35 << 1 // 转成8位地址,7位地址左移1位,读写位由API自动处理

void sensor_init(void) {
  uint8_t config_data = 0x00; // 0x00对应连续测量模式,输出速率10Hz
  XMC_I2C_MasterTransmit(I2C_MASTER_HANDLE, SENSOR_I2C_ADDR, &config_data, 1, XMC_I2C_MASTER_MODE_REPEATED_START);
}

第二步:读取三轴磁数据

写个函数循环读取X/Y/Z的数据,再拼接成有效数值:

typedef struct {
  int16_t x;
  int16_t y;
  int16_t z;
} MagneticData;

MagneticData read_sensor_data(void) {
  MagneticData data = {0};
  uint8_t reg_addr = 0x02; // 从X轴低位寄存器开始读取
  uint8_t raw_data[6];

  // 先发送寄存器地址,再连续读取6个字节的三轴数据
  XMC_I2C_MasterTransmit(I2C_MASTER_HANDLE, SENSOR_I2C_ADDR, &reg_addr, 1, XMC_I2C_MASTER_MODE_REPEATED_START);
  XMC_I2C_MasterReceive(I2C_MASTER_HANDLE, SENSOR_I2C_ADDR, raw_data, 6, XMC_I2C_MASTER_MODE_STOP);

  // 拼接数据,屏蔽高位4位的状态位,只保留低12位有效数据
  data.x = (int16_t)((raw_data[1] << 8) | raw_data[0]) & 0x0FFF;
  data.y = (int16_t)((raw_data[3] << 8) | raw_data[2]) & 0x0FFF;
  data.z = (int16_t)((raw_data[5] << 8) | raw_data[4]) & 0x0FFF;

  // 把无符号12位数据转换成有符号数(磁场有正负)
  if(data.x > 0x07FF) data.x -= 0x1000;
  if(data.y > 0x07FF) data.y -= 0x1000;
  if(data.z > 0x07FF) data.z -= 0x1000;

  return data;
}

第三步:主函数调用

main()里初始化DAVE和传感器,然后循环读取数据:

int main(void) {
  DAVE_Init(); // 初始化DAVE生成的所有外设
  sensor_init(); // 配置传感器工作模式

  while(1) {
    MagneticData mag_data = read_sensor_data();
    // 这里可以添加UART输出代码,把数据打印到串口助手查看
    delay_ms(100); // 和传感器10Hz的输出速率匹配
  }
}
5. 把原始数据转换成实际磁场值

TLI493D的默认量程是±120mT,12位数据的范围是-2048到2047,所以每1LSB对应的磁场值约为0.0586mT,转换代码如下:

float x_mT = mag_data.x * 0.0586f;
float y_mT = mag_data.y * 0.0586f;
float z_mT = mag_data.z * 0.0586f;
几个避坑提醒
  • 别搞混7位和8位I2C地址:代码里用的是8位地址(7位地址左移1位),DAVE的API要求传入8位地址
  • 控制寄存器别写错:错误的配置值会让传感器进入休眠或输出无效数据
  • 如果读取失败,先检查I2C引脚配置,或者用DAVE的I2C调试工具查看总线波形

内容的提问来源于stack exchange,提问作者Microbob

火山引擎 最新活动