首页 > 其他分享 >MPU6050开发 -- 进阶之I2C/SPI通信协议

MPU6050开发 -- 进阶之I2C/SPI通信协议

时间:2023-02-25 13:33:08浏览次数:61  
标签:进阶 高电平 -- 通信协议 低电平 SPI MPU SDA I2C


上一篇基本概念讲了一通,大体上对MPU6050有了一个了解。对于MPU6050开发来讲主要的应该就是 I2C/SPI 通信和寄存器控制了吧。

接下来我们继续看芯片手册,简单了解一下I2C/SPI通信协议。(S5PV210开发里再综合详讲)

I2C 和SPI 都是串行同步通信,同步通信和异步通信区别是什么?这一点我们刚讲过,参看:​​S5PV210开发 -- 通信​​

 

一、I2C和SPI(仅限MPU-6000)串行接口

MPU-6000 / MPU-6050的内部寄存器和存储器可以使用400 kHz的I2C 或 1MHz的SPI(仅MPU-6000)访问。 SPI工作在四线模式。

 

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据传输

注意:
为了防止在使用SPI(MPU-6000)时切换到I2C模式,应通过设置 I2C_IF_DIS 配置位来禁用 I2C 接口。 在等待 6.3节“寄存器读/写启动时间”指定的时间后,立即执行该位设置。

 

二、I2C接口

I2C是由信号串行数据(SDA)和串行时钟(SCL)组成的双线接口。 一般来说,这些线路是开漏和双向的。 在广义的I2C接口实现中,连接的设备可以是主设备或从设备。 主设备将从设备地址放在总线上,并且具有匹配地址的从设备确认主设备。
系统处理器(MPU-60X0)作为从设备与主系统处理器进行通信。 SDA和SCL线通常需要上拉电阻(4.7k电阻)到VDD。 最大总线速度是400 kHz。
MPU-60X0的从机地址为 b110100X,长度为7位。
7位地址的LSB位由引脚AD0的逻辑电平决定。 这允许两个MPU-60X0 连接到同一个I2C总线。在此配置中使用时,其中一个设备的地址应为b1101000(AD0引脚为逻辑低电平),另一个的地址应为b1101001(AD0引脚为逻辑高电平)。

 

PS:讲到这里就搞明白了,为什么AD0接地了!!

思考:这里只给出了从机地址 b110100X,那I2C的读地址和写地址是什么呢?

 

三、I2C通信协议

(1)开始(S)和停止(P)条件:

主机在总线上启动 START 条件(S)时启动 I2C 总线通信,总线定义为 SCL 线为高电平(见下图)时,SDA 线从高电平变为低电平。 总线被认为是繁忙的,直到主机在总线上放置一个停止条件(P),在SCL为高电平(见下图)时,在SDA线路上定义为从低电平到高电平的跳变

 

MPU6050开发 -- 进阶之I2C/SPI通信协议_寄存器_02

 

此外,如果产生一个重复的START(Sr)而不是STOP条件,总线将保持忙碌状态。

 

(2)数据格式/应答

 

I2C 数据字节定义为8位长。 每个数据传输传输的字节数没有限制。 传输的每个字节必须跟一个应答(ACK)信号应答信号的时钟由主器件产生,而接收器通过下拉 SDA 并在应答时钟脉冲的高电平期间保持低电平来产生实际的应答信号。
如果一个从机处于繁忙状态,并且在某个其他任务执行之前不能发送或接收另一个数据字节,则它可以保持SCL为低电平,从而强制主机进入等待状态。 当从站准备好时,正常的数据传输恢复,并释放时钟线(参见下图)。

 

 

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据传输_03

扩展:

应答信号的时钟由主器件产生,这句话让我想起先前做 DM368 编码的时候出现无应答的问题。

参看:​​DM368开发 -- 编码并实时播放​​

(3)通信

在开始与起始条件(S)的通信之后,主机发送一个7位从机地址,然后是第8位(读/写位)。 读/写位指示主器件是从正在接收数据还是正在写入从器件。 然后,主器件释放SDA线并等待来自从器件的应答信号(ACK)。 传输的每个字节后面都必须有一个应答位。 为了应答,从器件将SDA线拉低并在SCL线的高电平期间保持低电平。
数据传输始终由具有STOP条件(P)的主机终止,从而释放通信线路。 但是,主器件可以产生一个重复的起始条件(Sr),并在不首先产生停止条件(P)的情况下寻址另一个从器件。 SCL为高电平时,SDA线上的低电平至高电平转换定义停止条件。 除了启动和停止条件之外,所有SDA变化都应在SCL低电平时进行

MPU6050开发 -- 进阶之I2C/SPI通信协议_寄存器_04

===============================

翻译的真乱,简单点说就是:

数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束。应答(ADC)为SDA为低电平。
数据改变:SCL为低电平时,SDA线才能改变传输的bit。

===============================

 

