OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4053|回复: 4

陀螺仪MPU6050调试不成功51都可以 F767就是不行 求带

[复制链接]

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2016-11-9
在线时间
38 小时
发表于 2017-3-14 14:22:37 | 显示全部楼层 |阅读模式
6金钱
#include <sys.h>       
#include "IIC.h"

void IICInput_Init_GPIOB3(void)//数据线输入
{
        GPIO_InitTypeDef GPIO_Initure;                      
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
       
        GPIO_Initure.Pin=GPIO_PIN_3; //PB3
        GPIO_Initure.Mode=GPIO_MODE_INPUT;  //浮空输入
        GPIO_Initure.Pull=GPIO_NOPULL;          //不上拉也不下拉
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

void IICOutput_Init_GPIOB3(void)//数据线输出
{
        GPIO_InitTypeDef GPIO_Initure;                      
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
       
        GPIO_Initure.Pin=GPIO_PIN_3; //PB3
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推腕输出
        GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FAST;     //低速
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}


void IICOutput_Init_GPIOB2(void)                        //时钟线
{
        GPIO_InitTypeDef GPIO_Initure;                      
        __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
       
        GPIO_Initure.Pin=GPIO_PIN_2; //PB3
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推腕输出
        GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FAST;     //低速
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}


void IIC_Output(int data)//时钟线
{
         if(data==0)
         {
                 //IICOutput_Init_GPIOB2();
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
         }
         else if(data==1)
        {
                 //IICOutput_Init_GPIOB2();
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
        }
}



int IIC_Input2(void)//数据线输入
{
        int tmp=0;
        //IICInput_Init_GPIOB3();
        tmp=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);
        return tmp;
}


void IIC_Output2(int data)//数据线输出
{
         if(data==0)
         {
                //IICOutput_Init_GPIOB3();
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
         }
         else if(data==1)
         {
                //IICOutput_Init_GPIOB3();
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
         }
         
}

void IIC_Start(void)
{
                IICOutput_Init_GPIOB3();
                IICOutput_Init_GPIOB2();
                SDA_O(1);
                SCL(1);
                delay_us(6);
                SDA_O(0);
                delay_us(6);
                SCL(0);
}


void IIC_Stop(void)
{
        IICOutput_Init_GPIOB3();
        SDA_O(0);
        SCL(1);
        delay_us(6);
        SDA_O(1);
        delay_us(6);
}

void IIC_Ack(u8 ack)//主机应答
{
       
        IICOutput_Init_GPIOB3();
        SDA_O(ack);
        SCL(1);
        delay_us(5);
        SCL(0);
        delay_us(5);
       
}


u8 IIC_WaitAck(void)                //从机应答 返回为0失败
{
        int i=0;
        IICInput_Init_GPIOB3();
        SDA_O(1);
        delay_us(1);
        SCL(1);
        delay_us(2);
        while(SDA_I())
        {
                i++;
                if(i>200)
                {
                        IIC_Stop();
                        return 0;
                }
        }
        SCL(0);
        return 1;
}

void IIC_WriteByte(u8 data)
{
        int i;
        IICOutput_Init_GPIOB3();
        SCL(0);
        for(i=0;i<8;i++)
        {
                        if(data&0x80)
                        {
                                SDA_O(1);
                        }
                        else
                        {
                                SDA_O(0);
                        }
                        data<<=1;
                        SCL(1);
                        delay_us(5);
                        SCL(0);
                        delay_us(5);
        }
        IIC_WaitAck();
       
}

u8 IIC_ReadBety(u8 ack)
{
        u8 dat;
        u8 i=0;
        SDA_O(1);
        IICInput_Init_GPIOB3();
        for(i=0;i<8;i++)
        {
                SCL(0);
                delay_us(5);
                SCL(1);
                dat<<=1;
                if(SDA_I())
                {
                        dat++;
                }
                delay_us(5);
        }
        IIC_Ack(ack);
        return dat;
}


u8 ReadMPU6050(u8 REG_Address)
{
        u8 REG_data;
        IIC_Start();                   //起始信号
        IIC_WriteByte(SlaveAddress);    //发送设备地址+写信号
        IIC_WriteByte(REG_Address);     //发送存储单元地址,从0开始       
        IIC_Start();                   //起始信号
        IIC_WriteByte(SlaveAddress+1);  //发送设备地址+读信号
        REG_data=IIC_ReadBety(1);       //读出寄存器数据
        //IIC_Ack();                //接收应答信号
        IIC_Stop();                    //停止信号
        return REG_data;
}


