I2C协议学习笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接:https://blog.csdn.net/wzt_007/article/details/78622698
通讯分为四大步骤,握手、数据交换、准备结束、正式结束算法

如如下场景:安全


 两个陌生人是进行沟通,为了显得更有主次关系,选取老板和新员工进行沟通的场景,老板通常占有主动权,并且手中有新员工的基本信息,好比姓名,年龄,性别等。沟通开始:编码

    老板:“XXX,欢迎你加入咱们公司,为公司注入新的血液!”伸出握手姿式              —— 主握手.net

    新员工:“承蒙厚爱,有幸加入咱们公司,我以为是一种光荣!”握手                      —— 握手成功blog

    老板:“想必已经读过员工手册了吧,说说你对前两条的理解。”                            —— 执行沟通it

    新员工:“第一条……,第二条……”                                                                    —— 从应答原理

    ……扩展

    老板:“回答的很好,确实是咱们迫切想招募的人,之后看你的精彩表现了!”        —— 主要求沟通结束总结

    新员工:“必定不负厚望,必努力工做!”                                                            —— 从作好结束准备命名

    老板离开                                                                                                             —— 沟通结束

主从器件

在通讯的时候,总线上必须且只能有要有一个为主器件,其余的都为从器件
在总线上表现为主控的器件叫作主发送器/接收器(MASTER TRANSMITTER/RECEIVER),主器件只执行发送,不执行接收的,命名为主发送器(MASTER TRANSMITTER)

在总线上表现为被控的器件叫作从发送器/接收器(SLAVE RECEIVE/RTRANSMITTER),有些从器件只执行接收,不执行发送的,命名为从接受器(SLAVE RECEIVER)

一条I2C总线最多能挂多少个器件?

串行数据都是以一个字节一个字节的方式来衡量的,前几位用来表示地址(上述对话中的员工名字),地址的最后一位为读写操做位(READ/WRITTE位,简写为R/W,逻辑1表示读,逻辑0表示写),以最开始的一个字节做为地址来算的话,那么除去字节的最后读写标志位,就剩 8 – 1 = 7bit了,因此理论上以1个字节为地址来算的话,就能够分配2的7次方128个地址,就能够挂上128个器件(极端状况,假设这128个器件都是从机的话,就还须要挂一个主器件,合计就是128 + 1 = 129个器件了)。要是想挂更多的器件,那么就须得将地址位扩展,好比将前两个字节做为地址,去掉最后的一位读写标志位

以上是理论的算法,在实际的器件中,都是以第一个字节做为地址的,并且大部分的器件的地址高四位已经被根据不一样功能的芯片分配了不一样的编码(例如,AD/DA转换芯片PCF8591的前四位为1001,E2PROM芯片AT24C02的前四位为1010,具体的芯片就得查查手册了,这里只说明原理),那么同一种功能芯片(地址前4位都相同)最多只有 8 – 4 – 1 = 3位用来分配地址了,也就是最多能够挂2的3次方8个同种功能芯片。用一个问题来深化理解一下。

握手与结束

 I2C协议有规定,在SCL和SDA均为高电平的前提下,检测到SDA有降低沿信号,则创建I2C的通讯开始;一样的,在SCL为高电平,SDA为低电平的前提下,检测到SDA有上升沿信号,则I2C通讯正式结束。

由图中虚线框中引出的:总线闲的时候,两根信号线都是高电平的。无论是通讯创建和通讯结束阶段,SCL都是高电平,SDA的变化控制着通讯的创建与结束;在SCL为高电平的状况下,SDA信号的转变就对通讯起着强制性做用,要么通讯创建,要么通讯正式结束,有且仅有这两种状况!也就是说,在数据交换的过程当中,要对SCL这根信号线尤其注意,在数据变化的时候,必定要保证SCL是为低电平!让数据的变化在SCL的“安全”状态下进行,因此须要牢记一点,数据变化,时钟线低电平先行,以下图所示。

 

通讯

在每次写数据的时候,每写一个字节数据(不管是必要的从器件地址数据、从器件控制数据,仍是须要写到从机里的数据),从器件都有一个ACK(从器件的应答实现是将SDA线拉成低电平,因此在写完第8位数据之后,切记要把SCL的电平拉成低电平,等一小段时间之后,在将数据线拉高去读SDA的数据,缘由在握手和结束讲了。读数据时,主器件每接收到从器件的一个字节数据,也都要回复一个ACK,主器件ACK有两种,一种表示收到数据,且准备接收下一次数据(0,ACK),一种是收到数据,但不许备接收下一次数据(1,NO ACK)

我总结的读写流程,若是有问题,欢迎你们指出

读:

start>>(主:地址)>>(从:first_Data)>>(主:ACK)>>(从:second_Data)>>(主:ACK)>>(从:third_Data)>>(主:NO ACK)>>stop

start>>(主:地址)>>(从:ACK)>>(主:first_Data)>>(从:ACK)>>(主:second_Data)>>(从:ACK)>>(主:third_Data)>>(从:ACK)>>stop————————————————版权声明:本文为CSDN博主「wzt_007」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/wzt_007/article/details/78622698

相关文章
相关标签/搜索