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)
{
}
}