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 IIC (Inter-Integrated Circuit) 是一种数字通信协议,用于在多个Arduino设备之间进行通信。它使用两根信号线(SDA和SCL)来实现设备之间的数据传输。在IIC通信中,有一个主设备和一个或多个从设备。主设备控制通信的开始和结束,并发送命令和数据给从设备,从设备接收并执行主设备发送的命令。 在给定的引用代码中,主设备通过IIC协议向从设备发送x的值。根据引用中的主设备代码,x的值以1的步长递增,并且如果x大于6,则重置为0。然后,主设备延迟200毫秒,然后再次递增x的值,并将其发送给从设备。 从设备的代码根据引用中的描述,将接收主设备发送的x的值。如果x的值小于或等于3,则引脚13处的LED灯将开启;否则,LED灯将关闭。 综上所述,ARDUINO IIC是一种用于在多个Arduino设备之间进行通信的协议。主设备通过IIC协议向从设备发送数据,并且从设备根据接收到的数据执行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [arduino——I2C通讯](https://blog.csdn.net/m0_46152804/article/details/125130186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Techblog of HaoWANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值