初级会员

- 积分
- 66
- 金钱
- 66
- 注册时间
- 2016-3-29
- 在线时间
- 6 小时
|
5金钱
小弟最近花了一块使用STM32F103采集MPU9150数据的小板子,使用@正点原子 IIC的历程改的,现在什么都调试通了,可是采集AK8975C磁力计,三轴的磁力值一直是固定值0xFFFF,不知道叫能否提供一下经验,万分感谢。
网上常见的问题我已经规避了:
1: 开启9150旁路模式:
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X02);//开启passby模式
2:每次采集8975数据之后,配置8975为从测量模式
H=(Single_ReadI2C(MAGADD,REG_Address));
Single_WriteI2C(MAGADD,CNTL, 0x01);//此处非常关键,
//因为日本公司的数据手册上说,在单次测量模式下,每读取一次,
//会自动回归power down mode ,所以这里重新设置为单次测量模式
L=Single_ReadI2C(MAGADD,REG_Address-1);
Single_WriteI2C(MAGADD,CNTL, 0x01);
不知道还需要注意哪些问题。
附上源程序
[mw_shl_code=applescript,true]//****************************************
//定义类型及变量
//****************************************
u8 dis[6]; //显示数字(-511至512)的字符数组
int dis_data; //变量
//****************************************
//函数声明
//****************************************
//MPU9150操作函数
void InitMPU6050(); //初始化MPU9150
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address); //读取I2C数据
void Single_WriteI2C(u8 Slave_Address,u8 REG_Address,u8 REG_data); //向I2C写入数据
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(u8 Slave_Address,u8 REG_Address,u8 REG_data)
{
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address); //发送设备地址+写信号
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
//return 1;
}
IIC_Send_Byte(REG_Address);//内部寄存器地址,
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(REG_data); //内部寄存器数据,
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
//return 1;
}
IIC_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address)
{
u8 REG_data;
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address); //发送设备地址+写信号
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(REG_Address); //发送存储单元地址,从0开始
IIC_Wait_Ack(); //等待应答
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address + 1); //发送设备地址+读信号
IIC_Wait_Ack(); //等待应答
REG_data=IIC_Read_Byte(1); //读出寄存器数据
// IIC_NAck();
IIC_Stop(); //停止信号
return REG_data;
}
//**************************************
//合成数据
//**************************************
short GetData(u8 REG_Address)
{
u8 H,L;
H=(Single_ReadI2C(MAGADD,REG_Address));
Single_WriteI2C(MAGADD,CNTL, 0x01);//此处非常关键,
//因为日本公司的数据手册上说,在单次测量模式下,每读取一次,
//会自动回归power down mode ,所以这里重新设置为单次测量模式
L=Single_ReadI2C(MAGADD,REG_Address-1);
Single_WriteI2C(MAGADD,CNTL, 0x01);
return (H<<8)+L; //合成数据
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
IIC_Init();//初始化IIC总线
delay_ms(100);
InitMPU6050(); //初始化MPU6050
delay_us(100);
TIM3_Int_Init(20-1,720-1);//72M/720=100000的计数频率,100000/20=5KHz
while(1)
{
if(ServoRegs.Timer_500 == 1)
{
ServoRegs.Timer_500 = 0;
//----2Hz计数----
if(ServoRegs.Timer_2 >= 250)
{
//==2Hz执行程序
ServoRegs.Timer_2 = 0;
H3=!H3;
}
else
{
ServoRegs.Timer_2++;
}
//===2Hz END====
//----100Hz计数----
if(ServoRegs.Timer_100 >= 10)
{
//==100Hz执行程序
ServoRegs.Timer_100 = 0;
ServoRegs.MUP6050.magx = GetData(HXH);
ServoRegs.MUP6050.magy = GetData(HYH);
ServoRegs.MUP6050.magz = GetData(HZH);
MPU_Get_Gyroscope(&ServoRegs.MUP6050.gyrox,&ServoRegs.MUP6050.gyroy,&ServoRegs.MUP6050.gyroz); //得到陀螺仪数据
delay_us(100);
}
else
{
ServoRegs.Timer_100++;
}
//===100Hz END====
}
}
}[/mw_shl_code]
请大神们指点
|
最佳答案
查看完整内容[请看2#楼]
问题已经解决了,现在的问题是磁力计有数,但是陀螺和加速度只有X轴有数了,剩下的就是慢慢找bug了,等调试通了,如果有时间,分享一下给大家
|