mpu6050 初始化问题

2019-10-14 21:26发布

在学习mpu6050的时候出现一个问题:mpu6050初始化失败,当程序执行到res=MPU_Read_Byte(MPU_DEVICE_ID_REG); 这段程序时,得到的结果为零。

硬件上我是这么连接的,用的是stm32vbt6的芯片,mpu6050模块的SCL引脚和SDA引脚分别与PB6,PB7连接,AD0引脚和PB5连接,INT引脚与PB4连接。

用了很多种方法,比如IIC初始化后延时几百毫秒,模块放平,初始化过程禁掉所有中断,将连接mpu6050的线变短,这些方法我都试过,依然没有读出ID(依然为0),而且mpu6050模块我也换了模块,还是不行。程序我是用原子哥的mpu6050的程序(各个版本我都试过),我只是改了相应的引脚,其他的基本没动,往mpu6050写入数据到是可以,由于读出来的数是0(地址是0x68),所以我也不懂是不是IIC初始化有问题,还是其他什么问题,这个问题弄了一周依然没有解决,所以求助大家,希望能提供一个解决办法,这里谢谢大家

下面是mpu6050初始化代码
[mw_shl_code=c,true]u8 MPU_Init(void)
{
        u8 res;
//  GPIO_InitTypeDef  GPIO_InitStructure;
//       
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ê1ÄüAFIOê±Öó
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ïèê1ÄüíaéèIO PORTBê±Öó
//       
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;         // ¶Ë¿úÅäÖÃ
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //íÆíìêä3ö
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿úËù¶èÎa50MHz
//  GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //¸ù¾Yé趨2Îêy3õê¼»ˉGPIOB

//        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//½ûÖ1JTAG,′ó¶&#248A15¿éòÔ×öÆÕí¨IOê1óÃ,·ñÔòPB52»Äü×öÆÕí¨IO!!!
//       
//        MPU_AD0_CTRL=0;                        //¿ØÖÆMPU6050μÄAD0½ÅÎaμíμçƽ,′ó»úμØÖ·Îa:0X68
       
        MPU_IIC_Init();//3õê¼»ˉIIC×üÏß
        delay_ms(1000);
        printf("delay 1S ");
        res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //¸′λMPU6050
        if(res)
                printf("1 ");
  delay_ms(100);
        res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //»½DÑMPU6050
        if(res)
                printf("2 ");
        res = MPU_Set_Gyro_Fsr(3);                                        //íóÂYòÇ′«¸DÆ÷,¡à2000dps
        if(res)
                printf("3 ");
        res = MPU_Set_Accel_Fsr(0);                                        //¼óËù¶è′«¸DÆ÷,¡à2g
        if(res)
                printf("4 ");
        res = MPU_Set_Rate(50);                                                //éèÖÃ2éÑùÂê50Hz
        if(res)
                printf("5 ");
        res = MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //1رÕËùóDÖD¶Ï
        if(res)
                printf("6 ");
        MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2CÖ÷Ä£ê½1رÕ
        if(res)
                printf("7 ");
        MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //1رÕFIFO
        if(res)
                printf("8 ");
        res = MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INTòy½ÅμíμçƽóDD§
        if(res)
                printf("9 ");
        res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
        printf("res = %x ",res);
        if(res==MPU_ADDR)//Æ÷¼tIDÕyè·
        {
                res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //éèÖÃCLKSEL,PLL XÖáÎa2ο¼
                if(res)
                        printf("10 ");
                res = MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //¼óËù¶èóëíóÂYòǶ¼1¤×÷
                if(res)
                        printf("11 ");
                res = MPU_Set_Rate(50);                                                //éèÖÃ2éÑùÂêÎa50Hz
                if(res)
                        printf("12 ");
        }
        else
        {       
                printf("mpu Init faild ");
                return 1;
        }
        printf("mpu init succsse ");
        return 0;
}[/mw_shl_code]
这个是IIC初始化代码
[mw_shl_code=c,true]//初始化IIC
void MPU_IIC_Init(void)
{                                             
  GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外部IO PORTB时钟
               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;         // 配置端口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO初始速度为50MHZ
  GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIO
       
        MPU_IIC_SCL=1;
        MPU_IIC_SDA=1;                           
//  GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);                                                 //PB6,PB7 输出高电平
        printf("mpu iic init succsse! ");

}[/mw_shl_code]

io操作函数
[mw_shl_code=c,true]//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<12;}

//IO操作函数
#define MPU_IIC_SCL    PBout(6)                 //SCL
#define MPU_IIC_SDA    PBout(7)                 //SDA         
#define MPU_READ_SDA   PBin(7)                 //输出SDA [/mw_shl_code]

AD0控制
[mw_shl_code=c,true]//MPU6050 AD0控制脚
#define MPU_AD0_CTRL                        PBout(5)        //控制AD0电平,从而控制MPU地址[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。