在学习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,′ó¶ø
A15¿éòÔ×öÆÕí¨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]
之前看寄存器还有数据存在,之后用串口打印数据就一直为零了...还有dmp初始化时加载dmp映像也是失败的 ╮(╯▽╰)╭
一周热门 更多>