OpenEdv-开源电子网

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

基于stm32的MPU6050收读取和模拟IIC,调试一直失败,大神教教我

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-23
在线时间
2 小时
发表于 2018-4-13 22:07:34 | 显示全部楼层 |阅读模式
1金钱
这里面的程序我是在电子罗盘的基础上该的,所以许多函数的名字用的是HMC,不是MPU6050.程序在附件里
#include "HMC5983.h"
#include "math.h"
// ??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???
//****************************************
void Init_HMC5983(void)
{
        delay_ms(100);
        IIC_Init();
        Write_HMC5983(PWR_MGMT_1, 0x00);
        Write_HMC5983(SMPLRT_DIV, 0x07);
        Write_HMC5983(CONFIG, 0x06);                //á¬Dø2aá¿Ä£ê½
        Write_HMC5983(GYRO_CONFIG, 0x18);
        Write_HMC5983(ACCEL_CONFIG, 0x01);
}

void Write_HMC5983(u8 add, u8 da)
{
    IIC_Start();                  //Æeê¼DÅoÅ
    IIC_Send_Byte(SlaveAddress);   //·¢Ëíé豸μØÖ·+D′DÅoÅ
        IIC_Wait_Ack();

    IIC_Send_Byte(add);    //Äú2¿¼Ä′æÆ÷μØÖ·£¬Çë2ο¼ÖDÎÄpdf
        IIC_Wait_Ack();

    IIC_Send_Byte(da);       //Äú2¿¼Ä′æÆ÷êy¾Y£¬Çë2ο¼ÖDÎÄpdf
        IIC_Wait_Ack();

    IIC_Stop();                   //·¢Ëíí£Ö1DÅoÅ
}

u8 Read_HMC5983(u8 REG_Address)
{   
        u8 REG_data;
    IIC_Start();                          //Æeê¼DÅoÅ
    IIC_Send_Byte(SlaveAddress);           //·¢Ëíé豸μØÖ·+D′DÅoÅ
        IIC_Wait_Ack();

    IIC_Send_Byte(REG_Address);                   //·¢Ëí′æ′¢μ¥ÔaμØÖ·£¬′ó0¿aê¼       
        IIC_Wait_Ack();

    IIC_Start();                          //Æeê¼DÅoÅ
    IIC_Send_Byte(SlaveAddress+1);         //·¢Ëíé豸μØÖ·+¶áDÅoÅ
        IIC_Wait_Ack();

    REG_data=IIC_Read_Byte(0);         //¶á3ö¼Ä′æÆ÷êy¾Y
          IIC_Stop();                           //í£Ö1DÅoÅ
    return REG_data;
}

//******************************************************
//
//á¬Dø¶á3öHMC5983Äú2¿½Ç¶èêy¾Y£¬μØÖ··¶Î§0x3~0x5
//
//******************************************************
void Multiple_read_HMC5983(u8*BUF)
{   u8 i;
    IIC_Start();                          //Æeê¼DÅoÅ
    IIC_Send_Byte(SlaveAddress);           //·¢Ëíé豸μØÖ·+D′DÅoÅ
        IIC_Wait_Ack();
    IIC_Send_Byte(0x03);                   //·¢Ëí′æ′¢μ¥ÔaμØÖ·£¬′ó0x3¿aê¼       
        IIC_Wait_Ack();
    IIC_Start();                          //Æeê¼DÅoÅ
    IIC_Send_Byte(SlaveAddress+1);         //·¢Ëíé豸μØÖ·+¶áDÅoÅ
        IIC_Wait_Ack();
         for (i=0; i<6; i++)                      //á&#172;D&#248;&#182;áè&#161;6&#184;&#246;μ&#216;&#214;·êy&#190;Y£&#172;′&#230;′¢&#214;DBUF
    {

        if (i == 5)
        {
           BUF[i] = IIC_Read_Byte(0);          //×&#238;oóò&#187;&#184;&#246;êy&#190;YDèòa&#187;&#216;NOACK
        }
        else
        {
          BUF[i] = IIC_Read_Byte(1);          //·μ&#187;&#216;ACK
       }
   }
    IIC_Stop();                          //í£&#214;1D&#197;o&#197;
}
//????
//**************************************
short GetData(unsigned char REG_Address)
{
        unsigned char H,L;
        short data;
        H=Read_HMC5983( REG_Address);
        L=Read_HMC5983( REG_Address+1);
        data=(short)((H<<8)|L);
        return data;   //????
}
//**************************************

