浪溢泽沉 发表于 2013-1-25 21:12:08

求教 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);
        }
}

谢谢!


goodjob2 发表于 2013-1-25 21:39:09

IIC没初始化?

xiaoha_abc 发表于 2013-1-25 22:11:07

楼主的程序应该不是自己写的。。。
那么,应该是硬件电路问题,仔细看那个电路上是不是连别的元件了(尤其是用开发板的时候)。。。。
还有晶振频率,串口速率。。。

浪溢泽沉 发表于 2013-1-25 22:50:21

goodjob2 发表于 2013-1-25 21:39 static/image/common/back.gif
IIC没初始化?

谢谢大哥呀,我今天都无语了,其实一开始程序就是对的,就是你说的没有把那个IIC_Init()放到主函数。无语了,没脸在江湖上混了。
谢谢!

浪溢泽沉 发表于 2013-1-25 22:53:02

xiaoha_abc 发表于 2013-1-25 22:11 static/image/common/back.gif
楼主的程序应该不是自己写的。。。
那么,应该是硬件电路问题,仔细看那个电路上是不是连别的元件了(尤其 ...

谢谢!这个程序i是自己写的。主要是淘宝给的程序太次了,客服态度很恶劣,
就是就自己写了,但是搞忘IIC_Init();搞忘初始化了,阴沟里翻船了。无语
谢谢

goodjob2 发表于 2013-1-25 23:48:08

浪溢泽沉 发表于 2013-1-25 22:50 static/image/common/back.gif
谢谢大哥呀,我今天都无语了,其实一开始程序就是对的,就是你说的没有把那个IIC_Init()放到主函数。无语 ...

呵呵,我正好也是买了个一样的模块,这段时间在调试。这个不带磁阻传感器,还是不好用

yh1036164041 发表于 2013-4-22 20:36:49

楼主,数据从来从哪里看?在lcd上面吗?

孤独飞行 发表于 2013-4-23 14:06:34

帮顶,引脚配置成漏级开路{:smile:}

ljc2012 发表于 2013-5-7 15:00:16

这显示的结果是什么啊?我的也一直是0.。。。。

lianyu125 发表于 2013-5-12 10:13:31

ljc2012 发表于 2013-5-7 15:00 static/image/common/back.gif
这显示的结果是什么啊?我的也一直是0.。。。。

想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下

ljc2012 发表于 2013-5-12 12:01:22

lianyu125 发表于 2013-5-12 10:13 static/image/common/back.gif
想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下 ...

还没有弄出来,惭愧啊。。。

lianyu125 发表于 2013-5-12 18:33:47

ljc2012 发表于 2013-5-12 12:01 static/image/common/back.gif
还没有弄出来,惭愧啊。。。

楼主用的是什么芯片啊,我是往430上移植出现了问题

ljc2012 发表于 2013-5-13 15:12:21

lianyu125 发表于 2013-5-12 18:33 static/image/common/back.gif
楼主用的是什么芯片啊,我是往430上移植出现了问题

我也是高的430 但那个I2C写的有问题,总是停在那个应答信号的那个循环里。。

lianyu125 发表于 2013-5-13 22:38:25

ljc2012 发表于 2013-5-13 15:12 static/image/common/back.gif
我也是高的430 但那个I2C写的有问题,总是停在那个应答信号的那个循环里。。 ...

楼主是哪的啊

ljc2012 发表于 2013-5-14 20:21:37

lianyu125 发表于 2013-5-13 22:38 static/image/common/back.gif
楼主是哪的啊

武纺的!!你呢?

lianyu125 发表于 2013-5-14 22:52:34

ljc2012 发表于 2013-5-14 20:21 static/image/common/back.gif
武纺的!!你呢?

山东                           

孤单片机器人 发表于 2013-6-29 11:09:05

lianyu125 发表于 2013-5-12 18:33 static/image/common/back.gif
楼主用的是什么芯片啊,我是往430上移植出现了问题

你的430弄好了没我正好也要弄

lianyu125 发表于 2013-7-7 22:34:29

驱动MPU6050

lianyu125 发表于 2013-7-7 22:34:59

lianyu125 发表于 2013-7-7 22:34 static/image/common/back.gif
驱动MPU6050

驱动mpu6050吗?

lianyu125 发表于 2013-7-7 22:35:30

孤单片机器人 发表于 2013-6-29 11:09 static/image/common/back.gif
你的430弄好了没我正好也要弄

驱动MPU6050吗?

mazhenyu 发表于 2013-7-10 22:54:45

楼主能给份程序吗,我现在怎么也调不通!!!1194482698@qq.com

孤单片机器人 发表于 2013-7-11 14:33:28

lianyu125 发表于 2013-7-7 22:35 static/image/common/back.gif
驱动MPU6050吗?

对啊就是他

浪溢泽沉 发表于 2013-7-16 21:49:18

mazhenyu 发表于 2013-7-10 22:54 static/image/common/back.gif
楼主能给份程序吗,我现在怎么也调不通!!!

哦,我那个硬盘丢了,但是这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一些就行了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你……

浪溢泽沉 发表于 2013-7-16 21:53:02

yh1036164041 发表于 2013-4-22 20:36 static/image/common/back.gif
楼主,数据从来从哪里看?在lcd上面吗?

什么数据呀,MPU6050 ?都有PDF的。哦,你是不是说测量出来的数据的呀,随便怎么都能看到呀,你可以用串口,也可以在LCD上显示,都可以……

浪溢泽沉 发表于 2013-7-16 21:54:08

ljc2012 发表于 2013-5-7 15:00 static/image/common/back.gif
这显示的结果是什么啊?我的也一直是0.。。。。

这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一下,出来的数据应该就对了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你……

浪溢泽沉 发表于 2013-7-16 21:55:11

lianyu125 发表于 2013-5-12 10:13 static/image/common/back.gif
想问一下楼主是否调出数据了,我跟楼主遇到了同样的问题,望楼主指点小弟一下 ...

这个帖子上的程序就是对的,只不过当时比较二,没有在main()里调用写好的IIC-Init()的函数;你直接调用一下就OK了,我当时是用的STM32.还有就是注意一下IIC的各种延时和时序就行了,这个现在想起来老简单了。希望帮到你……

R2D1 发表于 2013-7-17 11:30:13

goodjob2 发表于 2013-1-25 23:48 static/image/common/back.gif
呵呵,我正好也是买了个一样的模块,这段时间在调试。这个不带磁阻传感器,还是不好用 ...

那你现在换芯片了吗?

mazhenyu 发表于 2013-7-17 22:39:48

谢谢,我刚调通了

xiefy21 发表于 2013-8-17 17:45:28

mark....
顶一个...{:lol:}

lianyu125 发表于 2013-8-19 17:48:43

mazhenyu 发表于 2013-7-10 22:54 static/image/common/back.gif
楼主能给份程序吗,我现在怎么也调不通!!!

我这有51控制的程序,你要吗

mazhenyu 发表于 2013-8-28 15:55:28

lianyu125 发表于 2013-8-19 17:48 static/image/common/back.gif
我这有51控制的程序,你要吗

已调通,谢谢

njlzzdh 发表于 2013-9-1 21:31:30

lianyu125 发表于 2013-8-19 17:48 static/image/common/back.gif
我这有51控制的程序,你要吗

有51的程序么,发我一份或者发个帖呗,谢了

蓝色の理想 发表于 2013-9-1 22:49:55

IIC搞得好蛋疼~

lianyu125 发表于 2013-9-2 08:06:00

njlzzdh 发表于 2013-9-1 21:31 static/image/common/back.gif
有51的程序么,发我一份或者发个帖呗,谢了

里面有源程序

lihuafu 发表于 2014-2-27 21:11:11

请问我的读出来的数据一直是65535怎么回事??

木君之上 发表于 2014-2-28 23:44:44

最有可能是的地址不对,或者IIC出问题,通讯不了

leehuabo 发表于 2014-8-10 16:57:41

{:lol:}又是搞电赛的一堆

yumeinian 发表于 2014-8-22 20:46:49

mazhenyu 发表于 2013-7-17 22:39
谢谢,我刚调通了

请问楼主是延时有问题还是,当时是怎么调通的呢?谢谢了
页: [1]
查看完整版本: 求教 MPU6050的问题