如何基于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, ®_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




