我是靠谱客的博主 故意羊,最近开发中收集的这篇文章主要介绍Arduino学习笔记(9) ---- IIC(inter-integrated circuit)通信协议时序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

1. 内部寄存器可通过400kHz 的I2C 接口或1MHz 的SPI 接口来操作。

2 .I2C 接口

二线接口,包括串行数据线(SDA)和串行时钟线(SCL)。连接到I2C 接口的设备可做主设备从设备。主设备将Slave 地址传到总线上,从设备用与其匹配的地址来识别主设备。

当连接到系统芯片时,MPU-60X0 总是作为从设备。SDA 和SCL 信号线通常需要接上拉电阻到VDD。最大总线速率为400kHz。

MPU-60X0 的Slave 地址为b110100X,7 位字长,最低有效位X 由AD0 管脚上的逻辑电平决定。这样就可以允许两个MPU-60X0 连接到同一条I2C 总线,此时,一个设备的

地址为b1101000(AD0 为逻辑低电平),另一个为b1101001(AD0 为逻辑高)。

3. I2C 通讯协议

开始(S)和结束(P)标志

开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。

停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。


3.1. 数据格式/应答

      响应信号(ACK):处理器把数据发给外接IIC设备,如何知道IIC设备数据已经收到呢?就需要外接IIC设备回应一个信号给处理器。处理器发完8bit数据后不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到

I2C 的数据字节定义为8-bits 长度,对每次传送的总字节数量没有限制。对每一次传输必须伴有一个应答(ACK)信号,其时钟由主设备提供,而真正的应答信号由从设备发出,在时钟为高时,通过拉低并保持SDA 的值来实现。

IIC数据从最高位开始传输。

再看数据怎么传:SDA上传输的数据必须在SCL为高电平期间保持稳定:因为外接IIC设备在SCL为高电平的期间采集数据方知SDA是高或低电平。SDA上的数据只能在SCL为低电平期间翻转变化

 

如果从设备忙,它可以使SCL 保持在低电平,这会强制使主设备进入等待状态。当从设备空闲后,并且释放时钟线,原来的数据传输才会继续。

 

3.2.通信

开始标志(S)发出后,主设备会传送一个7 位的Slave 地址,并且后面跟着一个第8位,称为Read/Write 位。R/W 位表示主设备是在接受从设备的数据还是在向其写数据。然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。应答产生时(既把SDA拉低),从设备将SDA 线拉低并且在SCL 为高电平时保持低。数据传输总是以停止标志(P)结束,然后释放通信线路。然而,主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。综上可知,所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志

 

 

 

如果要写MPU-60X0 寄存器,主设备除了发出开始标志(S)和地址位,还要加一个R/W 位,0 为写,1 为读。在第9 个时钟周期(高电平时),MPU-60X0 产生应答信号。然后主设备开始传送寄存器地址(RA),接到应答后,开始传送寄存器数据,然后仍然要有应答信号,依次类推。

单字节写入时序

连续写入时序

如果要读取MPU-60X0 寄存器的值,首先由主设备产生开始信号(S),然后发送从设备地址位和一个写数据位,然后发送寄存器地址,才能开始读寄存器。紧接着,收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位。然后,作为从设备的MPU-60X0 产生应答信号并开始发送寄存器数据。通信以主设备产生的拒绝应答信号(NACK)和结束标志(P)结束。拒绝应答信号(NACK)产生定义为SDA 数据在第9 个时钟周期一直为高

单字节读出时序

连续读出时序

4.I2C 说明

5.串口注意事项(MPU-6050)

11.1 MPU-6050 支持接口

在其主要串行接口和辅助接口都支持I2C 通信。

11.2 逻辑电平

MPU-6050 的I/O 逻辑电平可设为VDD 或VLOGIC,如下表所示。

辅助逻辑电平VLOGIC可能设置为VDD或另一个电压。但是总有VLOGIC≤VDD。当AUX_VDDIO 为0 时(其上电复位值),VLOGIC 同时为微处理器总线和辅助I2C 总线供电;当AUX_VDDIO 为1 时,VLOGIC 为处理器总线供电,VDD为辅助I2C 总线供电。

 

最后

以上就是故意羊为你收集整理的Arduino学习笔记(9) ---- IIC(inter-integrated circuit)通信协议时序的全部内容,希望文章能够帮你解决Arduino学习笔记(9) ---- IIC(inter-integrated circuit)通信协议时序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部