stm32硬件i2c无法读取mpu6050

f103硬件i2c无法读取mpu6050原始数据,原因在于MPU_Init函数,在main中加入init函数,串口也无法正常工作,注释之后便可正常使用串口;

当使用硬件i2c读取oled时,故意将地址写错也无法正常使用串口

附上源码,恳请指正

static void I2C_WriteByte(uint8_t addr,uint8_t data)
{
	
	while( I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) );   //总线忙为1,空闲为0
	
	I2C_GenerateSTART(I2C1, ENABLE);  //起始信号
	while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) ); //EV5, SB(startbit)=1
	
	I2C_Send7bitAddress(I2C1, (MPU_ADDR<<1), I2C_Direction_Transmitter); //发送从设备地址,0x68
	while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ); //EV6,ADDR=1
	
	I2C_SendData(I2C1, addr);   //从设备中的内存地址
	while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED) );//EV8,TxE=1
	
	I2C_SendData(I2C1, data);  //发送数据
	while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED) );//EV8,TxE=1
	
	I2C_GenerateSTOP(I2C1, ENABLE);  //停止信号
}



uint8_t MPU6050_Init(void)
{
	uint8_t id[1]={1};

	I2C_WriteByte(MPU_PWR_MGMT1_REG,0x80); //reset mpu
	Delay_SysTic_ms(100);
	I2C_WriteByte(MPU_PWR_MGMT1_REG,0x00); //wake up
	
	I2C_WriteByte(MPU_GYRO_CFG_REG,0x18); //3<<3 2000°/s
	I2C_WriteByte(MPU_ACCEL_CFG_REG,0x00); //0<<3 ±2g
	I2C_WriteByte(MPU_SAMPLE_RATE_REG,0x13);  //sample fre 50hz
	I2C_WriteByte(MPU_CFG_REG,0x04);     //DLPF 25hz
	I2C_WriteByte(MPU_INT_EN_REG,0x00);  //disable int
	I2C_WriteByte(MPU_USER_CTRL_REG,0x00); //disable i2c master mode
	I2C_WriteByte(MPU_INTBP_CFG_REG,0x80); //int_level low
	
	I2C_ReadData(MPU_DEVICE_ID_REG,id,1);  //read id
	I2C_WriteByte(MPU_PWR_MGMT1_REG,0x01);  //PLL with x axis
	I2C_WriteByte(MPU_PWR_MGMT2_REG,0x00);  //enable all 
	
	return *id;
}

init函数

 

main.c

int main(void)
{
	I2C_GPIO_Config();
	USART1_Config();
	uint8_t id=MPU6050_Init();
	char id_buf[1];
	

	printf("MPU6050 Test!\n");
	printf("id = %u\n",id);
	
	while(1)
	{
		
	}
	
} 

 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。