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