当前位置: 首页 > news >正文

STM32学习笔记13-通信协议I2CMPU6050

I2C通信协议

I2C通信

  • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)

SCL:串口时钟线:同步的时序,降低对硬件的依赖;

SDA:串口数据线:半双工,一根线兼具发送和接收;


  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)

一主多从:单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制I2C总线——常用模型

在多主多从的情况下,需要额外调用SCL来达成同步,且复杂的协议

硬件电路(一主多从)

  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏上拉输出模式
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构

开漏输出:原本的推挽输出,是上下都接入高低电平,如果导通则强上拉导通高电平,反之;现在不需要上面电路,当电流导通,会进入浮空状态。

所以 这就是对应的开漏输出,当导通后属于浮空状态,这时就需要电阻 ,把此电路改成弱上拉;

好处:

一、完全杜绝了电源短路的现象,保证电路安全——无论电流高或低,都不会存在同时高电平和低电平的情况;

二、避免了引脚模式的频繁切换,开漏加弱上拉的模式,同时兼具了输入和输出的功能——想换高电平可直接导通即可,低电平就连GND即可;

三、存在“线与”的现象,指只要有任意一个或多个设备输出了低电平,总线就处于低电平,反之;因此可以利用这特性,实现执行多主机模式下的时钟同步和总线仲裁

I2C时序基本单元

  • 起始条件:SCL高电平期间,SDA从高电平切换到低电平
  • 终止条件:SCL高电平期间,SDA从低电平切换到高电平


  • 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

低电平主机放数据,高电平从机读数据


  • 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

释放SDA:就证明切换为了输入模式,主机一般默认是输入模式,当需要发送的时候,会将SDA拉低;在被动接收的时候,就必须先释放SDA,避免有数据重叠

低电平从机放数据,高电平主机读数据。

此时从机获得控制权,实现表示主机控制部分,虚线表从机控制的部分;


  • 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
  • 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
  • 发送一位或接收一位:这一位作为应答


地址:当主机发送指令,去访问对应设备,这些设备就要有一个独立的地址:

在I2C协议标准里分为7位和10位地址:7位为例,且7位使用范围最广:

厂商会为它分配一个7位的地址,以MPU6050芯片为例,通过芯片手册可以得知是:

1101 000,一般器件地址的最后几位是可以在电路中改变,这里是1101 000x;用来区分同器件的不同地址,当对应引脚接低电平,地址为1101 0000,反之

I2C时序:

        都是一个字节的操作

  • 指定地址写
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

示波器:

  • 当前地址读
  • 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

  • 但是对应读地址,并不能确定当前的读入的地址,所以需要使用当前地址指针,去指向指定地址读
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

若要多个字节的操作,就需要把读和写的操作重复执行,这样时许就变为,在指定的位置开始按顺序连续读写入多个字节

MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度,能确定静态稳定性
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度(绕X、Y、Z轴旋转的速度),能确定动态稳定性

我们通常都是把芯片内部的器件,想象为机器设备,至于怎么放进芯片的,就是公司的秘籍。

MPU6050参数

  • 16位ADC采集传感器的模拟信号,分为2个字节存储,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g:1g=9.8m/s)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频
  • I2C从机地址:1101000(AD0=0)——7位转换:110 1000——0x68

                                   1101001(AD0=1)

在之前的时序中,读写的操作可以先拆分为7位:0x68,再<<1作为从机操作地址;也可以作4分的地址:0xD0的从机地址,直接修改即可;

硬件电路

MPU6050框图

http://www.lryc.cn/news/624177.html

相关文章:

  • 半敏捷卫星观测调度系统的设计与实现
  • MySQL的事务日志:
  • 智能汽车领域研发,复用云原生开发范式?
  • Redis--day7--黑马点评--优惠券秒杀
  • 超市电商销售分析项目:从数据分析到业务决策
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • 达梦数据库常见的重要巡检语句
  • 线程(基本概念和相关命令)
  • 重温k8s基础概念知识系列三(工作负载)
  • Linux设备模型深度解析
  • Rust Async 异步编程(五):执行器和系统 I/O
  • Python可视化工具-Bokeh:动态显示数据
  • java_spring boot 中使用 log4j2 及 自定义layout设置示例
  • 【Java后端】MyBatis-Plus 原理解析
  • 股票术语:“支撑位”
  • 链表OJ题讲解---试金石含金量
  • qt svg缺失元素, 原因是不支持 rgba
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • JavaScirpt高级程序设计第三版学习查漏补缺(1)
  • JavaScript 中constructor 属性的指向异常问题
  • 【前端面试题】JavaScript核心面试题解析
  • 芋道RBAC实现介绍
  • 软件开发 - foreground 与 background
  • 数据结构与算法之 leetcode 98. 验证二叉搜索树 (前序,中序,后序遍历)
  • React 基础实战:从组件到案例全解析
  • Wasserstein GAN:如何解决GANS训练崩溃,深入浅出数学原理级讲解WGAN与WGAN-GP
  • C语言相关简单数据结构:双向链表
  • 【数据分享】黑龙江省黑土区富锦市土地利用数据
  • 正则表达式实用面试题与代码解析专栏
  • 【Linux系列】常见查看服务器 IP 的方法