OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11633|回复: 22

MPU6050使用问题

[复制链接]

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-8-23 23:05:13 | 显示全部楼层 |阅读模式
5金钱

最近在折腾MPU6050模块,买的是网上那个串口输出数据的模块。但我想通过IIC去读取原始的数据。
       我的IIC是直接利用读取EEPROM的模拟IIC,在EEPROM上是可以进行通信的,但是我在读取MPU6050的寄存器的时候就不好使。我想通过读取WHO AM I 寄存器的值去判定我通信是否有问题,但是就是读取不了。这里面应该就是初始化SDA和SCL的引脚后就应该能够读取内部寄存器的值吧,不需要做别的设置了吧?知道的大神帮忙解答下,折腾很久了,我想知道到底是我的思路问题还是模块的问题,因为我没有模块的原理图。这种硬件都不公开的模块就是个大坑,以后不能买。
下面是我的代码:(战舰版上运行)
[mw_shl_code=c,true]MPU6050_DEVICE_ADDR 定义成0xd0 和0xd2都试过了[/mw_shl_code]

[mw_shl_code=c,true]#define MPU6050_DEVICE_ADDR 0x68 #define SDA_IN() {GPIOE->CRL&=0XFFFFF0FF;GPIOE->CRL|=0X0000000;}//PE.2为浮空输入,设成上拉就不行 #define SDA_OUT() {GPIOE->CRL&=0XFFFFF0FF;GPIOE->CRL|=0X00000300;} //PE.2推挽输出 #define IIC_SDA PEout(2) #define IIC_SCL PEout(3) #define READ_SDA PEin(2) //IIC引脚初始化 void I2C_Pin_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC->APB2ENR|=1<<6;////开GPIOE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE, GPIO_Pin_2|GPIO_Pin_3); // RCC->APB2ENR|=1<<3;//开GPIOB时钟 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_SetBits(GPIOB, GPIO_Pin_10|GPIO_Pin_11); IIC_SDA=1; IIC_SCL=1; } //主机开始信号 void Master_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 } //主机给出停止信号 void Master_Stop() { SDA_OUT();//sda线输出 IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号 delay_us(4); } //主机给从机应答信号 void Master_SendAck() { IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //主机给从机非应答信号 void Master_SendNack() { IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //主机检查从机发来的应答信号 u8 Master_CheckAck() { u8 ucErrTime=0; SDA_IN(); //SDA设置为输入 IIC_SDA=1;delay_us(1); //SDA_IN(); //SDA设置为输入 IIC_SCL=1;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { Master_Stop(); // return 1; } } IIC_SCL=0;//时钟输出0 return 0; } //主机往IIC总线传送一字节数据 void Master_W_byte(u8 dat) { u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { IIC_SDA=(dat&0x80)>>7; dat<<=1; delay_us(2); //对TEA5767这三个延时都是必须的 IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2); } } //主机从IIC总线接收一字节数据 u8 Master_R_byte(void) { unsigned char i,receive=0; SDA_IN();//SDA设置为输入 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();//发送nACK // else // IIC_Ack(); //发送ACK return receive; } /******************************************************************************* ** 功能描述:主机通过I2C总线从MPU6050中的具体地址读取一个字节的数据 ** 输 入:Reg_Addr:MPU6050中的具体要读取数据的地址 ** 返 回:读取的一个字节数据 *-----------------------------------------------------------------------------*/ u8 Master_R_Onebyte(u8 Reg_Addr) { u8 data; Master_Start(); Master_W_byte(MPU6050_DEVICE_ADDR); Master_CheckAck(); Master_W_byte(Reg_Addr); Master_CheckAck(); Master_Start(); Master_W_byte(MPU6050_DEVICE_ADDR+1); Master_CheckAck(); data=Master_R_byte(); Master_SendNack(); Master_Stop(); return data; } /******************************************************************************* ** 功能描述:检查MPU6050是否连上 ** 说 明:读取WHO_AM_I寄存器,看值是否为0x68 ** 返 回:0表示检查到了MPU6050,1表示没有检查到MPU6050 *-----------------------------------------------------------------------------*/ u8 MPU6050_Check() { u8 temp=2; temp=Master_R_Onebyte(WHO_AM_I); //读取WHO_AM_I寄存器的值 if(temp==0x68)return 0; else return 1; } //这段是main,c文件中 while(MPU6050_Check())//检测不到MPU6050 { LCD_ShowString(60,150,200,16,16,"MPU6050 Check Failed!",0); delay_ms(500); LCD_ShowString(60,150,200,16,16,"Please Check! ",0); delay_ms(500); LED0=!LED0;//DS0闪烁 } LCD_ShowString(60,150,200,16,16,"MPU6050 Ready!",0); [/mw_shl_code]



最佳答案

