• #智能小车项目(五)MPU9250初始化


    IIC地址控制

    // ADO0 为0 控制MPU9250的IIC地址为0x68
    static void MPU_ADDR_CTRL(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    	/*设置GPIO模式为通用推挽输出*/
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	GPIO_ResetBits(GPIOB, GPIO_Pin_14);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    IIC引脚初始化

    
    //初始化IIC
    void MPU_IIC_Init(void)
    {		
    	#if ENABLE_I2C_PB10_PB11
    	GPIO_InitTypeDef  GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟 
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;	 // 端口配置
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIO 	
    	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
    	#else			     
    	GPIO_InitTypeDef  GPIO_InitStructure;
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟 
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;	 // 端口配置
    	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT ; 		 //推挽输出
    	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIO 	
    	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_15);
    	#endif
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    MPU初始化

    static uint8_t MPU_Basic_Init(void)
    {
    	uint8_t res = 0;
    	MPU_ADDR_CTRL();/* 设置IIC地址 */
    	MPU_IIC_Init();/* IIC初始化 */
    	MPU_Delay_ms(10);
    
    	MPU_Write_Byte(MPU9250_ADDR, MPU_PWR_MGMT1_REG, 0X80); // Reset MPU9250 //复位MPU9250 /* 1-重置所有寄存器和已经配置数据,重置后此位将自动清 0 */
    	MPU_Delay_ms(100);										   // Delay 100 ms //延时100ms
    	MPU_Write_Byte(MPU9250_ADDR, MPU_PWR_MGMT1_REG, 0X00); // Wake mpu9250 //唤醒MPU9250
    
    	MPU_Set_Gyro_Fsr(1);  // Gyroscope sensor              //陀螺仪传感器,±500dps=±500°/s ±32768 (gyro/32768*500)*PI/180(rad/s)=gyro/3754.9(rad/s)
    	MPU_Set_Accel_Fsr(0); // Acceleration sensor           //加速度传感器,±2g=±2*9.8m/s^2 ±32768 accel/32768*19.6=accel/1671.84
    	MPU_Set_Rate(50);	  // Set the sampling rate to 50Hz //设置采样率50Hz
    
    	MPU_Write_Byte(MPU9250_ADDR, MPU_INT_EN_REG, 0X00);	   // Turn off all interrupts //关闭所有中断
    	MPU_Write_Byte(MPU9250_ADDR, MPU_USER_CTRL_REG, 0X00); // The I2C main mode is off //I2C主模式关闭
    	MPU_Write_Byte(MPU9250_ADDR, MPU_FIFO_EN_REG, 0X00);   // Close the FIFO //关闭FIFO
    	// The INT pin is low, enabling bypass mode to read the magnetometer directly
    	// INT引脚低电平有效,开启bypass模式,可以直接读取磁力计
    	MPU_Write_Byte(MPU9250_ADDR, MPU_INTBP_CFG_REG, 0X82);
    	// Read the ID of MPU9250 读取MPU9250的ID
    	res = MPU_Read_Byte(MPU9250_ADDR, MPU_DEVICE_ID_REG);
    	printf("MPU9250 RD ID=0x%02X\n", res);
    	if (res == MPU9250_ID) // The device ID is correct //器件ID正确
    	{
    		MPU_Write_Byte(MPU9250_ADDR, MPU_PWR_MGMT1_REG, 0X01); // Set CLKSEL,PLL X axis as reference //设置CLKSEL,PLL X轴为参考
    		MPU_Write_Byte(MPU9250_ADDR, MPU_PWR_MGMT2_REG, 0X00); // Acceleration and gyroscope both work //加速度与陀螺仪都工作
    		MPU_Set_Rate(50);									   // Set the sampling rate to 50Hz //设置采样率为50Hz
    	}
    	else
    		return 1;
    
    	res = MPU_Read_Byte(AK8963_ADDR, MAG_WIA); // Read AK8963ID //读取AK8963ID
    	printf("AK8963 RD ID=0x%02X\n", res);
    	if (res == AK8963_ID)
    	{
    		MPU_Write_Byte(AK8963_ADDR, MAG_CNTL1, 0X11); // Set AK8963 to single measurement mode //设置AK8963为单次测量模式
    	}
    	else
    		return 1;
    	MPU_Delay_ms(30);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来
    一个基于Notes的CMR应用程序
    cp -r, 保留拷贝的文件原本的权限和属性
    ClickHouse入门手册1.0
    Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践
    Exgcd扩展欧几里得
    Anacode+YOLO识别图片
    WebPack5进阶使用总结(二)
    设计模式简介
    MySql创建分区
  • 原文地址:https://blog.csdn.net/Pretender_1205/article/details/133783028