打印
[PIC®/AVR®/dsPIC®产品]

PIC18 無法讀 MPU6050

[复制链接]
2315|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
allen87171|  楼主 | 2013-8-5 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 allen87171 于 2013-8-5 17:33 编辑

debug模式會卡在 temp=GetData(TEMP_OUT_H); 這裡
我已經卡好久了  請大家幫幫忙

#include <p18f67k22.h>
#include "Delay.h"
#include "MPU6050.h"
#include "LCM.h"
#include "i2c.h"
void main(void)
{
        int temp=0;

        TRISDbits.TRISD0=0;
        LATDbits.LATD0=1;
        DelayMs(5);               
        Init_LCM();
        DelayMs(5);
        I2C_Init();
        DelayMs(5);

        while(1)
        {        
                SetCursor(0,2);
                InitMPU6050();
                temp=GetData(TEMP_OUT_H);
                Dsp4Hex(temp);//4位 十六值

                }
        }
}



///////////////////////////////////////
void Initi2c()
{
         unsigned char sync_mode;
         unsigned char slew;
         sync_mode = MASTER;
         slew = SLEW_ON;
         //20MHz,?生400k IIC?率,SSPADDR = Fosc/4/baud-1=20M/4/400k-1=11
         SSPADD = 0x09;  //400khz
         OpenI2C( sync_mode, slew );

}
//**************************************
//向MPU6050???入一?字??据
//**************************************
void Single_WriteI2C(unsigned char REG_Address,unsigned char REG_data)
{
    IdleI2C();                                                // initiate START condition
    StartI2C();            
    WriteI2C(Write_MPU6050);               //?送??地址+?信?      
    WriteI2C(REG_Address);                       //?部寄存器地址,
    WriteI2C(REG_data);                         //?部寄存器?据,
    StopI2C();                      // send STOP condition
}

//**************************************
//?MPU6050???取一?字??据
//**************************************
unsigned char Single_ReadI2C(unsigned char REG_Address)
{
         unsigned char REG_data;
         IdleI2C();
         StartI2C();                   //send start condition
         WriteI2C(Write_MPU6050);       //?送??地址+?信?
         WriteI2C(REG_Address);        //?送存??元地址,?0?始
         IdleI2C();
         StartI2C();                   //起始信?
         WriteI2C(Read_MPU6050);    //?送??地址+?信?
         REG_data = ReadI2C();                        //read in single byte
         NotAckI2C();                  // send  ACK condition
         StopI2C();                    //send stop condition
         return REG_data;
}

void InitMPU6050()
{
         Single_WriteI2C(PWR_MGMT_1, 0x00);         //解除休眠??
         Single_WriteI2C(SMPLRT_DIV, 0x07);     //陀螺?采?率,典型值:0x07(125Hz)
         Single_WriteI2C(CONFIG, 0x06);          //低通?波?率,典型值:0x06(5Hz)
         Single_WriteI2C(GYRO_CONFIG, 0x18); //陀螺?自?及?量范?,典型值:0x18(不自?,2000deg/s)   0x00  250
         Single_WriteI2C(ACCEL_CONFIG, 0x01); //加速?自?、?量范?及高通?波?率,典型值:0x01(不自?,2G,5Hz)   ±4g 8192LSB/g
}

int GetData(unsigned char REG_Address)
{
         char H,L;
         H=Single_ReadI2C(REG_Address);
         L=Single_ReadI2C(REG_Address+1);
         return (H<<8)+L;   //合成?据
}








沙发
yewuyi| | 2013-8-6 08:25 | 只看该作者
int GetData(unsigned char REG_Address)
{
         char H,L;
         H=Single_ReadI2C(REG_Address);
         L=Single_ReadI2C(REG_Address+1);
         return (H<<8)+L;   //合成?据
}
-----------------------------------------
1、 尽量写成:return ((H<<8)+L);
2、 检查Single_ReadI2C这个函数会不会导致程序卡死在某处

使用特权

评论回复
板凳
allen87171|  楼主 | 2013-8-6 09:52 | 只看该作者
我用debug 模式 他卡在Disassembly Listing的C:\MCC18\v3_39\src\traditional\delays\d10ktcyx.asm 裡
一直在這兩行跳

01420    2EE7     DECFSZ 0xfe7, F, ACCESS
01422    EF10     GOTO 0x1420

pic18的delay.h檔應該沒問題才對

使用特权

评论回复
地板
allen87171|  楼主 | 2013-8-6 16:25 | 只看该作者
當在讀MPU6050時  接腳AD0需接1嗎?

使用特权

评论回复
5
wsndg| | 2019-8-21 16:41 | 只看该作者
你卡在这里不就是说明iic读取有问题吗?你发送数据有没有问题吗?因为陀螺仪是需要开启的

使用特权

评论回复
6
sensitivity| | 2019-8-25 10:35 | 只看该作者
协议对不对?硬件连接有没有问题?

使用特权

评论回复
7
677qliu| | 2020-3-27 19:28 | 只看该作者
对啊我也是这个问题用mcc18的i2c硬件库函数仿照51的mpu6050代码在pic18f上写出来,i2c好像就是通讯不了不知道怎么回事,是代码i2c通讯过程函数配置上的问题吗
未贴出所有源码:
初始化配置
OpenI2C(MASTER,SLEW_OFF);
        SSPADD=9;
        TRISCbits.TRISC3=1;
        TRISCbits.TRISC4=1;

//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
        IdleI2C();
    StartI2C();              //起始信号
    WriteI2C(SlaveAddress);    //发送设备地址+写信号
        WriteI2C(REG_Address);     //发送存储单元地址,从0开始
    WriteI2C(REG_data);       //内部寄存器数据,
    StopI2C();                    //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
        uchar REG_data;
        IdleI2C();
        StartI2C();                          //起始信号
        WriteI2C(SlaveAddress);    //发送设备地址+写信号
        WriteI2C(REG_Address);     //发送存储单元地址,从0开始
        IdleI2C();
        StartI2C();                  //起始信号
        WriteI2C(SlaveAddress+1);  //发送设备地址+读信号
        REG_data=ReadI2C();       //读出寄存器数据
        NotAckI2C();               //接收应答信号NAK
        StopI2C();                    //停止信号
        return REG_data;
}

使用特权

评论回复
8
677qliu| | 2020-3-27 19:31 | 只看该作者
sensitivity 发表于 2019-8-25 10:35
协议对不对?硬件连接有没有问题?

你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗
谢谢

使用特权

评论回复
9
677qliu| | 2020-3-27 19:31 | 只看该作者
wsndg 发表于 2019-8-21 16:41
你卡在这里不就是说明iic读取有问题吗?你发送数据有没有问题吗?因为陀螺仪是需要开启的 ...

你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗
谢谢

使用特权

评论回复
10
standar| | 2020-3-29 16:08 | 只看该作者
IIC总线卡死了,导致程序无法执行下去

使用特权

评论回复
11
wooda| | 2020-3-31 23:19 | 只看该作者
n年前尝试过6050,后来实在出不来就放弃了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