I2C协议,几点干货,配合设备讲解

如果排查的思路对你有帮助,请记住 消雨匆匆 or  大吊工。 码字和排查很累,仅此而已


下面转载的博文讲的详细,我这里补充几点:

1、I2C协议上 控制器/芯片

控制器是主处理器端,只有读,写两个机制,基本可以看懂。而芯片端(就是被访问的芯片),下面的的博客给出了例子,芯片的手册一般会要访问的寄存器也叫地址(下面博客叫做控制寄存器,还是叫控制寄存器合适一些),所以要和从设备地址区分开,所以,在读数据之前就要先将地址信息写过去,然后才能准确地读数据,大概的概念就是:

read:去读一个设备,主设备先发送设备地址+写标志+从设备的ACK,主设备还要发要读的控制寄存器(EEPROM里面是地址)+从设备ACK。这一步名义上是写,但是一个dummy wrrite,也就是没有实际操作意义,然后主设备先发送设备地址+读标志+从设备的ACK,主设备还要发要读的控制寄存器的数据读到

write:去写一个设备,主设备先发送设备地址+写标志+从设备的ACK,主设备还要发要写的控制寄存器+从设备ACK,然后再重新发送

补充:一些简单的设备,没有控制寄存器,所以直接只有设备一个地址,读写即可。

2、ACK后面的一个脉冲是怎么回事

谈论这个问题的时候,首先要讨论主从控制权问题,我们知道I2C都需要加上拉电阻,因为是OD输出,不论从设备还是主设备,只要控制就可以拉低。

协议上我们知道,主设备只有发完读写控制信号的时候,要等待中,所以此时没有了SDA的控制权,而从设备回复ACK的之后也没有了SDA的控制权,因此SDA此时要被拉高一段时间,当主设备处理完ACK反应过来要控制的时候,又掌握了控制权,这个空闲时间就会造成,SDA上有个小尖峰。这种情况使用一些I2C控制器比较常见,用GPIO模拟时序会比较少见

 

3、代码实现过程

见下面博客内容

 

4、CLK到底是谁控制

CLK由大部分时间主机控制,凡事例外,这个CLK信号可以作为从设备没准备好的一个反馈,就是说我从设备没有就绪,或者异常的时候,我从设备就去控制CLK拉低,告诉你主机等待。

 

 

 

 

 

转载自这位大神:

https://www.cnblogs.com/hechengfei/p/4117840.html

 

1.Abstract

    前些天借用他人的一块MCS-51开发板来做实验,不想这块板子与我刚开始接触MCS-51的板子一样,实在是太亲切了!现在回过来看这块板子,功能算不上是太强大,麻雀虽小五脏俱全,该有的功能都有。于是又忍不住捣腾这块板子,倒不是写小程序一块,看着电路图,到处连线测试一下功能,从中体会下最初的学习兴奋感觉。

    最初板子里边最难学会的有两处,一处是由I2C上挂上的一些器件,另外一处是基于DS18B20的一线传输协议,当初花了好大气力去学习,仍旧一头雾水的情景仍记忆犹新。现在回过来看,觉得当时最大的问题是不注重对时序的分析,不能完全理解总线传输协议,毕竟理解是随着时间的增加而逐步深刻的。看到这两大部分,虽然是几个小小的芯片,但心底有不少的辛酸感。现在的理解也不能算完全,我想尽可能的用现在的所学将这两大部分分别写下来,权当是一个巩固学习的过程。

2.Content

  2.1 协议分析

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

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

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

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

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

    ……

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

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

    老板离开                                                                                                             —— 沟通结束

    为了跟后边的描述更贴切,在实景对话的后边做了一定的注释,将沟通的过程抽象出来。从上面的对话可以看出,沟通分为四大步骤,握手、数据交换、准备结束、正式结束。I2C的通信也氛围这样几大步骤,值得注意的是,在通信的时候,总线上必须要有一个为主器件,其他的为从器件。有些器件它既可以是主器件,又可以是从器件,但是它们在总线上的特定时候只有一种模式,要么是主器件模式,要么是从器件模式,否则就混乱了。

    把那些在特定时候器件作为主器件,即在总线上表现为主控的器件叫做主发送器/接收器(MASTER TRANSMITTER/RECEIVER),有些主器件只执行发送,不执行接收的,命名为主发送器(MASTER TRANSMITTER);那些在同时候作为从器件,即在总线上表现为被控的器件叫做从发送器/接收器(SLAVE RECEIVE/RTRANSMITTER),有些从器件只执行接收,不执行发送的,命名为从接受器(SLAVE RECEIVER)。它们在同一个总线上的连接可以如FIG2.1所示。

imageFIG2.1 I2C总线的器件连接

    值得强调的一下是 同一时刻,总线上只有一个器件配置为主器件,而其他的只能作为从器件!

    I2C协议是典型的二线通信,确切的讲,应该是三根(SDA串行数据线,SCL串行时钟线,GND共地线),如上图所示。

    那么,一条I2C总线最多能挂多少个器件呢?一般来说,串行数据都是以一个字节一个字节的方式来衡量的,前几位用来表示地址(上述对话中的员工名字),地址的最后一位为读写操作位(READ/WRITTE位,简写为R/W,逻辑1表示读,逻辑0表示写),以最开始的一个字节作为地址来算的话,那么除去字节的最后读写标志位,就剩 8 – 1 = 7bit了,所以理论上以1个字节为地址来算的话,就可以分配2的7次方128个地址,就可以挂上128个器件(极端情况,假设这128个器件都是从机的话,就还需要挂一个主器件,合计就是128 + 1 = 129个器件了)。要是想挂更多的器件,那么就须得将地址位扩展,比如将前两个字节作为地址,去掉最后的一位读写标志位,就剩下 8 + 8 – 1 = 15 bit了,所以以2个字节为地址来算的话,就可以分配2的15次方32768个器件(当然,极端情况下可以多挂一个主器件,合计就是32768 + 1 = 32769个器件了)。要是还想挂更多的器件,方法就如上述了,将前几个字节作为地址,最后一位作为读写标志位,具体的算就不展开了。

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

    一条I2C总线上最多可以分别挂多少个PCF8591芯片和多少个AT24C02芯片呢?它们能同时挂在总线上吗?若能,请将它们的地址全部列出来。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值