一. 简介

MPU6050是一款六轴陀螺仪,可以通过IIC协议输出三个方向上的加速度和角速度,在平衡车和飞控中较为常见。一般情况下,模块有用的引脚只有四个(其它的不常用),即VCC,GND,SDA和SCL。操作它的第一步,即编写IIC协议。


二. IIC协议

作为三大常用协议之一,掌握它是非常有必要的。IIC为主从协议,分为主机和从机。IIC协议要比SPI要简单那么一点,没有像SPI那样还有模式的配置。下面就简单说说IIC协议。
SDA: IIC的数据线
SCL:IIC的时钟线

  1. 空闲态: SDA和SCL都为高电平。
  2. 起始态: 主机将SDA拉低
  3. 数据传输: 在SCL为低电平的时候,将数据输出,在SCL为高电平的时候,将数据输入。
  4. 应答态:在SCL为高电平的时候,检测到SDA为低电平。
  5. 非应答态:在SCL为高电平的时候,检测到SDA为高电平。
  6. 停止态:在SCL为高电平的时候,将SDA由低拉高。

IIC协议一共可以分为这六种状态,接下来将简要说明如何将这六种状态组成一个完整的IIC协议,来驱动MPU6050。

(1). IIC写

数据输出是以一个byte为单位的,从机地址一般为七位,与读写标志一起组成一个byte。0为写,1为读。
开始 -》 从机地址 + 0 -》 应答 -》发送寄存器地址 -》 应答 -》 写入数据 -》 非应答(应答) -》 停止

(2). IIC读

IIC读数据要比IIC写数据要复杂一点,主要是步骤上多了几步,但是状态什么的都完全一样。

开始 -》 从机地址 + 0 -》 应答 -》发送读取寄存器地址 -》 应答 -》开始 -》 从机地址 + 1 -》 读取数据 -》应答 -》 停止

可以看到,只要将这几个状态实现了,按照这个流程就可以很容易实现IIC的读和写。大概的时序图如下。


三. 代码实现

根据上面的六个状态,定义出对应的六个函数,对应的只有五个,空闲态忽略,因为经过Stop后,IIC的时钟线和数据线都已经为高了。delay时间需要根据从机所能接受的最大速率来决定,不然的话,会出错,下面就来详细说明这几个函数。

(1) MPU6050IICDelay(void)

这就不用说明什么了

void MPU6050IICDelay(void)
{uint16_t i = 250;while(i--);
}
(2) MPU6050IICStart(void)

将SDA配置为输出模式。然后将SCL和SDA全部拉高,dealy后,将SDA拉低,就ok了。

void MPU6050IICStart(void)
{SetSDAOut();SCLHigh();SDAHigh();MPU6050IICDelay();SDALow();MPU6050IICDelay();
}
(3) MPU6050IICACK(void)

这里只包含了从机应答。

void MPU6050IICACK(void)
{   SCLLow();MPU6050IICDelay();SetSDAIn();MPU6050IICDelay();SCLHigh();MPU6050IICDelay();SDARead();MPU6050IICDelay();SCLLow();
}
(4) MPU6050IICStop(void)

停止位这里,需要先将SCL和SDA都拉低,然后先将SCL拉高,后将SDA拉高,

void MPU6050IICStop(void)
{SetSDAOut();MPU6050IICDelay();SCLLow();MPU6050IICDelay();SDALow();MPU6050IICDelay();SCLHigh();MPU6050IICDelay();SDAHigh();MPU6050IICDelay();
}
(5) MPU6050IICWrite(void)
void MPU6050IICWrite(uint8_t data)
{uint8_t i;SetSDAOut();MPU6050IICDelay();for(i = 0 ; i < 8; i++){SCLLow();MPU6050IICDelay();if(data & 0x80)SDAHigh();elseSDALow();data = data << 1;MPU6050IICDelay();SCLHigh();MPU6050IICDelay();}
}
(6) MPU6050IICRead(void)
uint8_t MPU6050IICRead(void)
{uint8_t i;uint8_t data = 0;SetSDAIn();MPU6050IICDelay();for(i = 0;i < 8; i++){SCLLow();MPU6050IICDelay();SCLHigh();MPU6050IICDelay();if(SDARead())data = data | 0x01;elsedata = data | 0x00;data = data << 1;MPU6050IICDelay();}return data;
}

