说在开头:关于爱因斯坦-罗森桥(1)
爱因斯坦到了漂亮国之后发表了三篇重大的论文,其中的两篇:关于引力波和ERP佯谬;我们在前面已做了详细的介绍,对物理学界有着非常重大的影响。其中ERP佯谬(描述了“量子纠缠”现象)更是引出了后来的“薛定谔的猫”和“维格纳的朋友”,将微观世界的“怪异”性带到了宏观世界中来。
爱因斯坦-罗森桥理论有一个更形象和更广为人知的名字:虫洞,而虫洞也将是智慧生命逃离衰亡宇宙的最后途径。早在爱因斯坦之前,就有人发现并普及了“虫洞”的想法,那个人就是查尔斯.道奇森(笔名:刘易斯.卡罗尔),他在《爱丽丝梦游仙境》中描写了这么一个兔子洞,将英国的乡村和仙境连到了起来;作为数学家的道奇森显然非常熟悉这些“多连通空间”。
1916年,奥地利物理学家路德维希·弗拉姆在回顾“史瓦西解”时,意识到另一种解也是可行的,他描述为“白洞 ”( 即黑洞的理论时间反转),黑洞和白洞的入口都可以通过时空导管连接。理论物理学家在分析白洞解的时候,通过爱因斯坦的思想实验发现了宇宙时空自身是可以不是平坦的。如果恒星形成了黑洞,那么时空在史瓦西半径(即视界的地方与原来的时空垂直),在不平坦的宇宙时空中,这种结构就意味着黑洞。视界内的部分会与宇宙的另一个部分相结合,然后在那里产生一个洞,而这个洞可以是黑洞,也可以是白洞!这个弯曲的视界,就叫做“史瓦西喉”(如下图,看起来就像一个喉咙),它就是一种特定的“虫洞”。
1935年爱因斯坦和纳森.罗森对虫洞理论进行了完善,他们试图将黑洞看作基本粒子的模型(爱因斯坦的广义相对论公式无法解“奇点”( 质量无限大的点),所以爱因斯坦很讨厌这样的点),我们通常认为电子是一个小点而没有任何结构,他们用黑洞来代表一个电子,采用这种方式之后,他们从标准黑洞解出发,将它和另一个翻转的黑洞解合并在一起。对爱因斯坦来说,这个奇怪但光滑的结构在黑洞原点没有奇异性,其作用像一个电子。(参考自:加来道雄-平行宇宙)
一,IIC总线协议
刚进公司工作时,我的导师也不过是刚毕业3年的小伙子,他自封为“教主”,带着一帮刚进公司1,2年的“护法”们,大家打成一片。他整天忙于组内多个硬件项目的管理、各种资源协调、组织问题的攻关,帮同事收发快递等等,还带了我们三个新员工,所以不可否认的是:王雪峰老师基本也没时间给我什么硬件技术上的指导,哈哈,但这并不能因此就说他不是一个好导师。相反非常怀念那半年的时光,合适的工作强度与良好的工作氛围,一切都是那么的积极且充满希望。
后来王雪峰老师可能觉得这样培养新员工,估计会把我们搞费掉,所以就对我们说:咱们组以后每周搞一次技术分享吧,零食我来买,大家吃吃喝喝的轻松把技术知识搞明白了。记得这第一次的技术分享让我来准备,主题是IIC总线;那次的IIC总线讨论效果很好,大家各抒己见、充分讨论,弄明白了很多之前不明白的地方,还吃了好多零食,大家纷纷表示要继续下一次的技术分享。第二次技术分享是….,嗯,好像没有第二次了。
IIC(又称I2C):Inter-Integrated Circuit(内部互连电路);IIC总线通信协议是由Philips公司开发的,属于半双工同步传输类型总线;由于总线信号数量少,物理连接简单,可扩展性好,所以在一些低速通信场景中得到了非常广泛的应用。如下图所示。
在我接触的应用中,IIC一般用作设备管理系统中重要的一部分,举个栗子,单板设备管理处理器的IIC总线下挂:温度传感器,电源电压传感器,电源管理芯片(监控电源功率),EEPROM(电子标签),SFP光模块(管理通道),I/O扩展器件以及其它器件或模块的管理。我们一般认为它很简单,速率低边沿又缓(OD门,取决于上拉电阻和负载电容),感觉可以随心所欲的设计(PCB布局和布线);但实际上这是个非常严重的误解,由于IIC总线下挂太多的器件会有如下问题:
1. 这些器件分散在单板的各个位置,导致IIC总线会非常长(可能会超过单板一圈的长度),那么IIC信号完整性将是一个严重的问题;
——胖友们都已经知道在对高速信号的定义中,当传输延时大于1/4或1/6信号边沿时间时被认为是高速信号,此时传输线是一个分布系统,需要按照传输线的理论来分析,即如果IIC总线上信号满足了这个条件,就需要当做高速信号来处理了。具体参考《从电感、电容到理想传输线》相关内容。
2. IIC总线下的器件可能有各种不同接口电压(3.3V,2.5V,1.8V等等),所以需要在总线上引入电平转换器件,这些电平转换器件并非是理想的,会导致输入/输出信号电平产生抬升(举个栗子:有些IIC驱动器件的输出端相对输入端的低电平要高200mV),可能导致器件对总线电平状态识别错误,总线通信失败;
3. IIC总线通信协议本身并非是完美的,存在一定的概率导致整条总线挂死;举个栗子,主控设备连接可插拔模块A,当模块A在写操作过程中被拔出,此时主控设备并不知道这一状况,它会一直在等待模块A的确认返回信号(ACK),导致IIC总线挂死。
IIC总线在硬件上看起来是板内最简单的总线,包括其协议也是相对简单易懂(我自己动手写过的IIC 从机接口逻辑模块),但如果在设计之初不重视它,那么后续测试甚至产品商用后,往往需要花费更大的精力来搞定这些问题。
好,接下来我们进入正题。
1,IIC总线基本概念
1.1 IIC总线基本特点
如上一章所述,不同的总线用不同的方式实现了相同的目的,它们都需要传输:数据、地址、命令这些基本的信息。那么IIC总线有哪些基本特征呢?
1. 在物理链路上要求两条总线线路:SDA(串行数据线) 和SCL(串行时钟线);
——SDA和SCL都是双向的,在物理上是OD/OC门输出电路结构:外部上拉电阻(Rp)提供高电平驱动,而低电平驱动由器件内部MOS管提供(低电平驱动能力要大于高电平驱动能力);管脚电路结构如下图所示。
2. SDA以SCL的有效高电平(而非时钟边沿)作为数据采样的时间,时序如下图所示;
1,在时钟线SCL的非低电平阶段,数据线SDA要保持不变;
(1)建立时间tsu:SDA稳定位置与SCL时钟线上升沿的时间间隔;
(2)保持时间tpd:SCL时钟下降沿与SDA发生跳变的时间间隔。
2,在时钟线SCL的低电平阶段,数据线SDA允许发生跳变。
3. 每个连接到总线的器件(不管是Master或Slave)都有唯一的器件地址;
——IIC总线下所有器件都具有一个7bit的"从器件专用地址码":其中高4bit为器件类型,由生产厂家制定,低3位为器件地址,由使用者自行定义。
4. 多主机总线:如果两个或更多主机同时初始化数据传输,则可通过冲突检测和仲裁机制防止数据被破坏;
5. 在串行8 位双向数据传输模式下: 100kbit/s (标准模式),400kbit/s (快速模式),3.4Mbit/s(高速模式);
——100Kbps的IIC总线速率已足够满足大多数的应用场景,如果需要更高的速率,建议单独设计一条高速IIC总线单独使用。
6. IIC总线下的器件数量只受到总线的最大电容:400pF的限制。
那么IIC总线有哪些优点,值得我们去使用它呢?
1. IIC总线物理链路简单,硬件实现方便,扩展性非常好(1个主机控制器可以根据需求增加从机数量,同时删减从机数量也不会影响总线通信);
——IIC总线只需要SDA和SCL两条信号线,相比于PCI/LocalBus动则几十根信号线要简单太多,就算是SPI总线也至少需要4根信号线,而且片选(CS)数量受限(器件扩展受限);相对UART总线虽然只需要2条信号线,但一般只用于1对1通信(UART的一对多的通信也是可以的,但实现起来比较复杂)。
2. 采用IIC总线的器件封装更容易实现小型化,对PCB空间的要求较小;
——采用IIC总线的器件管脚数量得到明显的简化,举个栗子:采用SPI总线的EEPROM至少需要8个管脚,那么IIC总线的EEPROM只需要4个管脚,可以减少一半的器件面积。
3. IIC总线规范已经成熟稳定,IIC接口在不同行业的应用也非常广泛,大多数处理器/单片机集成了IIC控制器,而且很多种不同应用的器件支持IIC接口;
1,总线接口的生命力很旺盛,容易找到该总线接口的器件升级;
2,总线的软硬件接口设计标准化,开发难度低;
3,用一个总线解决不同器件的管理,简化系统软硬件设计;
4,IIC总线的各种问题已在大量应用中暴露出来,只需要关注已发现的问题,提前做好设计,就能保证总线的可靠。
4. IIC总线的故障诊断和调试简单,由于IIC总线信号线少,协议简单,所以如果出现故障,可以很容易通过示波器抓到时钟或信号线上的故障;
5. IIC总线通信:有抗电磁干扰高,电流损耗小,电源电压范围宽以及工作温度范围广等特点,适合应用于如下需求的板内部器件之间数据通信:
1,由至少一个主机(Master)和其它外围从机(Slave)组成;
2,IIC总线在系统中不同器件连接的成本最小;
——IIC器件接口复杂度小,器件封装小(器件成本小),IIC器件以及器件总线PCB走线所占PCB面积小(PCB成本小)等等;
3,用于控制功能的系统不要求高速的数据传输(适合低速数据通信);
——尽管IIC总线没有并行总线的数据吞吐能力,但只需要很少的信号线和连接管脚;总的效益由选择的器件和互连总线结构的种类决定。
1.2 IIC总线概念
IIC总线器件通过SDA(串行数据)和SCL(串行时钟线)在器件间传递信息,每个器件都有一个唯一的地址(无论是控制器、LCD、EEPROM或键盘接口),而且都可以作为是发送器或接收器。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机:主机(Master)是初始化总线的数据传输并产生允许传输的时钟信号的器件,而任何被寻址的器件都被认为是从机(Slave)。IIC总线的术语如下表格所示。
——LCD只能作为接收器而EEPROM则既可以接收又可以发送数据,这由器件特性决定。
根据如上表格,我们可以看到IIC总线的一些概念:
1. IIC总线支持多主机的总线,即在一条IIC总线上允许存在多个主机(Master),那么在争取总线控制权时,也必然需要总线仲裁机制:
1,如果两个或多个主机尝试发送数据到总线,在其它主机都产生0 的情况下首先产生一个1 的主机将丢失总线占用权;
2,主机在IIC总线上传输数据时会产生自己的时钟,所以在发生仲裁时多个主机发出的时钟信号会产生线与的效果。
——虽然IIC协议支持“多主机”工作模式,但在实际使用中,一般使用“单主机”的IIC总线系统;“多主机”需要使用更加复杂的仲裁机制;后续再详细介绍。
2. 发送器、接收器和主机、从机之间的关系需要做区分:发送器表示在总线上发送数据的设备,它可以是主机(Master)或从机(Slave),同样对于主机(Master)来说可以是发送器或接收器,它们之间没有固定的对应关系;
——举个栗子,主机A要读操作从机B:1,主机A寻址(器件地址)访问从机B;2,主机A(发送器)访问从机B(接收器)寄存器地址;3,主机A(接收器)从从机B(发送器)接收数据。
3. IIC是同步时钟总线;收发端都必须根据同步时钟(SCL)进行数据的发送和接收。
1.3 IIC总线数据结构
IIC总线只有SDA和SCL两根信号线,所以需要利用SDA和SCL信号线的状态来实现:各种总线状态,数据传输,数据传输确认,仲裁等信息。
1. 起始和停止的定义如下图所示;起始和停止条件一般由主机产生,总线在起始条件后被认为处于“忙”状态,并在停止条件的某段时间后总线被认为处于“空闲”状态;
——这是IIC总线通信中非常重要的状态,如果总线在数据传输过程中误触发进入起始或者意外停止,都会导致总线的异常。
1,起始(S)条件:当SCL 线是高电平时SDA 线从高电平向低电平切换;
2,停止(P)条件:当SCL线是高电平时SDA 线由低电平向高电平切换;
——我们在之前章节已经知道了,当SCL是高电平时正常数据传输时是不允许SDA进行跳变的,所以当出现这种情况时就表示是一种非正常情况:起始或停止。
3,重复起始(Sr):如果产生重复起始后不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始(Sr)条件在功能上是一样的。
2. IIC总线数据结构格式如下图所示,有如下特点:
1,发送到SDA 线上的每个字节必须为8 位,后必须跟一个响应位(第9位:ACK/NAK);
——每次传输允许发送的字节数量不受限制.
(1)数据传输必须带响应:响应位的时钟线信号(SCL)由主机产生,而数据线(SDA)则由接收器拉低,使得在在响应时钟信号周期内保持低电平;
(2)当从机不能响应从机地址时(主机访问的不是该从机),从机不能拉低数据线(SDA),主机会产生一个“停止条件”终止传输或则“重复起始”开始新的传输;
(3)当从机响应了该地址,但是传输一段时间后不能接收更多字节的数据,那么主机必须再一次终止传输,这种情况从机在接收字节数据后不响应(NAK)来表示;而后从机释放数据线SDA,而主机用一个“停止条件”终止传输或则“重复起始”开始新的传输。如下图所示。
2,IIC总线数据传输采用的是大端模式:高位(MSB)先发送排列到低位;
3,如果从机要完成其他功能后(举个栗子,高优先级中断事务)才能接收/发送下一个完整的数据字节,从机可以使时钟线SCL 保持低电平,从而迫使主机进入等待状态;当从机准备好接收/发送下一个数据字节时,释放时钟线SCL 后数据传输继续。
3. 时钟仲裁:所有主机在SCL 线上产生它们自己的时钟来传输I2C 总线上的数据,而数据只在时钟的高电平周期时有效,需要一个确定的时钟进行逐位仲裁;时钟的同步是由多个主机设备SCL线之间的“线与”来实现,如下图所示;
4. 数据仲裁:主机设备只能在总线空闲的状态下启动数据传输,两个或多个主机可在起始条件的最小持续时间(tHD;STA)内产生一个起始条件,并在总线上产生一个起始条件;当SCL是高电平时,仲裁在SDA线上进行:在其它主机发送低电平时,发送高电平的主机断开它的数据输出,因为此时总线上的电平与它自己的电平不相同。如下图所示。
1,仲裁可以持续多位,第一阶段SDA线上的数据是器件地址,所以它们比较的是所寻器件地址上的高电平(1‘b1)谁最后出现;
2,如果每个主机都寻址相同的器件,仲裁会继续比较数据位(假设主机是发送器);
——IIC总线仲裁的基本原则是:在仲裁过程中不丢失信息;因为是总线是OD门设计,所以只要任意主机输出低电平,那么总线上必然保持为低电平。
3,丢失仲裁的主机可以持续产生时钟,直到丢失仲裁的该字节结束;
——如果主机结合了从机模式,如果在寻址阶段丢失了仲裁,那么该主机必须立即切换到从机模式。
4,IIC总线的仲裁与PCI总线不同,它并没有仲裁器来决定由哪个主机获得总线控制权,完全取决于所发送的数据,而从机则不会卷入仲裁过程。
1.4 IIC总线寻址
如下图所示为普通7位寻址的IIC总线数据格式,主机在“起始条件(S)”之后发送了7bit从机器件地址,紧接着为读写标志位:R/W(表示数据方向),0表示写(发送数据),1表示读(请求数据);数据传输一般以主机发起停止位(P)终止,但如果主机还希望在总线上进行通信,那么可以发起重复起始(Sr)来寻址另一个从机,而非产生停止条件。
——IIC总线数据在第一个字节后,就可以确定主机选择的是哪个从机了。
如下图所示,IIC总线地址的头7bit数据组成了从机地址,最低位(LSB)是读写位,它决定了数据传输的方向,如上所述:0表示主机写信息到从机,而1表示主机从从机读取信息。而当发送了第一个字节数据后,IIC总线下所有的器件都将“起始条件”后的前7bit与自己的地址比较,如果一致则说明自己被选中,至于是被写入还是读出数据则由R/W位决定。
如之前所述,从机的地址由:4bit固定的器件类别和3bit可编程地址(器件管脚上下拉决定)位组成;那么在一条IIC总线下最多可下挂8个同类器件。IIC总线委员会协调IIC总线地址的分配,如下图所示为第一个字节位的定义。
好,那我们了解了IIC总线的地址格式,接下来看下标准IIC的总线操作格式,具体如下:
1. 主机发送数据给从机的操作如下图所示,数据方向在传输过程中没有改变;
2. 主机对从机的读操作如下图所示,在写入地址后传输方向为:从机—>主机方向;
3. 如下所示为符合格式,当传输方向改变时,起始条件和从机地址会被重复,R/W位取反;如果主机接收器发送一个“重复起始”条件,那么在这之前需要先发一个NAK。
——举个栗子,用于存储器的数据写入,需要在器件地址后写入内部寄存器的位置地址。