查看完整内容[请看2#楼]

回复【2楼】非常完美: --------------------------------- 在线等了一天没有等到你上线    但我最终还是读出来了   换了我以前自己写的IIC代码  之后更改了一下    真心是搞了我好几天啊   功夫不负有心人啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-23 23:05:14 | 显示全部楼层
回复【2楼】非常完美:
---------------------------------
在线等了一天没有等到你上线    但我最终还是读出来了   换了我以前自己写的IIC代码  之后更改了一下    真心是搞了我好几天啊   功夫不负有心人啊
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-8-24 12:24:07 | 显示全部楼层
比较简单,你是哪里不懂,我或许可以帮助你
愈挫愈勇
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-24 15:30:35 | 显示全部楼层
回复【2楼】非常完美:
---------------------------------
大神  帮我看下是咋回事  我将代码贴出来了   现在问题就在上面红色的部分  读取不到
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-24 18:55:34 | 显示全部楼层
回复【4楼】jiaozhu:
---------------------------------
大神能不能把成功后的源码贴一下啊!我最近也在度MPU6050!
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-8-24 19:40:57 | 显示全部楼层
回复【4楼】jiaozhu:
---------------------------------
回复【4楼】jiaozhu:
---------------------------------
恩恩,IIC用自己的就行,原子哥的IIC协议也可以。
愈挫愈勇
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-24 19:42:59 | 显示全部楼层
回复【5楼】MDK很难学:
---------------------------------
我那还拿不出手   我才读到一个寄存器的值   验证了下我的IIC可行性
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-24 19:43:55 | 显示全部楼层
回复【6楼】非常完美:
---------------------------------
恩    完全用24c02的代码有时候会出问题
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-24 21:40:36 | 显示全部楼层
回复【7楼】jiaozhu:
---------------------------------
哦,我最后实在受不了了,还是用硬件IIC来获取数据,用LED灯来指示成功与否。再加上我有jtag线,所以也能够单步调试。因为我在买mpu6050模块之前就把IIC读取的程序写好了,JTAG与LED验证都好使。不想在尝试模拟iic了
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-25 10:25:46 | 显示全部楼层
回复【9楼】MDK很难学:
---------------------------------
那你很厉害啊  吧硬件IIC搞出来了
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-25 13:41:59 | 显示全部楼层
回复【10楼】jiaozhu:
---------------------------------
不是啊!我感觉硬件更简单的,就是利用库函数那些,因为STM32的PB6、7两个引脚是专门用于IIC通信的。只是现在因为把PB这两个引脚用于IIC了,导致不能使用LCD显示,只能使用JTAG来逐步调试!
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-25 14:10:05 | 显示全部楼层
回复【11楼】MDK很难学:
---------------------------------
不是很多人说STM的硬件IIC不好用的    那还是模拟的方便啊  引脚没那么多限制
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-25 18:05:12 | 显示全部楼层
回复【12楼】jiaozhu:
---------------------------------
这个是有可能的,因为我就是因为IIC的引脚和LCD都使用PB脚,愁死我
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-25 20:05:18 | 显示全部楼层
回复【13楼】MDK很难学:
---------------------------------
那你换成模拟的呗
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-8-29 12:43:28 | 显示全部楼层
回复【9楼】MDK很难学:
---------------------------------
硬件的经常出错,莫名的出错
愈挫愈勇
回复

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2013-9-19
在线时间
16 小时
发表于 2014-8-29 22:14:12 | 显示全部楼层
回复【4楼】jiaozhu:
---------------------------------
哥们 能看看你的程序吧  我 qq 1441576392  我搞一天了 也蛋疼无比
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-8-30 08:37:51 | 显示全部楼层
回复【16楼】零:
---------------------------------
一天不算啥   你先把你的IIC搞通  实在不行的时候加我  251697765
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-16
在线时间
2 小时
发表于 2015-3-2 11:42:51 | 显示全部楼层
都搞出来了么
回复

使用道具 举报

6

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2014-10-6
在线时间
38 小时
发表于 2015-4-9 22:07:42 | 显示全部楼层
这是我通过串口打印出来的数据,怎么会有负数?你知道吗?

回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-7-22 15:46:44 | 显示全部楼层
请问怎么把mpu6050的数据,电脑把他读出来,数据怎么分析啊?
回复

使用道具 举报

4

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
741
金钱
741
注册时间
2015-5-9
在线时间
236 小时
发表于 2015-8-8 20:54:58 | 显示全部楼层
回复【14楼】jiaozhu:
---------------------------------
楼主,我最近也在用6050,已经可以读出数据,但是我尝试了下把加速度量产呢过设置为+—8g的,刚烧入程序后是正常的,但是关机再打开,读书就变了,比如测重力加速度为4g,,如果重新烧入就又好了,好烦恼啊。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-9-23 08:42:07 | 显示全部楼层
回复【20楼】序缘2号:
---------------------------------
回复【21楼】龙云先生:
---------------------------------
还没用过模拟I2C呢,硬件用了没发现BUG问题
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2014-12-18
在线时间
6 小时
发表于 2015-11-4 14:57:24 | 显示全部楼层
while(1)
{

      MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
    MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 

LCD_ShowNum(0,0,aacx,4,16);

LCD_ShowNum(0,20,aacy,4,16);     
  
LCD_ShowNum(0,40,aacz,4,16);     

LED1=!LED1;//LED闪烁
delay_ms(300);
}

请教为什么我的数据与MPU6050移动不更新的?@正点原子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表