读写数据,可以搭配时序图来,都是将SCL为低的时候,将数据送出去。在SCL为高的时候,接收数据。
然后将上面的这几个函数依次组合成读写两个函数

这里IIC驱动编写完成。

四. MPU6050 初始化

初始化的实质就是对寄存器进行配置,这就要查看芯片手册,了解每一个寄存器的作用了,以及初始化的时候寄存器配置的顺序。
这里将重要的寄存器列举出来了

#define MPU6050Addr     0xD0
#define ACCEL_XOUT_H    0x3B
#define ACCEL_XOUT_L    0x3C
#define ACCEL_YOUT_H    0x3D
#define ACCEL_YOUT_L    0x3E
#define ACCEL_ZOUT_H    0x3F
#define ACCEL_ZOUT_L    0x40#define GYRO_XOUT_H     0x43
#define GYRO_XOUT_L     0x44
#define GYRO_YOUT_H     0x45
#define GYRO_YOUT_L     0x46
#define GYRO_ZOUT_H     0x47
#define GYRO_ZOUT_L     0x48#define PWR_MGMT_1      0x6B
#define PWR_MGMT_2      0x6C
#define SMPLRT_DIV      0x19
#define MPU_CONFIG      0x1A
#define GYRO_CONFIG     0x1B
#define ACCEL_CONFIG    0x1C#define MPU6050ID       0x75
(1). 初始化
/*MPU6050初始化*/
void MPU6050Init(void)
{MPU6050GPIOInit();MPU6050IICWriteRegister(MPU6050Addr,PWR_MGMT_1,0x80);rt_thread_mdelay(100);MPU6050IICWriteRegister(MPU6050Addr,PWR_MGMT_1,0x00);MPU6050IICWriteRegister(MPU6050Addr,SMPLRT_DIV,0x00);MPU6050IICWriteRegister(MPU6050Addr,MPU_CONFIG,0x03);MPU6050IICWriteRegister(MPU6050Addr,GYRO_CONFIG,0x18);// gyro scale  :+-2000°/sMPU6050IICWriteRegister(MPU6050Addr,ACCEL_CONFIG,0x10);// Accel scale :+-8g (65536/16=4096 LSB/g)  MPU6050IICWriteRegister(MPU6050Addr,0x6B,0x01);
}
(2)验证

通过读取芯片的ID,可以确定IIC是否有问题。

/*读取MPU6050的ID*/
uint8_t MPU6050GetId(void)
{return MPU6050IICReadRegister(MPU6050Addr,MPU6050ID);
}

分享一个成果图
欢迎关注 微信公众号 FPGA之旅 获取相关资料
想要完整代码的,也可以在上面联系我,商务合作也咳哟

