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

2019-07-20 16:03发布

#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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。