一:IIS2mdc基础知识
IIS2MDC是一款高精度、超低功耗的三轴数字磁:传感器。
IIS2MDC具有高达+50高斯的磁场动态范围0
IIS2MDC包含一个支持标准、快速模式、快速模式增强和高速(100kHz、400kHz、1MHz和3.4MHz)以及SPI串行标准接口的I12C总线接口。
该设备可配置为生成中断信号以用于磁场检测。
IIS2MDC提供塑料扁平网格阵列封装(LGA),并保证在-40°C至+85°C的宽温度范围内工作。
二:原理图:

IIS2MDC 通过标准的 I²C 总线与主控(MCU)通信。在配置前,需要确保硬件连接正确:
引脚连接:将传感器的 SDA 和 SCL 引脚分别连接到主控的对应 I²C 引脚,并必须通过上拉电阻(如 4.7kΩ)连接到电源,以保证总线空闲时为高电平 。CS 引脚需接高电平,以选择 I²C 模式 。
从设备地址:IIS2MDC 的 7 位 I²C 设备地址是 0x1E 。写操作为 0x3C (0x1E << 1),读操作为 0x3D (0x1E << 1 | 1) 。
三:软件代码:
1.硬件初始化与接口选择
IIS2MDC 支持 I2C 和 3线SPI 两种数字接口,通过 CS引脚 的电平进行选择:
CS引脚为高电平:选择 I2C 通信。I2C 设备地址通常是 0x1E(7位地址)。
CS引脚为低电平:选择 SPI 通信。
2.传感器配置
在读取数据前,需要通过配置寄存器来设定传感器的工作方式。关键配置如下:
设置工作模式:通过 CFG_REG_A 寄存器的 MD[1:0] 位进行配置。
00:连续模式,传感器持续测量并更新数据。
01:单次模式,触发一次测量后自动进入空闲模式。
11:空闲模式(上电后默认状态)。
设置输出数据速率:在连续模式下,通过 CFG_REG_A 寄存器的 ODR[1:0] 位,可选择10 Hz 至 150 Hz 的输出速率。
设置量程:IIS2MDC 的固定满量程为 ±50高斯。
3. 数据读取流程 检查数据就绪状态
有三种方式可以判断新数据是否准备好:
轮询状态寄存器:读取 STATUS_REG 寄存器,检查 Zyxda 位。该位为 '1' 时,表示三轴新数据均已就绪。
使用DRDY引脚:将 CFG_REG_C 寄存器中的 DRDY_on_PIN 位置为 '1',可以将数据就绪信号直接输出到 INT/DRDY 硬件引脚,通过外部中断或GPIO监听来高效读取。
读取原始数据
当数据就绪后,主控通过I2C或SPI从 0x68 寄存器地址开始,连续读取 6个字节 的数据。这6个字节分别对应X、Y、Z轴的输出寄存器,每个轴的原始数据为 16位有符号整数(2个字节,低字节在前)。示例代码逻辑如下:// 通过I2C读取 uint8_t raw_data[6]; i2c_read(DEVICE_ADDR, 0x68, raw_data, 6); // 从0x68开始读取6个字节 // 将两个字节组合成一个int16_t数(小端模式) int16_t raw_x = (int16_t)((raw_data[1] << 8) | raw_data[0]); int16_t raw_y = (int16_t)((raw_data[3] << 8) | raw_data[2]); int16_t raw_z = (int16_t)((raw_data[5] << 8) | raw_data[4]);
数据转换
将原始数据乘以灵敏度,即可得到单位为毫高斯的实际磁场强度值。灵敏度通常在数据手册中给出,例如 0.0015 高斯/LSB 或 1.5 毫高斯/LSB。转换公式如下:float sensitivity = 1.5f; // 灵敏度,单位: 毫高斯/LSB float mag_x = raw_x * sensitivity; float mag_y = raw_y * sensitivity; float mag_z = raw_z * sensitivity;硬件IIC初始化函数
// IIS2MDC 数据结构
typedef struct {
int16_t x;
int16_t y;
int16_t z;
} IIS2MDC_MagData_t;
// 传感器初始化函数
HAL_StatusTypeDef IIS2MDC_Init(void) {
uint8_t data;
// 1. 检查设备ID(可选,WHO_AM_I寄存器值为0x40)
// 注:IIS2MDC没有标准的WHO_AM_I寄存器,可通过读取CFG_REG_A默认值0x60验证
// 2. 配置CFG_REG_A: 连续模式(00),输出速率10Hz(00)
// 寄存器值: MD[1:0]=00, ODR[1:0]=00, 其他位默认0
data = 0x00;
if (HAL_I2C_Mem_Write(&hi2c1, IIS2MDC_ADDR_WRITE, IIS2MDC_CFG_REG_A,
I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY) != HAL_OK) {
return HAL_ERROR;
}
// 3. 配置CFG_REG_C: 使能BDU位(bit4=1),防止读取时数据被更新
// 寄存器值: 0x10
data = 0x10;
if (HAL_I2C_Mem_Write(&hi2c1, IIS2MDC_ADDR_WRITE, IIS2MDC_CFG_REG_C,
I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY) != HAL_OK) {
return HAL_ERROR;
}
// 4. 等待传感器稳定
HAL_Delay(50);
return HAL_OK;
}基础读取、写入寄存器函数
// 检查数据是否就绪(读取STATUS_REG的Zyxda位,bit3)
uint8_t IIS2MDC_IsDataReady(void) {
uint8_t status;
if (IIS2MDC_ReadReg(IIS2MDC_STATUS_REG, &status) != HAL_OK) {
return 0;
}
return (status & 0x08) ? 1 : 0; // Zyxda位为1表示新数据就绪
}
// 读取磁力计数据(6字节连续读取)[citation:1]
HAL_StatusTypeDef IIS2MDC_ReadMagData(IIS2MDC_MagData_t *data) {
uint8_t raw_data[6];
// 从0x68开始连续读取6个字节
if (HAL_I2C_Mem_Read(&hi2c1, IIS2MDC_ADDR_READ, IIS2MDC_OUTX_L_REG,
I2C_MEMADD_SIZE_8BIT, raw_data, 6, HAL_MAX_DELAY) != HAL_OK) {
return HAL_ERROR;
}
// 组合16位有符号整数(小端:低字节在前)
data->x = (int16_t)((raw_data[1] << 8) | raw_data[0]);
data->y = (int16_t)((raw_data[3] << 8) | raw_data[2]);
data->z = (int16_t)((raw_data[5] << 8) | raw_data[4]);
return HAL_OK;
}
// 读取温度数据(2字节)[citation:1]
HAL_StatusTypeDef IIS2MDC_ReadTemperature(float *temperature) {
uint8_t temp_data[2];
int16_t raw_temp;
// 从0x6E开始读取2个字节(温度必须单独读取,不能与磁力计一起读)[citation:1]
if (HAL_I2C_Mem_Read(&hi2c1, IIS2MDC_ADDR_READ, IIS2MDC_OUT_TEMP_L_REG,
I2C_MEMADD_SIZE_8BIT, temp_data, 2, HAL_MAX_DELAY) != HAL_OK) {
return HAL_ERROR;
}
// 组合16位有符号整数(小端)
raw_temp = (int16_t)((temp_data[1] << 8) | temp_data[0]);
// 转换为摄氏度:温度(°C) = raw_temp / 256 + 25
*temperature = (raw_temp / 256.0f) + 25.0f;
return HAL_OK;
}四:串口接收数据如下所示:
使用注意事项:
启动时间:传感器上电后,需要等待约 20毫秒 的启动时间来加载修整参数,之后才能进行配置和读取。
单次模式触发:在单次模式下,每次读取完成后,传感器会自动进入空闲模式。如需再次读取,需重新配置 MD[1:0] 位为 01 来触发下一次采样。
磁场动态范围:在轴向对齐的情况下,动态范围为±50高斯;在交叉轴方向存在杂散场时,范围会降低到±25高斯。
我要赚赏金
