找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2165|回复: 1
收起左侧

从设计角度理解I2C总线

[复制链接]
ID:266429 发表于 2017-12-25 20:49 | 显示全部楼层 |阅读模式
看了一些书,没能完全理解。不理解就只能照抄别人的东西,这个没意思。于是,抛开所有的书,站在设计者的角度,来自己设计一下。(个人见解啊)
首先,不是说什么I2C总线,而是先确定是由两条线来实现两个器件之间的通讯。
第二,因为两个器件都要有对数据的处理,因此两个器件都会有微处理器也即你必须将主从器件都当作微处理器来对待,所以,在设计时,必须对两个器件的端口要一同考虑,对各器件的内部也要考虑处理程序,而不是象现在的教科书上对主器件说得多,而对从器件说得太少。
第三,根据第二条,我们在设计时必须同时考虑到主从器件四个端口的工作,包括时序图中也应该有四个端口的状态,而不应该在时序图中只考虑线上状态。
第四,就是确定一次传输一字节,而且做到双向传输。
以上是在设计总线时的几个原则,都很重要。其中第二条,关系到总线标准或者说是规格问题,不同的处理方式,就会产生不同的标准,进而关系到这个标准之下的所有的器件的设计及生产标准。
好了,依据以上,我们现在开始设计。
一、传输方式设计
设计的第一步,是先确定采用两条线的方式,能否实现传输,以及传输的方式也就是标准。这是这个总线的核心,就象发动机的核心机一样,确定了这个核心之后,才能在这个基础上完成其它的要求,比如寻址、区分数据与命令。另外,可以实现通讯的传输方式可能有多种,你要根据后续功能需要来确定最优方式。
传输设计的第一步,是对器件的初始值的确定。其它的初始值这里不考虑,只考虑四个端口的工作方式。我们知道有四种方式,我们可以采取穷举法,这里先设定四个端口均设置为准双向方式,这个方式下,每条传输线上的值就是两个端口输出值的“与”,即两个端口同时输出高电平,线上才是高电平,这个很重要,我们知道器件要检测传输线的电平状态变化的。
我们再确定两条线的工作分工,这个分工,我们在以下的设计中确定。
  • 启动信号
    然后器件开始工作,第一步当然是主器件要告诉从器件:我准备要向你传输了。那就发一个信号吧?我们先看看发一个从低到高的电平,对方能不能感觉到变化:如果对方输出的是高,那么线上就会从低电平变化为高电平,这个就有变化,能行;如果对方输出的是低电平,那线上依然是低电平,这个就行不通了。这就确定了一个可行方案:确定两条线中的一条线来做传输启动信号,初始设置主器件端为低电平,从器件端为高电平。当然,这个不是I2C的标准。我们在后面的设计中可以理解为什么I2C不采用这个方案。
    我们再来看看I2C的方案即第二个方案,确定由一条线做启动,两端口初始设置均为高电平,主器件发低电平,线上则变为低电平,从器件就检测到了变化。
    前面说过,主从器件均作为微处理器看待,从器件在设计中,在待机时,一是要将此端口设为高电平,二是要不断检测这个端口的状态,一旦检测到了变化,则立即转入接收状态。
    这里有个问题,按说另一条线即数据线的状态对这个启动是没有影响的,它两端的电平是不需要初始化的,但我看现在的程序中都进行了初始化,有必要么?还有现在的程序中开头就进行了时钟线的两端拉高然后再拉低,这个已经在初始化时拉高过,以及每一次传输完成后都进行了拉高,有必要再拉高一次么?有兴趣的可以实验验证一下,如果真是这样,那程序就可以减减肥了,这也是我们在做程序应用时,从设计角度充分理解其原理的原因。
    这里思考一下:从机检测到也就是接收到信号并完成接收准备工作后,要不要对主器件做一个应答说我准备好了?有没有必要?I2C是没有的,这个在I2C里面是对的,但如果做其它的总线设计,则是必须考虑到的。
  • 传输字节
    首先确定是一次传输一个字节即八位,这个没说的。然后是先高位后低还是先低后高的确定,这个理论上都可以,你自己定就是了。I2C选择的是从高到低。如果你选择先低后高,那就不是I2C总线标准了,你自己得另外起个名字。
    然后确定用哪条线来传,这个先确定采用另一条线来专门传送字节,给这条线起个名字“数据线”。
    先传送第一位,将其值放在数据线上,并告诉从器件可以读数据了,然后从器件读,放一位就告诉一次并让对方读一次,这个“告诉”的工作,就分给那条“启动”线了,这个时候我们可以给这条线起个名字叫“时钟线”。怎么读?什么时候读?这个就要考虑在发送数据之前的四个端口的电平初始值设计了。首先数据线接收端口必须输出高电平,这样发送端的变化才能直接影响数据线电平的高低。
    然后就是时钟线两端的初始电平设计。因为从器件要跟着主器件的端口电平变化来区分位数变化,故其端口应输出为高。主器件理论上在这一步设为高或低是都可以的,考虑到后面的其它工作,I2C确定的是低电平。这里从器件还要做的一件事是不断检测时钟线电平。
    初始设置完成了,根据前面的分析,数据第一位在时钟线低时放在数据线上,稳定后(这就是延时的来由)主器件拉起时钟线电平以告诉从器件可以读第一位数据了。从器件在一定时间内读取,主器件认为在这个时间内已经读取了数据线上的电平,然后拉低电平,稳定后在数据线上放上第二位,再重复至所有八位传输完成。
  • 应答
    从器件收完八位数,主器件就停下,需要确认从器件是否收到了这一字节数据,那么从器件就要给个答复。这个信号必须由从器件发出。再次强调在理解这个总线的原理时必须同时考虑从器件。
    我们知道在主器件发送数据时,从器件的两个端口输出的都是高电平,那么理论上,我们可以让任一条线上从器件的端口输出低电平来告诉主器件,这时只需要主器件对应端口输出高电平就行了,然后主器件对此线的电平进行检测,如果是低电平,则判断收到了从器件的应答信号,否则主器件就认为从器件没能完成这段字节的接收(这个情况主器件就要另外处理了)。
    I2C是选择的哪种方式?自己查。
  • 传输结束
    这个是主器件的事,它说传完了,得告诉从器件,也就是说,这个信号,得主器件来发出。
    既然是主器件发信号,那从器件的接收端必须设置为高电平输出。但这时,从器件也有了一个条件,知道主器件已经发完一段数据了,有可能会发终止信号,也有可能继续发送数据(这种总线设计方案,有没有继续发送数据的可能,需要在后面的设计中从理论上论证)。在接收终止信号这点上,从器件与启动时的准备是有区别的。这种条件上的区别,在总线设计时是必须考虑到的。
    做不同的事,就要有不同的信号或者说是对不同状态的判断。前面已经用了几种了,我们得找一种与前不同的状态。前面放数据位时,是主器件让时钟线在低位;应答时,数据线是从器件让其在低位。那么,我们在终止时,主从器件让时钟线在高位,主器件让数据线在低位(这个时候,从器件端口输出高与低,有没有关系,可以再思考一下),是不是跟其它情况有区别?当然有了,就用它了。
    以上,完成了主器件向从器件的数据传输,包括启动、字节传输、从器件的应答、主器件决定传输结束。到此为止,可以说,核心机已经完成了。

  • 形成总线标准
    以下,就是验证这个核心机能否完成其它的功能:

  • 从器件使能;
  • 命令与数据的区分;
  • 从器件数据读出;
  • 从器件的数据存放及读出的数据地址;
  • 数据连续传输的可能;
  • 多从器件的可能及寻址;
  • 多主器件的可能及竞争;
  • 其它。
    以上完成后,就是细节的制定,也是标准的内容之一了。在论证的过程中,如果有任意一项达不到,就要考虑从头设计了,甚至考虑两线方式是否合适(注意第7项其它)。当然,如果某一功能不能实现,也不能说这个总线标准就是废物,要看你用在哪。
    以上所有完成之后,才成为一种总线标准。

  • 其它说明
    两线方式有很多种,I2C的方式,属非固定波率方式,也就是说节拍没有固定时间间隔,甚至节拍没说要固定一致,就是说你一会快一会慢也是可以满足要求的。这点,对我们后面的验证及实践很重要。
    时序图中一定要有四端口的时序图,然后才是四端口的时序“与”之后的线上时序图,不然理解起来真的困难,反正我是被现在的时序图弄晕了。
    四、验证方法
    I2C验证的最好方法,当然是用两片单片机来实现,这种方法,你可以彻底了解这个总线。
    第二种简易方法,不用逻辑分析仪而是很直观地用LED,就是自己搭建电路,将时钟线(注意是时钟线上电平,下数据线同)的状态送到另外的端口接一个LED,数据线的状态送到另外八个端口接LED,你可以延时设定每过2秒送一位数据,这样你连从器件的应答都可以同步观测到了,结束也可以观测到了,起始状况、数据传输各位是否正确等等,可以立即发现你的程序的问题,比逻辑分析仪还直观迅速。这种方式,也可以延伸到固定波特率传输,当然不能照抄。
    PS1:实现一种功能,办法是很多的,“标准”只是办法之中的一种,它不能在你心中成为对你的约束,否则就是对人类智能的侮辱。
    PS2:学习别人的方法,才是人才的做法,不然就是机器。
    PS3:实在不想写了,交差。
    PS4:信了你的邪,这就三千多字了?我已经在偷懒啊,破底线了!!!
    PS5:有兴趣将后面论证的东西补充一下,就是一篇不错的论文。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:266429 发表于 2017-12-26 07:59 | 显示全部楼层
呃,在需要论证的项目里面,还有一个很重要的东西,那就是传输速率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表