为了写入内部MPU-60X0寄存器,主机发送开始条件(S),然后是I2C地址和写入位(0)。 在第9个时钟周期(时钟为高电平),MPU-60X0确认传输。 然后主机把寄存器地址(RA)放在总线上。 在MPU-60X0确认接收到寄存器地址后,主机将寄存器数据放到总线上。 接着是ACK信号,数据传输可以由停止条件(P)结束。 为了在最后的ACK信号之后写入多个字节,主机可以继续输出数据而不是发送停止信号。 在这种情况下,MPU-60X0自动递增寄存器地址并将数据装载到适当的寄存器。下图显示了单字节和双字节写入序列:

MPU6050开发 -- 进阶之I2C/SPI通信协议_寄存器_05

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据传输_06

要读取内部MPU-60X0寄存器,主机将发送一个开始条件然后是I2C地址和写入位,然后是要读取的寄存器地址。 主机收到来自MPU-60X0的ACK信号后,发送一个起始信号随后是从机地址和读取位。 结果,MPU-60X0发送一个ACK信号和数据。 通信以无应答(NACK)结束信号和来自主机的停止位。 定义NACK条件,使得SDA线在第9个时钟周期保持高电平。 下图显示了单字节和双字节读取序列。

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据_07

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据传输_08

四、I2C术语

MPU6050开发 -- 进阶之I2C/SPI通信协议_寄存器_09

五、SPI接口(仅限MPU-6000)

SPI 是一个 4 线同步串行接口,使用两根控制线和两根数据线。 标准主从SPI操作期间,MPU-6000始终作为从设备运行。

对于主设备,串行时钟输出(SCLK),串行数据输出(SDO)和串行数据输入(SDI)在从设备之间共享每个SPI从器件都需要自己的片选(/ CS)线
/ CS 在传输开始时变为低电平(有效),在结束时变为高电平(无效)。 一次只有一个/ CS线路处于活动状态,确保在任何给定时间只有一个从站被选中。 未选中的从器件的 / CS 线保持高电平,使 SDO 线保持高阻态(高阻态),从而不会干扰任何有源器件。

SPI操作特性

1、数据首先传递 MSB(最高位),最后传递 LSB(最低位)
2、数据在SCLK的上升沿锁存
3、数据应在SCLK的下降沿进行转换
4.、SCLK的最大频率是1MHz
5.、SPI读写操作在16个或更多时钟周期(两个或多个字节)内完成。 第一个字节包含SPI地址,下一个字节包含SPI数据。 第一个字节的第一位包含读/写位,并指示读(1)或写(0)操作。
以下7位包含寄存器地址。 在多字节读/写的情况下,数据是两个或多个字节:

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据_10

6、支持单个或双个 读/写

MPU6050开发 -- 进阶之I2C/SPI通信协议_寄存器_11

MPU6050开发 -- 进阶之I2C/SPI通信协议_数据_12

 

标签:进阶,高电平,--,通信协议,低电平,SPI,MPU,SDA,I2C
From: https://blog.51cto.com/u_15979522/6085357

相关文章

  • 读书随笔(三)(3)
    三、依赖倒转原则1、目的避免需求变化导致过多的维护工作2、定义高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。每一个逻辑的实现......
  • S5PV210开发 -- 通过 SD 卡烧写
    上文烧写/启动模式提到使用SD卡启动。那么接下来看看怎么做。一、首先备份一开始购买的开发板是Android系统的,将拨码开关调到SD启动模式下。按POWER按钮,备份一份在......
  • 图像和流媒体 -- 帧率、分辨率、码流的概念和关系
    一、帧率、分辨率、码流的概念和关系1、帧率(FrameRate)一帧就是一副静止的画面,连续的帧就形成动画,如电影等。我们通常所说的帧数就是在秒钟时间里传输的图片的帧数,通常用fps......
  • for in (var key in Obj)遍历JS对象/数组
    这个方法还可以遍历数组,就放在一起写了。letresult=function(obj){for(letkeyinobj){returnfalse;//若不为空,可遍历,返回false}returntrue;}conso......
  • JS 删除对象中的某个属性
    方法1删除是删除对象的属性没有任何剩菜剩下的唯一真正的方法但它的工作比其“替代”设置慢100倍object[key]=undefinedvarmyObject={"ircEvent":"PRIVMSG",......
  • calc()语法规则
    1、calc()中的参数是一个计算公式这个计算公式把计算宽度和数值的任务扔给不同尺寸下的浏览器,让页面能够自己得出宽度或数值的结论,这些计算公式也都是很简单的加()减(-)......
  • CSS 中的 :root
    :root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--......
  • spider_ip代理 - 验证
    title:spider_ip代理-验证author:杨晓东&敖昀阳permalink:spider_ip代理-验证date:2021-10-0211:27:04categories:-投篮tags:-demospider_ip代理-验......
  • C# 自定义枚举类型转换
    //stringtoenumEAccountRolevar=(EAccountRole)Enum.Parse(typeof(EAccountRole),RoleManage.Instance.CurrentAccount.Role); //enumtolistpublicIEnumer......
  • 开课博客,顺便把今天的水一下。 2023.2.25
    一、介绍自己  来自信息科学与技术学院的信2105-3班的孟德昊,喜欢打游戏看番剧,不喜欢学习,二、现状,经验和计划 现状就是学习不挂科就算成功,学习不是很上心,主要是没心......