OpenEdv-开源电子网

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

MPU6050的IIC配置

[复制链接]

9

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-12
在线时间
19 小时
发表于 2017-12-21 15:02:11 | 显示全部楼层 |阅读模式
1金钱
不接AD0的配置,在调试助手上的不到数据
#include "mpuiic.h"
#include "delay.h"

//MPU IIC 延时函数
void MPU_IIC_Delay(void)
{
        delay_us(2);
}

//初始化IIC
void MPU_IIC_Init(void)
{                                             
  GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟
               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;         // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIO
       
  GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);                                                 //PB6,PB7 输出高       

}
//产生IIC起始信号
void MPU_IIC_Start(void)
{
        MPU_SDA_OUT();     //sda线输出
        MPU_IIC_SDA=1;                    
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}          
//产生IIC停止信号
void MPU_IIC_Stop(void)
{
        MPU_SDA_OUT();//sda线输出
        MPU_IIC_SCL=0;
        MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;  
        MPU_IIC_SDA=1;//发送I2C总线结束信号
        MPU_IIC_Delay();                                                                  
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 MPU_IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        MPU_SDA_IN();      //SDA设置为输入  
        MPU_IIC_SDA=1;MPU_IIC_Delay();          
        MPU_IIC_SCL=1;MPU_IIC_Delay();         
        while(MPU_READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        MPU_IIC_Stop();
                        return 1;
                }
        }
        MPU_IIC_SCL=0;//时钟输出0           
        return 0;  
}
//产生ACK应答
void MPU_IIC_Ack(void)
{
        MPU_IIC_SCL=0;
        MPU_SDA_OUT();
        MPU_IIC_SDA=0;
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;
}
//不产生ACK应答                    
void MPU_IIC_NAck(void)
{
        MPU_IIC_SCL=0;
        MPU_SDA_OUT();
        MPU_IIC_SDA=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void MPU_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        MPU_SDA_OUT();             
    MPU_IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        MPU_IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                MPU_IIC_SCL=1;
                MPU_IIC_Delay();
                MPU_IIC_SCL=0;       
                MPU_IIC_Delay();
    }         
}             
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 MPU_IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        MPU_SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        MPU_IIC_SCL=0;
        MPU_IIC_Delay();
                MPU_IIC_SCL=1;
        receive<<=1;
        if(MPU_READ_SDA)receive++;   
                MPU_IIC_Delay();
    }                                         
    if (!ack)
        MPU_IIC_NAck();//发送nACK
    else
        MPU_IIC_Ack(); //发送ACK   
    return receive;
}


最佳答案

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

这个代码是正确的,有BUG的问题是出在IIC的头文件的地址配置。 MINI版STM32F1的PB6、PB7的IO口方向设置为: //IO方向设置 #define MPU_SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;} #define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;} 不谢。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-12
在线时间
19 小时
 楼主| 发表于 2017-12-21 15:02:12 | 显示全部楼层
本帖最后由 123精灵123 于 2017-12-27 17:17 编辑

这个代码是正确的,有BUG的问题是出在IIC的头文件的地址配置。  MINI版STM32F1的PB6、PB7的IO口方向设置为:
//IO方向设置
#define MPU_SDA_IN()       {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;}
#define MPU_SDA_OUT()    {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}          不谢。
回复

使用道具 举报

9

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-12
在线时间
19 小时
 楼主| 发表于 2017-12-21 15:06:03 | 显示全部楼层
本帖最后由 123精灵123 于 2017-12-21 15:18 编辑

代码源应用于STM32F103,AD0为悬空状态
回复

使用道具 举报

9

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2017-12-12
在线时间
19 小时
 楼主| 发表于 2017-12-22 12:38:25 | 显示全部楼层
帮顶,帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-23 00:59:05 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2018-1-18
在线时间
22 小时
发表于 2018-7-24 10:04:42 | 显示全部楼层
帮顶,可惜现在才看到,已解决
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-8-12
在线时间
24 小时
发表于 2019-9-11 19:33:48 | 显示全部楼层
123精灵123 发表于 2017-12-21 15:02
这个代码是正确的,有BUG的问题是出在IIC的头文件的地址配置。  MINI版STM32F1的PB6、PB7的IO口方向设置为 ...

学习学习学习
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 14:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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