STM32驱动MPU6050基于IIC协议相关推荐

  1. iic裸机与linux通信,基于IIC协议的Linux操作系统与裸机通信的方法

    主权项: 1.一种基于IIC协议的Linux操作系统与裸机通信的方法,其特征在于,包括如下步骤:步骤S1,对采用Linux系统的多个硬件和裸机同时挂载在总线上,包括:配置一个主机设备和多个从机设备,每 ...

  2. STM32基于IIC协议的OLED模块的使用

    前言 一.项目涉及的内容 项目简介 二.模块实操 1. IIC模块 1.1 IIC协议格式 1.2 开始信号与停止信号 1.3 写数据 1.3.1 硬件IIC代码编写 1.3.2 软件模拟IIC代码编 ...

  3. ARM开发之基于IIC协议的TM1650驱动实现(模拟IIC实现)

    目录 一.内存映射 1.什么是内存映射?为什么要内存映射? 2.gec6818如何进行内存映射?(相关的函数) 3.内存映射代码 : 二.模拟IIC的底层代码实现 1.配置输入输出方向 2.拉高拉低引 ...

  4. STM32驱动MPU6050(二)——软件实现

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 软件实现将从下面三个部分来介绍:IIC通信:MPU6050数据读取:数据融 ...

  5. stm32驱动mpu6050、mpu6500、mpu9250心得

    浅谈自己使用mpu陀螺仪的一些心得. mpu6050/mpu6500驱动 这里是用的原子哥的用虚拟IIC驱动mpu6050代码,之前我一直是用硬件IIC驱动,但是听大神说虚拟IIC比硬件IIC要稳定, ...

  6. [STC89C52RC]基于IIC协议的OLED显示字符

    目录 起始信号 终止信号 应答信号 选择某一点点亮 页模式: 水平模式: 垂直模式: 选择行数 ​编辑  选择列数 清屏 Oled显示,我们会用到字模软件 显示图片 IIC协议 1.1 IIC协议概述 ...

  7. 基于IIC协议的4脚OLED模块的单片机驱动控制(含驱动程序)

    文章目录 前言 OLED模块工作原理 iiciiciic总线协议 核心代码 51单片机 stm32单片机 总结 前言 嵌入式控制系统中,常常会遇到需要显示控制状态的控制场合,这种场景下往往不需要显示花 ...

  8. Gsensor的驱动流程 -- 基于IIC

    (一) XXXX - 内核加载驱动模块是调用:XXXX_init() 方法: a) 调用gsensor_fetch_sysconfig_para()解析sys_config1.fex文件,读取到IIC ...

  9. STM32驱动MPU6050

    #前言: 陀螺仪的用处还是挺多滴,俺最近搬了15646块大理石终于凑齐了买一块正点原子的MPU6050的钱了,下面分享一下怎么配套STM32使用,主要分享一下应用部分,原理部分这里省略15000个字 ...

最新文章

  1. MVC增删查改,从数据库到后台,到前端,整个复习一下
  2. 在Android使用新浪微博的开发平台API
  3. 从地心到宇宙,再到治疗癌症与“赋灵”智能,这届腾讯WE都聊了些啥?
  4. 编写UEditor插件
  5. 【嵌入式】C语言高级编程-container_of宏(04)
  6. VideoUrlParser视频信息分析
  7. HashMap底层实现及原理
  8. 软件使用时间限制_利用家长控制限制孩子使用电脑时间,让其只能学习不能玩游戏...
  9. 用JS实现简单的省市联动
  10. SpringBoot动态切换数据源-快速集成多数据源的启动器
  11. java http服务 Tomcat_【求教】用JAVA写HTTP服务器代替TOMCAT 我代码哪错了。。
  12. Extmail企业邮箱构建指南
  13. Weblogic配置和部署
  14. 周界防护在安防行业重要性与日俱增
  15. 计算机六年级基础知识,《计算机基础知识》单元检测考试题六年级信息技术考试卷与考试题...
  16. 2021年葡萄酒酿造及葡萄酒产业发展研究报告
  17. r语言nonzerocoef函数_R语言如何做COX回归分析和nomogram?
  18. 微软搜索战略全盘革新 计划数月内发布“Kiev”
  19. PreScan 使用点云雷达代替激光雷达操作步骤:
  20. [转]数据挖掘十大经典算法

热门文章

  1. 应该去看看的十大论坛!!!
  2. 2022年中国前10大互联网公司广告营收榜
  3. 电子科大计算机学院郑欣,我校研究生在“华为杯”第十六届中国研究生数学建模竞赛中获佳绩...
  4. AGM FPGA之AG10K 系列的开发建议(连载二)
  5. PHPCMS网站关站了打不开-站长真的凉了吗?
  6. Oracle 中ORA-28000: the account is locked解决办法
  7. Java之环境变量配置
  8. 记一次wordpress博客搬家方法(无损快速搬家)
  9. js如何保留两位小数
  10. php 链接oracle tns,PHP连接Oracle ORA