#LSM303D初始化
// 详细的寄存器说明请查看数据手册
#define LSM303D_SLAVE_ADDRESS 0x1E
#define LSM303D_WHO_AM_I 0x0F
#define CTRL1 0x20
#define CTRL4 0x23
#define CTRL5 0x24
#define CTRL6 0x25
#define CTRL7 0x26
#define STATUS_A 0x27
#define INT_CTRL_M 0x12
// X
#define OUT_X_L_M 0x08
#define OUT_X_H_M 0x09
// Y
#define OUT_Y_L_M 0x0A
#define OUT_Y_H_M 0x0B
// Z
#define OUT_Z_L_M 0x0C
#define OUT_Z_H_M 0x0D
void LSM303D_Init()
{
LSM303D_Write_Byte(LSM303D_SLAVE_ADDRESS, CTRL5, 0x14); // 在加计为power-down模式下时(默认情况下就是),频率100Hz
delay_us(5);
LSM303D_Write_Byte(LSM303D_SLAVE_ADDRESS, CTRL4, 0x04); // data_ready 信号
delay_us(5);
LSM303D_Write_Byte(LSM303D_SLAVE_ADDRESS, CTRL6, 0x20); // 测量范围 ±4gauss
delay_us(5);
LSM303D_Write_Byte(LSM303D_SLAVE_ADDRESS, CTRL7, 0x00); // 连续转换模式
delay_us(5);
LSM303D_Write_Byte(LSM303D_SLAVE_ADDRESS, INT_CTRL_M, 0xE1); // 中断信号为低电平
delay_us(5);
}
#数据读取
// 读取LSM303D磁力计数据
// 注意这里读取的是原始数据,是数字量,还需要转化成真实的磁力计数据
buf[0] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_X_L_M);
buf[1] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_X_H_M);
buf[2] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_Y_L_M);
buf[3] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_Y_H_M);
buf[4] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_Z_L_M);
buf[5] = MPU_Read_Byte(LSM303D_SLAVE_ADDRESS, OUT_Z_H_M)
g_magraw[0] = ((u16)buf[1]<<8)|buf[0]; // 原始X轴数据
g_magraw[1] = ((u16)buf[3]<<8)|buf[2]; // 原始Y轴数据
g_magraw[2] = ((u16)buf[5]<<8)|buf[4]; // 原始Z轴数据
// 数据转化 #SENSORS_Gause_PER_LSB_CFG (double)((2 * 8) / 65536.0)
// 这里磁力计量程设置的是±4guss,该磁力计AD是16位的,2^16=65536, 所以转化关系为: 2*4 / 65536
g_mag[0] = (double)g_magraw[1] * SENSORS_Gause_PER_LSB_CFG; // 实际X轴数据
g_mag[1] = (double)g_magraw[0] * SENSORS_Gause_PER_LSB_CFG; // 实际Y轴数据
g_mag[2] = -(double)g_magraw[2] * SENSORS_Gause_PER_LSB_CFG; // 实际Z轴数据