搜索
bottom↓
回复: 18

关于MPU6050调试

[复制链接]

出0入0汤圆

发表于 2012-10-24 21:03:54 | 显示全部楼层 |阅读模式
最近调试MPU6050,用mega16的TWI进行通信,将输出通过串口输出查看,但输出数据全0,MPU6050似乎没有工作,无从查起,哪位大侠有调试通过的程序?

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2012-10-26 14:27:07 | 显示全部楼层
我调了几天也没有反应,好像其他人也有这样的问题,请大侠们指点。
#include <iom16v.h>
#include <macros.h>
//I2C 状态定义
//MT 主方式传输 MR 主方式接受
#define START                        0x08
#define RE_START                0x10
#define MT_SLA_ACK                0x18
#define MT_SLA_NOACK         0x20
#define MT_DATA_ACK                0x28
#define MT_DATA_NOACK        0x30
#define MR_SLA_ACK                0x40
#define MR_SLA_NOACK        0x48
#define MR_DATA_ACK                0x50
#define MR_DATA_NOACK        0x58               

#define RD_DEVICE_ADDR 0xD1   //
#define WD_DEVICE_ADDR 0xD0

//常用TWI操作(主模式写和读)
#define Start()                        (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))                //启动I2C
#define Stop()                        (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))                //停止I2C
#define Wait()                        {while(!(TWCR&(1<<TWINT)));}                                //等待中断发生
#define TestAck()                (TWSR&0xf8)                                                                        //观察返回状态
#define SetAck                        (TWCR|=(1<<TWEA))                                                        //做出ACK应答
#define SetNoAck                (TWCR&=~(1<<TWEA))                                                        //做出Not Ack应答
#define Twi()                        (TWCR=(1<<TWINT)|(1<<TWEN))                                    //启动I2C
#define Write8Bit(x)                         {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}                //写数据到TWDR

unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress);
unsigned char I2C_Read(unsigned RegAddress);

/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
{
       
          Start();                                                //I2C启动
          Wait();
          if(TestAck()!=START)
                return 1;                                        //ACK
          
          Write8Bit(WD_DEVICE_ADDR);        //写I2C从器件地址和写方式
          Wait();
          if(TestAck()!=MT_SLA_ACK)
                return 1;                                        //ACK
          
          Write8Bit(RegAddress);                //写器件相应寄存器地址
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                    //ACK
          
          Write8Bit(Wdata);                                 //写数据到器件相应寄存器
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                    //ACK       
          
          Stop();                                                  //I2C停止
          delay_nms(10);                                //延时
          return 0;
}

/*********************************************
I2C总线读一个字节
返回0:读成功
返回1:读失败
**********************************************/

unsigned char I2C_Read(unsigned RegAddress)

{
           unsigned char temp;
           Start();//I2C启动
           Wait();
           if (TestAck()!=START)
                     return 1;                                         //ACK          
          
           Write8Bit(WD_DEVICE_ADDR);        //写I2C从器件地址和写方式
           Wait();
           if (TestAck()!=MT_SLA_ACK)
                     return 1;                                    //ACK
          
           Write8Bit(RegAddress);                //写器件相应寄存器地址
           Wait();
           if (TestAck()!=MT_DATA_ACK)
                     return 1;
          
           Start();                                                      //I2C重新启动
           Wait();
           if (TestAck()!=RE_START)  
                     return 1;
          
           Write8Bit(RD_DEVICE_ADDR);        //写I2C从器件地址和读方式
           Wait();
           if(TestAck()!=MR_SLA_ACK)  
                     return 1;                                   //ACK
          
           Twi();                                            //启动主I2C读方式
           Wait();
           if(TestAck()!=MR_DATA_NOACK)
                    return 1;                                        //ACK       
          
           temp=TWDR;//读取I2C接收数据
       Stop();//I2C停止
           return temp;
      }

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x03; //m103 output only内部上拉
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//TWI initialize
// bit rate:15
void twi_init(void)
{
TWCR= 0X00; //disable twi
TWBR= 0x0F; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= 0x44; //enable twi
}
          
       
       
       


出0入0汤圆

发表于 2013-1-23 18:20:28 | 显示全部楼层
laoguren 发表于 2012-10-26 14:27
我调了几天也没有反应,好像其他人也有这样的问题,请大侠们指点。
#include
#include