void WriteMPU6050(char REG_Address,char REG_data)
{
    IIC_Start();                  //起始信号
    IIC_WriteByte(SlaveAddress);   //发送设备地址+写信号
    IIC_WriteByte(REG_Address);    //内部寄存器地址,
    IIC_WriteByte(REG_data);       //内部寄存器数据,
                IIC_WaitAck();
    IIC_Stop();                   //发送停止信号
}


void IIC_InitMPU6050(void)
{
        WriteMPU6050(PWR_MGMT_1, 0x00);        //解除休眠状态
        WriteMPU6050(SMPLRT_DIV, 0x07);
        WriteMPU6050(CONFIG, 0x06);
        WriteMPU6050(GYRO_CONFIG, 0x18);
        WriteMPU6050(ACCEL_CONFIG, 0x01);
       
}


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








#ifndef _IIC_H_
#define _IIC_H_
#include  "common.h"
//定义宏定义
#define SCL(n)     IIC_Output(n)
#define SDA_I(n)   IIC_Input2(n)
#define SDA_O(n)   IIC_Output2(n)
#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为读取

//IIC端口定义
void IICInput_Init_GPIOB3(void);
void IICOutput_Init_GPIOB3(void);
void IICOutput_Init_GPIOB2(void);
void IIC_Output(int data);
void IIC_Output2(int data);
int IIC_Input2(void);

//IIC 总线协议
void IIC_Start(void);
void IIC_Stop(void);
void IIC_WriteByte(u8 data);
u8 IIC_ReadBety(u8 ack);
void IIC_Ack(u8 ack);
u8 IIC_WaitAck(void);

//陀螺仪初始化及操作函数
u8 ReadMPU6050(u8 REG_Address);
void WriteMPU6050(char REG_Address,char REG_data);
void IIC_InitMPU6050(void);
int GetData(char REG_Address);


#endif


最佳答案

查看完整内容[请看2#楼]

前几天我也在调试MPU6050,51上可行,搬到767上不行,在一个偶然的时间,我拔掉MPU6050后,发现767仍然有读数,后来查找开发板资料才发现,阿波罗板载了一颗MPU9250,而且9250的IIC地址和MPU6050一样,都是0xD0(0x68), 所以我从新开辟2个IO,这样一切问题顺利解决。 你尝试一下,更换你的6050IIC的IO,看看这样对你会不会有帮助。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-2-8
在线时间
10 小时
发表于 2017-3-14 14:22:38 | 显示全部楼层
前几天我也在调试MPU6050,51上可行,搬到767上不行,在一个偶然的时间,我拔掉MPU6050后,发现767仍然有读数,后来查找开发板资料才发现,阿波罗板载了一颗MPU9250,而且9250的IIC地址和MPU6050一样,都是0xD0(0x68),
所以我从新开辟2个IO,这样一切问题顺利解决。
你尝试一下,更换你的6050IIC的IO,看看这样对你会不会有帮助。
回复

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2016-11-9
在线时间
38 小时
 楼主| 发表于 2017-3-14 14:25:49 | 显示全部楼层
管脚开漏输出  浮空都试过 还是不得行  IIC协议也没什么错啊 找了半天看不出来哪里错了
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-2-24
在线时间
16 小时
发表于 2017-3-14 17:18:14 | 显示全部楼层
18784506782 发表于 2017-3-14 14:25
管脚开漏输出  浮空都试过 还是不得行  IIC协议也没什么错啊 找了半天看不出来哪里错了

先试着读取器件ID,如果一直是0xD1,你试试把SCL线中间引出,接到任意一个不用的管脚上,然后正常调试。
为往圣继绝学,为知难经过事。
回复

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2016-11-9
在线时间
38 小时
 楼主| 发表于 2017-3-18 15:36:18 | 显示全部楼层
我现在767上可以了 移植到103又没法用了  不知道为什么!我端口按照103板子AT24C02上面的端口配置的 就是用不了 很奇怪
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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