/**************
&#187;&#241;è&#161;μ&#231;×ó&#194;T&#197;ìêy&#190;Y£&#172;&#197;D&#182;&#207;2¢ò&#198;è¥′í&#206;ó&#182;áêy
**************/
void HMC_Get_Data(short*MPU6050_buf)
{
        MPU6050_buf[0]=GetData(ACCEL_XOUT_H);
        MPU6050_buf[1]=GetData(ACCEL_YOUT_H);
        MPU6050_buf[2]=GetData(ACCEL_ZOUT_H);
        MPU6050_buf[3]=GetData(GYRO_XOUT_H);
        MPU6050_buf[4]=GetData(GYRO_YOUT_H);
        MPU6050_buf[5]=GetData(GYRO_ZOUT_H);
        MPU6050_buf[6]=GetData(GYRO_ZOUT_H);
}

&#196;£&#196;aIIC&#199;y&#182;ˉ
2014-10-29
Leven
***********************/

#include"IIC.h"

void IIC_Init(void)
{
        RCC->APB2ENR |= RCC_IIC;//1 << 4;
        SCL_OUT();//GPIOC->CRH &= 0xfff00fff;                //PC11 PC12í&#198;íìê&#228;3&#246;
        SDA_OUT();//GPIOC->CRH |= 0x00033000;
        IIC_SCL=1;//GPIOC->ODR |= 3 << 11;                        //PC11 PC12ê&#228;3&#246;&#184;&#223;
        IIC_SDA=1;
}

void IIC_Start(void)
{
        SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;//&#199;ˉ×&#161;I2C×ü&#207;&#223;£&#172;×&#188;±&#184;·¢&#203;í&#187;ò&#189;óê&#213;êy&#190;Y
}

void IIC_Stop(void)
{
        SDA_OUT();
        IIC_SDA = 0;
        IIC_SCL = 1;
        delay_us(4);
        IIC_SDA = 1;
        delay_us(4);
}

u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime = 0;

        SDA_IN();
        IIC_SDA = 1;
        delay_us(1);
        IIC_SCL = 1;
        delay_us(1);
        while(READ_SDA)
        {
                ucErrTime++;
                if (ucErrTime > 250)
                {
                        IIC_Stop();
                        return 1;          //ó|′eê§°ü
                }
        }
        IIC_SCL = 0;
        return 0;        //ó|′e3é1|
}

void IIC_Ack(void)
{
        IIC_SCL = 0;
        SDA_OUT();
        IIC_SDA = 0;
        delay_us(2);
        IIC_SCL = 1;
        delay_us(2);
        IIC_SCL = 0;
}

void IIC_NAck(void)
{
        IIC_SCL = 0;
        SDA_OUT();
        IIC_SDA = 1;
        delay_us(2);
        IIC_SCL = 1;
        delay_us(2);
        IIC_SCL = 0;
}

void IIC_Send_Byte(u8 txd)
{
        u8 t;

        SDA_OUT();
        IIC_SCL = 0;
        for (t = 0; t < 8; t++)
        {
                IIC_SDA = (txd&0x80) >> 7;
                txd <<= 1;
                delay_us(2);
                IIC_SCL = 1;
                delay_us(2);
                IIC_SCL = 0;
        }
        //IIC_Wait_Ack();
}

//&#182;áò&#187;&#184;&#246;×&#214;&#189;ú£&#172;ack = 1ê±£&#172; ·¢&#203;íACK£&#172; ack = 0£&#172;·¢&#203;ínACK
u8 IIC_Read_Byte(u8 ack)
{
        u8 i, receive = 0;

        SDA_IN();
        for (i = 0; i < 8; i++)
        {
                IIC_SCL = 0;
                delay_us(2);
                IIC_SCL = 1;
                receive <<= 1;
                if(READ_SDA) receive++;
                delay_us(1);
        }
        if (!ack)        IIC_NAck();
        else IIC_Ack();
        return receive;
}


ALIENTEK MINISTM32 实验3 串口实验.zip

2.21 MB, 下载次数: 52

mpu6050程序

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

48

帖子

0

精华

高级会员

Rank: 4

积分
558
金钱
558
注册时间
2017-7-26
在线时间
50 小时
发表于 2018-4-14 10:45:22 | 显示全部楼层
我觉得你还是把手册看完了在改吧。两个器件的类型都不是一样的,而且你连地址都没改....
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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