OpenEdv-开源电子网

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

STM32F3+MPU6050,IIC读取有问题,求解答

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2018-4-22
在线时间
26 小时
发表于 2018-11-7 14:44:02 | 显示全部楼层 |阅读模式
5金钱
       我目前在写飞控的程序,用的的硬件是F3飞控,主控F303,这几天在搞mpu6050的数据读取问题。我直接把以前写过的软件IIC驱动移植到F3上,但是读取没反应,后来发现F3不支持位带操作,将驱动改了之后,还是有问题,读取一直是FF。用逻辑分析仪看了IIC时序,发现是MPU6050没有响应(返回NACK),但是检查了不下10遍,真的不知道问题在哪里了,请各位帮忙看看。这是逻辑分析仪



这是对应的正确的时序


这是MPU6050初始化
void MPU6050_init(void)
{
    IICwriteByte(devAddr, MPU6050_RA_PWR_MGMT_1, 0x80); //PWR_MGMT_1 重启内部寄存器到默认值
    delay_ms(100);     
    MPU6050_setRate(0x00);//采样频率 = Gyroscope Output Rate / (1 + SMPLRT_DIV)  1kHz
    IICwriteByte(devAddr, MPU6050_RA_PWR_MGMT_1,0x00);//PWR_MGMT_1 使用默认设置  
    IICwriteByte(devAddr, MPU6050_RA_INT_PIN_CFG,0x02); // (stm32)处理器可以直接访问mpu6050的辅助IIC总线
    MPU6050_setDLPFMode(MPU6050_DLPF_BW_98); //设置低通滤波器
    MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000);//设置陀螺仪计量程
    MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_16);//设置加速度计量程

}


这是IIC发送一个字节
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();         
    IIC_SCL_L();//拉低时钟开始数据传输
    for(t=0; t<8; t++)
    {              
        if ((txd&0x80)>>7)
            GPIO_SetBits(I2C_GPIO_Port, I2C_SDA_Pin);
        else
            GPIO_ResetBits(I2C_GPIO_Port, I2C_SDA_Pin);
        txd<<=1;      
        delay_us(2);   
        IIC_SCL_H();
        delay_us(2);
        IIC_SCL_L();   
        delay_us(2);  
    }
}



这是IIC读取一个字节
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0; i<8; i++ )
    {
        IIC_SCL_L();
        delay_us(2);
        IIC_SCL_H();
        receive<<=1;
        if(GPIO_ReadInputDataBit(I2C_GPIO_Port, I2C_SDA_Pin))receive++;   //读SDA in
        delay_us(1);
    }                     
    if(!ack)
        IIC_NAck(); //发送ACK
    else
        IIC_Ack();//发送nACK  
    return receive;
}



这是IIC读取从机寄存器
unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
{
    unsigned char res=0;

    IIC_Start();   
    IIC_Send_Byte(I2C_Addr + 0);       //发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(addr); //发送地址
    IIC_Wait_Ack();      

    IIC_Start();
    IIC_Send_Byte(I2C_Addr + 1); //进入接收模式                    
    IIC_Wait_Ack();
    res = IIC_Read_Byte(0);
    IIC_Stop();//产生一个停止条件

    return res;
}


网上查了类似情况说读出的数据是总线默认状态ff,说明设备没响应,最有可能:
地址不对;
时序不对;
速率不匹配


但是地址的话AD0接地是确定的0X68,时序的话我实在看不出哪里有问题了,速率的话请问是每条IIC指令好了后加延时吗?

对了,我先是iic初始化,延时1s后才初始化mpu6050的。
感谢各位!





屏幕截图(214).png
屏幕截图(215).png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-8 01:37:03 | 显示全部楼层
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-6-29
在线时间
73 小时
发表于 2019-2-2 17:26:09 来自手机 | 显示全部楼层
I2C_Addr这个传进来的是多少
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-4-25
在线时间
0 小时
发表于 2019-4-25 15:09:09 | 显示全部楼层
问题解决了没有?我也碰到相同的问题 ,读到的值是0xff。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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