打印

PIC18 無法讀 MPU6050

[复制链接]
2695|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingy|  楼主 | 2021-8-14 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;   //合成?据
}

使用特权

评论回复
沙发
pengf| | 2021-8-14 19:14 | 只看该作者
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这个函数会不会导致程序卡死在某处

使用特权

评论回复
板凳
dingy|  楼主 | 2021-8-14 19:17 | 只看该作者
我用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檔應該沒問題才對

使用特权

评论回复
地板
dingy|  楼主 | 2021-8-14 19:19 | 只看该作者
當在讀MPU6050時  接腳AD0需接1嗎?

使用特权

评论回复
5
dingy|  楼主 | 2021-8-14 19:21 | 只看该作者
你卡在这里不就是说明iic读取有问题吗?

使用特权

评论回复
6
heweibig| | 2021-8-14 19:23 | 只看该作者
你发送数据有没有问题吗?

使用特权

评论回复
7
jlyuan| | 2021-8-14 19:25 | 只看该作者
因为陀螺仪是需要开启的

使用特权

评论回复
8
stly| | 2021-8-14 19:27 | 只看该作者
协议对不对?硬件连接有没有问题?

使用特权

评论回复
9
dingy|  楼主 | 2021-8-14 19:30 | 只看该作者
本帖最后由 dingy 于 2021-8-14 19:33 编辑

还有人讨论吗

使用特权

评论回复
10
wuhany| | 2021-8-14 19:33 | 只看该作者
对啊我也是这个问题用mcc18的i2c硬件库函数仿照51的mpu6050代码在pic18f上写出来,i2c好像就是通讯不了不知道怎么回事,是代码i2c通讯过程函数配置上的问题吗

使用特权

评论回复
11
wuhany| | 2021-8-14 19:34 | 只看该作者
未贴出所有源码:
初始化配置
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;
}

使用特权

评论回复
12
yszong| | 2021-8-14 19:38 | 只看该作者
你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗

使用特权

评论回复
13
llljh| | 2021-8-14 19:40 | 只看该作者
你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗

使用特权

评论回复
14
chenjunt| | 2021-8-14 19:41 | 只看该作者
IIC总线卡死了,导致程序无法执行下去

使用特权

评论回复
15
huangchui| | 2021-8-14 19:44 | 只看该作者
n年前尝试过6050,后来实在出不来就放弃了

使用特权

评论回复
16
dingy|  楼主 | 2021-8-14 19:46 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

745

主题

10920

帖子

6

粉丝