qingxia0702 发表于 2013-7-28 08:18:40

用CC2530接收MPU6050数据碰到的问题

       各位大神,新手路过,正在尝试用CC2530接收MPU6050采集到的数据,但是我读取who am I 的时候得到的值是个空格,MPU6050的初始化程序用的是购买芯片的时候自带的,我去掉了LCD显示部分,下面是MPU6050初始化的代码,麻烦各位找找问题,感激不尽啊

#include <ioCC2530.h>
#include <string.h>
#include <math.h>   
#include <stdio.h>   
#define ushort unsigned short;
#define uint unsigned int
#define uchar unsigned char
#define bit int
#define TRUE 1
#define FALSE 0


//****************************************
// 定义51单片机端口
//****************************************

#define    SCL P0_5                //IIC时钟引脚定义
#define    SDA P0_4                //IIC数据引脚定义

//****************************************
// 定义MPU6050内部地址
//****************************************
#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
#define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define        ACCEL_XOUT_H        0x3B
#define        ACCEL_XOUT_L        0x3C
#define        ACCEL_YOUT_H        0x3D
#define        ACCEL_YOUT_L        0x3E
#define        ACCEL_ZOUT_H        0x3F
#define        ACCEL_ZOUT_L        0x40
#define        TEMP_OUT_H                0x41
#define        TEMP_OUT_L                0x42
#define        GYRO_XOUT_H                0x43
#define        GYRO_XOUT_L                0x44       
#define        GYRO_YOUT_H                0x45
#define        GYRO_YOUT_L                0x46
#define        GYRO_ZOUT_H                0x47
#define        GYRO_ZOUT_L                0x48
#define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
#define        WHO_AM_I                        0x75        //IIC地址寄存器(默认数值0x68,只读)
#define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取
//****************************************
//定义类型及变量
//****************************************
uchar dis;                                                        //显示数字(-511至512)的字符数组
int        dis_data;       
char Txdata;   //变量
//int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
//****************************************
//函数声明
//****************************************
voiddelay(unsigned int k);                                        //延时
//MPU6050操作函数
voidInitMPU6050();                                                                                                        //初始化MPU6050
voidDelay5us();
voidI2C_Start();
voidI2C_Stop();
voidI2C_SendACK(bit ack);
bit   I2C_RecvACK();
voidI2C_SendByte(uchar dat);
uchar I2C_RecvByte();
voidI2C_ReadPage();
voidI2C_WritePage();
uchar Single_ReadI2C(uchar REG_Address);                                                //读取I2C数据
voidSingle_WriteI2C(uchar REG_Address,uchar REG_data);       



void I2C_Start()
{
    SDA = 1;                  //拉高数据线
    SCL = 1;                  //拉高时钟线
    Delay5us();               //延时
    SDA = 0;                  //产生下降沿
    Delay5us();               //延时
    SCL = 0;                  //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
    SCL = 0;
    Delay5us();
    SDA = 0;
    Delay5us();
    SCL = 1;
    Delay5us();
    SDA = 1;
    Delay5us();
   
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                  //拉高时钟线
    Delay5us();               //延时
    SCL = 0;                  //拉低时钟线
    Delay5us();               //延时
}
//**************************************
//I2C接收应答信号
//**************************************
bit I2C_RecvACK()
{
    SCL = 1;                  //拉高时钟线
    Delay5us();               //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                  //拉低时钟线
    Delay5us();               //延时
    return CY;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{
    uchar i;
    for (i=0; i<8; i++)         //8位计数器
    {
      dat <<= 1;            //移出数据的最高位
      SDA = CY;               //送数据口
      SCL = 1;                //拉高时钟线
      Delay5us();             //延时
      SCL = 0;                //拉低时钟线
      Delay5us();             //延时
    }
    I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
    uchar i;
    uchar dat = 0;
    SDA = 1;                  //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
      dat <<= 1;
      SCL = 1;                //拉高时钟线
      Delay5us();             //延时
      dat |= SDA;             //读数据               
      SCL = 0;                //拉低时钟线
      Delay5us();             //延时
    }
    return dat;
}
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
    I2C_Start();                  //起始信号
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
    I2C_SendByte(REG_Address);    //内部寄存器地址,
    I2C_SendByte(REG_data);       //内部寄存器数据,
    I2C_Stop();                   //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
        uchar REG_data;
        I2C_Start();                   //起始信号
        I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
        I2C_SendByte(REG_Address);   //发送存储单元地址,从0开始       
        I2C_Start();                   //起始信号
        I2C_SendByte(SlaveAddress+1);//发送设备地址+读信号
        REG_data=I2C_RecvByte();       //读出寄存器数据
        I2C_SendACK(1);                //接收应答信号
        I2C_Stop();                  //停止信号
        return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
        Single_WriteI2C(SMPLRT_DIV, 0x07);
        Single_WriteI2C(CONFIG, 0x06);
        Single_WriteI2C(GYRO_CONFIG, 0x18);
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成数据
//**************************************
int GetData(uchar REG_Address)
{
        char H,L;
        H=Single_ReadI2C(REG_Address);
        L=Single_ReadI2C(REG_Address+1);
        return (H<<8)+L;   //合成数据
}

Albert2013 发表于 2013-8-5 15:52:15

代码不全,把串口、延时、main函数都贴出来、、、、

qingxia0702 发表于 2013-8-6 22:21:27

Albert2013 发表于 2013-8-5 15:52 static/image/common/back.gif
代码不全,把串口、延时、main函数都贴出来、、、、

谢谢,问题已经解决

baoliguo 发表于 2013-8-14 10:27:14

楼主,怎么学习mpu6050,本人也在用ti的zigbee.学习步骤是哪些,我不太懂传感器测量这些角位移什么的。

baoliguo 发表于 2013-8-14 13:20:09

qingxia0702 发表于 2013-8-6 22:21 static/image/common/back.gif
谢谢,问题已经解决

楼主,怎么解决了?求回答。

学慧放弃 发表于 2013-12-8 18:14:01

不知方案可否用来APC220模块的连续性通信

btz23 发表于 2014-3-6 20:06:39

楼主,怎么解决了?求回答。
页: [1]
查看完整版本: 用CC2530接收MPU6050数据碰到的问题