如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78611309
上一篇基本概念讲了一通,大体上对MPU6050有了一个了解。对于MPU6050开发来讲主要的应该就是 I2C/SPI 通信和寄存器控制了吧。
接下来我们继续看芯片手册,简单了解一下I2C/SPI通信协议。(S5PV210开发里再综合详讲)
I2C 和SPI 都是串行同步通信,同步通信和异步通信区别是什么?这一点我们刚讲过,参看:S5PV210开发 -- 通信
MPU-6000 / MPU-6050的内部寄存器和存储器可以使用400 kHz的I2C 或 1MHz的SPI(仅MPU-6000)访问。 SPI工作在四线模式。
注意:
为了防止在使用SPI(MPU-6000)时切换到I2C模式,应通过设置 I2C_IF_DIS 配置位来禁用 I2C 接口。 在等待 6.3节“寄存器读/写启动时间”指定的时间后,立即执行该位设置。
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的读地址和写地址是什么呢?
主机在总线上启动 START 条件(S)时启动 I2C 总线通信,总线定义为 SCL 线为高电平(见下图)时,SDA 线从高电平变为低电平。 总线被认为是繁忙的,直到主机在总线上放置一个停止条件(P),在SCL为高电平(见下图)时,在SDA线路上定义为从低电平到高电平的跳变。
此外,如果产生一个重复的START(Sr)而不是STOP条件,总线将保持忙碌状态。
I2C 数据字节定义为8位长。 每个数据传输传输的字节数没有限制。 传输的每个字节必须跟一个应答(ACK)信号。 应答信号的时钟由主器件产生,而接收器通过下拉 SDA 并在应答时钟脉冲的高电平期间保持低电平来产生实际的应答信号。
如果一个从机处于繁忙状态,并且在某个其他任务执行之前不能发送或接收另一个数据字节,则它可以保持SCL为低电平,从而强制主机进入等待状态。 当从站准备好时,正常的数据传输恢复,并释放时钟线(参见下图)。
扩展:
应答信号的时钟由主器件产生,这句话让我想起先前做 DM368 编码的时候出现无应答的问题。
参看:DM368开发 -- 编码并实时播放
在开始与起始条件(S)的通信之后,主机发送一个7位从机地址,然后是第8位(读/写位)。 读/写位指示主器件是从正在接收数据还是正在写入从器件。 然后,主器件释放SDA线并等待来自从器件的应答信号(ACK)。 传输的每个字节后面都必须有一个应答位。 为了应答,从器件将SDA线拉低并在SCL线的高电平期间保持低电平。
数据传输始终由具有STOP条件(P)的主机终止,从而释放通信线路。 但是,主器件可以产生一个重复的起始条件(Sr),并在不首先产生停止条件(P)的情况下寻址另一个从器件。 SCL为高电平时,SDA线上的低电平至高电平转换定义停止条件。 除了启动和停止条件之外,所有SDA变化都应在SCL低电平时进行。
===============================
翻译的真乱,简单点说就是:
数据传输: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自动递增寄存器地址并将数据装载到适当的寄存器。下图显示了单字节和双字节写入序列:
要读取内部MPU-60X0寄存器,主机将发送一个开始条件,然后是I2C地址和写入位,然后是要读取的寄存器地址。 主机收到来自MPU-60X0的ACK信号后,发送一个起始信号,随后是从机地址和读取位。 结果,MPU-60X0发送一个ACK信号和数据。 通信以无应答(NACK)结束信号和来自主机的停止位。 定义NACK条件,使得SDA线在第9个时钟周期保持高电平。 下图显示了单字节和双字节读取序列。
SPI 是一个 4 线同步串行接口,使用两根控制线和两根数据线。 标准主从SPI操作期间,MPU-6000始终作为从设备运行。
对于主设备,串行时钟输出(SCLK),串行数据输出(SDO)和串行数据输入(SDI)在从设备之间共享。 每个SPI从器件都需要自己的片选(/ CS)线。
/ CS 在传输开始时变为低电平(有效),在结束时变为高电平(无效)。 一次只有一个/ CS线路处于活动状态,确保在任何给定时间只有一个从站被选中。 未选中的从器件的 / CS 线保持高电平,使 SDO 线保持高阻态(高阻态),从而不会干扰任何有源器件。
1、数据首先传递 MSB(最高位),最后传递 LSB(最低位)
2、数据在SCLK的上升沿锁存
3、数据应在SCLK的下降沿进行转换
4.、SCLK的最大频率是1MHz
5.、SPI读写操作在16个或更多时钟周期(两个或多个字节)内完成。 第一个字节包含SPI地址,下一个字节包含SPI数据。 第一个字节的第一位包含读/写位,并指示读(1)或写(0)操作。
以下7位包含寄存器地址。 在多字节读/写的情况下,数据是两个或多个字节:
6、支持单个或双个 读/写
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78611309