楼主调出来了么,最近也要做avr和mpu6050通讯,可以交流一下么

出0入0汤圆

发表于 2013-4-19 08:45:53 | 显示全部楼层
注意寄存器
SINGLE_Write(MPU6050_WRITE_ADDR,PWR_MGMT_1, 0x00);                        //取消休眠,正常工作

出0入0汤圆

发表于 2013-4-19 08:46:34 | 显示全部楼层

这是我的初始化:
      SINGLE_Write(MPU6050_WRITE_ADDR,PWR_MGMT_1, 0x80);                        //复位
        DELAY_Xms(400);
        SINGLE_Write(MPU6050_WRITE_ADDR,PWR_MGMT_1, 0x00);                        //取消休眠,正常工作
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,SMPLRT_DIV, 0x07);                        //采样速率为
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,CONFIG, 0x06);
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,GYRO_CONFIG, 0x08);                        //陀螺仪检测范围500度/秒
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,ACCEL_CONFIG,0x08);                  //加速器检测范围4G
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,FIFO_EN,  0xF8);                            //有效数据产生中断
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,INT_PIN_CFG, 0xe0);
        DELAY_Xms(10);
        SINGLE_Write(MPU6050_WRITE_ADDR,INT_EN,  0x11);                            //有效数据产生中断
        DELAY_Xms(10);

出0入0汤圆

发表于 2013-4-19 09:55:05 | 显示全部楼层
楼主调出来了吗,分享下啊

出0入0汤圆

发表于 2013-6-25 19:08:11 | 显示全部楼层
友情帮顶,最近也在搞,出不来

出0入0汤圆

发表于 2013-6-25 23:20:32 来自手机 | 显示全部楼层
开机上电要等6050内部初始化完成才能写iic

出0入0汤圆

发表于 2013-8-9 17:01:11 | 显示全部楼层
楼主调试出来了吗,,,分享一下呗

出0入0汤圆

 楼主| 发表于 2013-8-13 14:57:45 | 显示全部楼层
问题解决,原来是I2C初始化后,需要等待一段时间再初始化6050,不然会初始化失败的

出0入0汤圆

发表于 2013-8-29 12:46:31 | 显示全部楼层
楼主,为什么我用mega128硬件的twi不能读出数据来呢?

出0入0汤圆

发表于 2013-8-29 12:47:38 | 显示全部楼层
用示波器看了一下,有波形,但是一加上6050那个波形就有点儿变化。。。。好大疑问

出0入0汤圆

发表于 2013-9-15 16:20:29 | 显示全部楼层
关注……

出0入0汤圆

发表于 2014-1-14 10:47:43 | 显示全部楼层
原因未知

出0入0汤圆

发表于 2014-1-15 14:34:12 | 显示全部楼层
嘿嘿 是挺复杂的

出0入0汤圆

发表于 2014-5-26 22:40:25 | 显示全部楼层
laoguren 发表于 2012-10-26 14:27
我调了几天也没有反应,好像其他人也有这样的问题,请大侠们指点。
#include
#include

lz,我用了你的程序读6050,没反应,我用的是11.0592M的晶振,跟晶振频率有关系吗

出0入0汤圆

发表于 2014-6-22 22:23:01 | 显示全部楼层
laoguren 发表于 2013-8-13 14:57
问题解决,原来是I2C初始化后,需要等待一段时间再初始化6050,不然会初始化失败的 ...

楼主  你延了多长时间啊

出0入0汤圆

发表于 2014-6-25 14:56:45 | 显示全部楼层
laoguren 发表于 2013-8-13 14:57
问题解决,原来是I2C初始化后,需要等待一段时间再初始化6050,不然会初始化失败的 ...

请问一下,我的6050数据读出来不变是怎么回事啊。

出0入0汤圆

发表于 2014-8-24 14:08:52 | 显示全部楼层
CandD 发表于 2014-6-25 14:56
请问一下,我的6050数据读出来不变是怎么回事啊。

你的读出来不变是一直停在多少?首先检查一下SDA和SCL的管脚是否正确,其次看一下你运行程序时是否正常,主函数里面有没有调用你的初始化函数~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 09:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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