两者都可以传输数据,但从设备不能发起传输,传输由主设备控制。
4.费率:
普通模式:100kHz;
快速模式:400kHz;
高速模式:3.4MHz;
草案
1.空空闲状态
当I2C总线的SDA和SCL信号线同时处于高电平时,定义为总线的空空闲状态。此时各器件的输出级场效应管处于关断状态,即总线释放,电平由两条信号线的上拉电阻上拉。
2.开始位和停止位的定义:
起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。3.确认
每次发送器发送一个字节,数据线在时钟脉冲9期间被释放,接收器反馈一个响应信号。当响应信号为低电平时,指定为有效响应位,表示接收方已成功接收字节;当响应信号为高电平时,它被指定为非响应位,这通常表示接收器未能接收到该字节。反馈有效响应位ACK的要求是接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并确保在该时钟的高电平期间保持稳定的低电平。如果接收器是主机,在接收到最后一个字节后,它会发送一个NACK信号,通知受控发送器结束数据传输,并释放SDA线路,以便主机接收器可以发送停止信号p。
逻辑分析仪的采样结果如下图所示:释放总线后,如果没有响应信号,sda应该一直保持在高电平,但如图中蓝色虚线所示,它被下拉到低电平,证明已经收到响应信号。
给我们的两个信息是:1)接收方拉SDASCL上升沿之前的低水平期间为低;2)响应信号保持到SCL下降沿结束;如上面红色标记所示。
4.数据有效性:当I2C总线用于数据传输时,当时钟信号处于高电平时,数据线上的数据必须保持稳定。只有当时钟线上的信号处于低电平时,数据线的高电平或低电平状态才能改变。
我的理解:虽然只要求在高电平期间保持稳定,但是应该有一个提前,就是数据要在SCL上升沿之前准备好,因为之前的文章——I2C总线概述中已经指出,数据是在SCL上升沿驱动到器件中的。
5.数据传输:
I2C总线上传输的每一位数据都有相应的时钟脉冲,即在SCL串行时钟的配合下,每一位数据都在SDA上逐位串行传输。数据位的传输由边沿触发。
工作过程
总线上的所有通信都由主机发起。在交流中,主人和被控制者总是扮演两个不同的角色。
1.主设备向从设备发送数据
主设备发送起始位,通知总线上的所有设备传输已经开始。然后主机发送设备地址,匹配此地址的从机继续传输过程,其他从机忽略下一次传输,等待下一次传输开始。主设备寻址从设备后,发送从设备的内部寄存器地址进行读取或写入;之后,发送数据。数据传输完成后,传输停止位:
写作过程如下:
发送开始位
发送从设备的地址和读/写选择位;释放总线,等到EEPROM拉低总线进行应答;如果EEPROM接收成功,则进行应答;若没有握手成功或者发送的数据错误时EEPROM不产生应答,此时要求重发或者终止。发送想要写入的内部寄存器地址;EEPROM对其发出应答;发送数据发送停止位.EEPROM收到停止信号后,进入到一个内部的写入周期,大概需要10ms,此间任何操作都不会被EEPROM响应;详细信息:
需要注意的是:主控制器通过发送地址码与对应的被控设备建立了通信关系,而与总线相连的其他被控设备同时收到了地址码,但由于与自己的地址不一致,提前退出了与主控制器的通信;
2.主控制器读取数据的过程:
阅读过程比较复杂。在从从机读取数据之前,您必须先告诉它您要读取哪个内部寄存器,因此您必须先写入它:
发送起始位;发送slave地址+write bit set;发送内部寄存器地址;重新发送起始位,即restart;重新发送slave地址+read bit set;读取数据主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。 发送停止位详细信息:
为了加深对I2C公交的理解,用C语言模拟IIC公交,边看源代码边看波形:
写操作的时序图如下图所示:
本文转载自bitart在Blog Park的博客,并进行整理。
1.《I2C总线 I2C总线详解》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《I2C总线 I2C总线详解》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1799482.html