极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18798|回复: 6

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

[复制链接]
发表于 2013-7-28 08:18:40 | 显示全部楼层 |阅读模式
       各位大神,新手路过,正在尝试用CC2530接收MPU6050采集到的数据,但是我读取who am I 的时候得到的值是个空格,MPU6050的初始化程序用的是购买芯片的时候自带的,我去掉了LCD显示部分,下面是MPU6050初始化的代码,麻烦各位找找问题,感激不尽啊

[pre lang="C" line="1"]#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[4];                                                        //显示数字(-511至512)的字符数组
int        dis_data;       
char Txdata[14];     //变量
//int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
//****************************************
//函数声明
//****************************************
void  delay(unsigned int k);                                        //延时
//MPU6050操作函数
void  InitMPU6050();                                                                                                        //初始化MPU6050
void  Delay5us();
void  I2C_Start();
void  I2C_Stop();
void  I2C_SendACK(bit ack);
bit   I2C_RecvACK();
void  I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void  I2C_ReadPage();
void  I2C_WritePage();
uchar Single_ReadI2C(uchar REG_Address);                                                //读取I2C数据
void  Single_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;   //合成数据
}[/code]
回复

使用道具 举报

发表于 2013-8-5 15:52:15 | 显示全部楼层
代码不全,把串口、延时、main函数都贴出来、、、、
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 22:21:27 | 显示全部楼层
Albert2013 发表于 2013-8-5 15:52
代码不全,把串口、延时、main函数都贴出来、、、、

谢谢,问题已经解决
回复 支持 反对

使用道具 举报

发表于 2013-8-14 10:27:14 | 显示全部楼层
楼主,怎么学习mpu6050,本人也在用ti的zigbee.学习步骤是哪些,我不太懂传感器测量这些角位移什么的。
回复 支持 反对

使用道具 举报

发表于 2013-8-14 13:20:09 | 显示全部楼层
qingxia0702 发表于 2013-8-6 22:21
谢谢,问题已经解决

楼主,怎么解决了?求回答。
回复 支持 反对

使用道具 举报

发表于 2013-12-8 18:14:01 | 显示全部楼层
不知方案可否用来APC220模块的连续性通信
回复 支持 反对

使用道具 举报

发表于 2014-3-6 20:06:39 | 显示全部楼层
楼主,怎么解决了?求回答。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 00:18 , Processed in 0.042835 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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