PIC18 無法讀 MPU6050
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(); // sendACK 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) 0x00250
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; //合成?据
} 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这个函数会不会导致程序卡死在某处 我用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檔應該沒問題才對 當在讀MPU6050時接腳AD0需接1嗎?
你卡在这里不就是说明iic读取有问题吗? 你发送数据有没有问题吗? 因为陀螺仪是需要开启的 协议对不对?硬件连接有没有问题?
本帖最后由 dingy 于 2021-8-14 19:33 编辑
还有人讨论吗 对啊我也是这个问题用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;
} 你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗
你好呀我有个问题一直调不出来你知道关于mcc18的i2c硬件函数库调用吗
IIC总线卡死了,导致程序无法执行下去
n年前尝试过6050,后来实在出不来就放弃了
嗯,我再好好缕一缕吧,有了好消息及时通知大家
页:
[1]