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

2019-07-20 02:23发布

       我目前在写飞控的程序,用的的硬件是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的。
感谢各位!





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