9、详解面试的必答题——I2C协议 (中)


内容简介

2024-02-02

对于从事FPGA行业的应届生来说,在面试过程中很可能会被问到关于I2C协议的一些内容,尤其是碰到比较重视基本功的面试官,答好了,就是大大的加法,答不上了,也是大大的减分。为什么呢?首先因为这个协议简单,简单的都不会必然容易引起人的遐想,其次,它很好的考查了应试者对时序对协议的理解,FPGA玩的就是时序,如果答不上了那就有理由怀疑FPGA学的程度了。故在此笔者将详细的阐述IIC协议,并用AT24C04芯片进行实验。


02

理解下I2C协议


2.1 协议是什么?

    首先我们要想清楚协议是什么?协议是人想出来的,是人为规定的器件之间交流的话,它们是源自于人、源自于生活的,可以说就是将生活中的现象在专业领域用另一种方式进行表述。我们是这些协议的设计者,所以我们将抽象的东西回归到生活,站在一个更高的位置去做宏观的理解,然后带着这种理解去看某个协议,看某篇文档,我想会有不一样的心态或许也会更有效率更有动力,或许心情会好一点,学习要开心嘛。I2C协议亦是如此。它的两根线,一根作为时钟线,在传输数据是按照一定的频率不停跳变,一根双向数据线,由主设备进行控制,这两根线不同的状态就是人为规定的语法,不同状态有序的转换就形成了协议,也就是我们要传输的内容。


    通讯亦如说话,有来有往,对于器件,就是有读有写。如图3是主设备写(输出)一个字节的数据传输格式,如图4所示,是主器件读从器件的数据传输格式。其中,发送到SDA线上的每个字节(写地址、写数据、读数据)必须为8位,每次传输可以发送的字节数量不受限制。“S”是start即开始起始的意思,“P”是stop,即停止结束的意思。 


2.2 协议的整体概述



    根据上图我们可以归纳出,I2C写数据(主设备输出)是由“空闲+起始+写+从应答+停止”来实现的,其中写地址和写数据都是写。I2C读数据是由“空闲+起始+写+从应答+读+主应答+不应答+停止”拼凑起来的。前文说过,I2C通过两根线的不同状态实现了数据交换,现在可以进一步说,是用I2C两根线的不同形式表示了上述的起始、写、读等一些状态,这些状态又按照协议要求进行排列完成了数据内容的交换。所谓的不同形式也就是高电平、低电平、上升沿、下降沿这四种而已,下面我们来分析一下上图的数据传输格式的这些状态。


2.3 I2C的8种状态

1 空闲状态

空闲即为无事所为之状态,在该状态数据线和时钟先均处于高电平。


2 S起始信号

主设备发出起始信号也就意味着通讯的开始,或读或写。起始信号实在时钟为高电平期间将数据线拉低,如图所示。


3 写数据

写数据就是主设备向从设备发送内容,发送内容的关键点是在时钟的低电平期间可以改变数据,在高电平期间要保持数据内容不变,如图所示,在时钟电平数据线从“0”变成了“1”,那么该时钟周期发送的数据则为“1”,为什么高电平要保持呢?这是因为如果在时钟线为高电平期间拉低数据线,则与起始信号冲突,器件有傻傻的分不清,如果数据线由低电平变为高电平,则与停止信号冲突,器件依旧分不清,那还穿什么数呀。


4 从应答

在写数据期间,每发送完一组(8bit)数据,必须由从设备反馈一个应答信号,以示从设备接收到了数据,从应答是在期间主设备释放数据线,由于电路存在上拉电阻,因此数据线为高电平状态,如果期间数据线被拉低,则表示从期间应答。



5 主应答

主应答是应用在主设备连续读期间,当主设备读完一组(8bit)数据,欲读下一组数据时,主设备需发送主应答告知从设备,这个要求不过分吧?主应答是在接收完数据的下一个时钟将数据线拉低即可。


6 不应答

不应答是在主设备读一组数据之后不再读数据了要告知从设备的一种状态信号,也就是在读完一组数据后的下一个时钟不要将数据线拉低即可。

7 读数据

读数据即为从设备将数据内容在时钟的伴随下发送给主设备,此时主设备要释放数据线,数据线交由从设备控制,从设备也是在时钟低电平期间发送数据,高电平期间维持数据不变。


8 P 停止信号

无论是读还是写,该信号的出现都标志着一次操作的完成,其方式时钟的高电平期间将数据线有低拉高。随后便进入了空闲状态。

    以上八种状态的组合就会实现数据的交换如图所示,接下来就以AT24C04为例阐述I2C协议的实际应用。









快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<