求教 MPU6050的问题
入手一MPU6050模块好久,今天准备测试一下,程序烧进出,数据出来全是0;应该不是模块的问题,所以把程序贴出来,让大家看看那有问题。
iic.c
#include"sys.h"
#include"iic.h"
#include"delay.h"
void IIC_Init(void)
{
RCC->APB2ENR|=1<<2; //利用PA4和PA5模拟IIC ,PA4为SDA,PA5为SCL
GPIOA->CRL&=0XFF00FFFF;
GPIOA->CRL|=0X00330000;
GPIOA->ODR|=3<<4; //上拉,输出为高
}
/************IIC start or stop ***************/
//开始信号:在SCL为高电平的时候,SDA由高电平向低电平跳变,开始传送数据;
//结束信号:在SCL为高电平的是后,SDA由低电平向高电平跳变,结束传送数据;
// 应答信号:接收数据的IC在接收到8bit后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,
//等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传输数据的判断
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(5);
IIC_SDA=0;
delay_us(5);
IIC_SCL=0;
}
//IIC stop signal
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(5);
IIC_SCL=1;
IIC_SDA=1;//send the IIC stop signal
delay_us(5);
}
//waiting for ACK signal
//back: 1:fail
// 0:seccuss
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;
delay_us(1);
IIC_SCL=1;
delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
//产生应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACk应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答,0,无应答
void IIC_Send_Byte(unsigned char txd)
{
unsigned char t;
SDA_OUT();
IIC_SCL=0; //拉低时钟开始传输数据
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(5);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
delay_us(5);
}
}
//读一个字节,ack=1时,发送ACK,ack=0,发送NAck
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//数据线设置为输入
for(i=0;i<8;i++)
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if(!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
mpu.c
#include"sys.h"
#include"delay.h"
#include"mpu.h"
#include"iic.h"
//*****************************
//在MPU指定地址读出数据
//**************************************
u8 MPU6050_ReadOneByte(unsigned char REG_Address)
{
unsigned char REG_data;
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); //发送存储单元地址,从0开始
IIC_Wait_Ack();
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress+1);//发送设备地址+读信号
IIC_Wait_Ack();
REG_data=IIC_Read_Byte(0); //读出寄存器数据
//IIC_Wait_Ack();
//I2C_SendACK(1); //接收应答信号
delay_us(2);
IIC_Stop(); //停止信号
return REG_data;
}
//**************************************
//在MPU6050指定地址写入一个字节数据
//**************************************
void MPU6050_WriteOneByte(unsigned char REG_Address,unsigned char REG_data)
{
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); //内部寄存器地址,
IIC_Wait_Ack();
IIC_Send_Byte(REG_data); //内部寄存器数据,
IIC_Wait_Ack();
IIC_Stop(); //发送停止信号
}
//**************************************
//初始化MPU6050
//**************************************
void MPU6050_Init(void)
{
MPU6050_WriteOneByte(PWR_MGMT_1, 0x00); //解除休眠状态
MPU6050_WriteOneByte(SMPLRT_DIV, 0x07);
MPU6050_WriteOneByte(CONFIG, 0x06);
MPU6050_WriteOneByte(GYRO_CONFIG, 0x18);
MPU6050_WriteOneByte(ACCEL_CONFIG, 0x01);
}
u16 GetData(unsigned char REG_Address)
{
unsigned char H,L;
H=MPU6050_ReadOneByte(REG_Address);
L=MPU6050_ReadOneByte(REG_Address+1);
return (H<<8)+L; //合成数据
}
//**************************************
//显示温度
//**************************************
//void display_temp()
//{
// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度
// Temperature=Temp_h<<8|Temp_l; //合成温度
// Temperature = 35+ ((double) (Temperature + 13200)) / 280; // 计算出温度
// lcd_printf(dis,Temperature); //转换数据显示
// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数
//}
mpu.h
#ifndef _MPU_H
#define _MPU_H
//****************************************
// 定义MPU6050内部地址
//****************************************
#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x68 //IIC地址寄存器(默认数值0x68,只读)
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
u8 MPU6050_ReadOneByte(unsigned char REG_Address);
void MPU6050_WriteOneByte(unsigned char REG_Address,unsigned char REG_data);
void MPU6050_Init(void);
u16 GetData(unsigned char REG_Address);
#endif
main.c
#include<stm32f10x_lib.h>
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"mpu.h"
#include"led.h"
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LED_Init();
MPU6050_Init();
delay_ms(100);
while(1)
{
printf("XSpeed is %d\n\n",GetData(ACCEL_XOUT_H)); //显示X轴加速度
printf("YSpeed is %d\n\n",GetData(ACCEL_YOUT_H)); //显示Y轴加速度
printf("ZSpeed is %d\n\n",GetData(ACCEL_ZOUT_H)); //显示Z轴加速度
printf("XCSpeed is %d\n\n",GetData(GYRO_XOUT_H)); //显示X轴加速度
printf("YCSpeed is %d\n\n",GetData(GYRO_YOUT_H)); //显示Y轴加速度
printf("ZCSpeed is %d\n\n",GetData(GYRO_ZOUT_H)); //显示Z轴加速度
LED0=!LED0;
LED1=!LED1;
delay_ms(10000);
delay_ms(10000);
}
}
谢谢!
IIC没初始化? 楼主的程序应该不是自己写的。。。
那么,应该是硬件电路问题,仔细看那个电路上是不是连别的元件了(尤其是用开发板的时候)。。。。
还有晶振频率,串口速率。。。 goodjob2 发表于 2013-1-25 21:39 static/image/common/back.gif
IIC没初始化?
谢谢大哥呀,我今天都无语了,其实一开始程序就是对的,就是你说的没有把那个IIC_Init()放到主函数。无语了,没脸在江湖上混了。
谢谢! xiaoha_abc 发表于 2013-1-25 22:11 static/image/common/back.gif
楼主的程序应该不是自己写的。。。
那么,应该是硬件电路问题,仔细看那个电路上是不是连别的元件了(尤其 ...
谢谢!这个程序i是自己写的。主要是淘宝给的程序太次了,客服态度很恶劣,
就是就自己写了,但是搞忘IIC_Init();搞忘初始化了,阴沟里翻船了。无语
谢谢 浪溢泽沉 发表于 2013-1-25 22:50 static/image/common/back.gif
谢谢大哥呀,我今天都无语了,其实一开始程序就是对的,就是你说的没有把那个IIC_Init()放到主函数。无语 ...
呵呵,我正好也是买了个一样的模块,这段时间在调试。这个不带磁阻传感器,还是不好用 楼主,数据从来从哪里看?在lcd上面吗? 帮顶,引脚配置成漏级开路{:smile:} 这显示的结果是什么啊?我的也一直是0.。。。。 ljc2012 发表于 2013-5-7 15:00 static/image/common/back.gif
这显示的结果是什么啊?我的也一直是0.。。。。
想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下 lianyu125 发表于 2013-5-12 10:13 static/image/common/back.gif
想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下 ...
还没有弄出来,惭愧啊。。。 ljc2012 发表于 2013-5-12 12:01 static/image/common/back.gif
还没有弄出来,惭愧啊。。。
楼主用的是什么芯片啊,我是往430上移植出现了问题 lianyu125 发表于 2013-5-12 18:33 static/image/common/back.gif
楼主用的是什么芯片啊,我是往430上移植出现了问题
我也是高的430 但那个I2C写的有问题,总是停在那个应答信号的那个循环里。。 ljc2012 发表于 2013-5-13 15:12 static/image/common/back.gif
我也是高的430 但那个I2C写的有问题,总是停在那个应答信号的那个循环里。。 ...
楼主是哪的啊 lianyu125 发表于 2013-5-13 22:38 static/image/common/back.gif
楼主是哪的啊
武纺的!!你呢? ljc2012 发表于 2013-5-14 20:21 static/image/common/back.gif
武纺的!!你呢?
山东 lianyu125 发表于 2013-5-12 18:33 static/image/common/back.gif
楼主用的是什么芯片啊,我是往430上移植出现了问题
你的430弄好了没我正好也要弄 驱动MPU6050 lianyu125 发表于 2013-7-7 22:34 static/image/common/back.gif
驱动MPU6050
驱动mpu6050吗? 孤单片机器人 发表于 2013-6-29 11:09 static/image/common/back.gif
你的430弄好了没我正好也要弄
驱动MPU6050吗? 楼主能给份程序吗,我现在怎么也调不通!!!1194482698@qq.com lianyu125 发表于 2013-7-7 22:35 static/image/common/back.gif
驱动MPU6050吗?
对啊就是他 mazhenyu 发表于 2013-7-10 22:54 static/image/common/back.gif
楼主能给份程序吗,我现在怎么也调不通!!!
哦,我那个硬盘丢了,但是这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一些就行了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你…… yh1036164041 发表于 2013-4-22 20:36 static/image/common/back.gif
楼主,数据从来从哪里看?在lcd上面吗?
什么数据呀,MPU6050 ?都有PDF的。哦,你是不是说测量出来的数据的呀,随便怎么都能看到呀,你可以用串口,也可以在LCD上显示,都可以…… ljc2012 发表于 2013-5-7 15:00 static/image/common/back.gif
这显示的结果是什么啊?我的也一直是0.。。。。
这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一下,出来的数据应该就对了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你…… lianyu125 发表于 2013-5-12 10:13 static/image/common/back.gif
想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下 ...
这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一下就OK了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你…… goodjob2 发表于 2013-1-25 23:48 static/image/common/back.gif
呵呵,我正好也是买了个一样的模块,这段时间在调试。这个不带磁阻传感器,还是不好用 ...
那你现在换芯片了吗?
谢谢,我刚调通了 mark....
顶一个...{:lol:} mazhenyu 发表于 2013-7-10 22:54 static/image/common/back.gif
楼主能给份程序吗,我现在怎么也调不通!!!
我这有51控制的程序,你要吗 lianyu125 发表于 2013-8-19 17:48 static/image/common/back.gif
我这有51控制的程序,你要吗
已调通,谢谢 lianyu125 发表于 2013-8-19 17:48 static/image/common/back.gif
我这有51控制的程序,你要吗
有51的程序么,发我一份或者发个帖呗,谢了 IIC搞得好蛋疼~ njlzzdh 发表于 2013-9-1 21:31 static/image/common/back.gif
有51的程序么,发我一份或者发个帖呗,谢了
里面有源程序 请问我的读出来的数据一直是65535怎么回事?? 最有可能是的地址不对,或者IIC出问题,通讯不了 {:lol:}又是搞电赛的一堆 mazhenyu 发表于 2013-7-17 22:39
谢谢,我刚调通了
请问楼主是延时有问题还是,当时是怎么调通的呢?谢谢了
页:
[1]