3.2 阅读数据表面对着产品发布的压力,很难让开发速度慢下来以便有足够的时间去阅读组件的数据表、手册和应用说明。更糟糕的是,可能看起来都读过了(因为翻阅了所有的资料页)但是什么都没弄明白,只记得好像是用外语写的。当代码运行不起来时,可能就只能抱怨硬件坏了。对于软件工程师来说,可以将每个芯片看成独立的软件库。花了多少努力去学习一个软件包(Qt、Gtk、Boost、STL等),就需要花同样多的努力去学习这些芯片和外设。它们甚至都有些方法,能够让我们像使用API一样与它们交流。对于软件库中众多的文档,我们常常读了其某些部分之后就将其束之高阁了,但是最好能在难缠的问题出现之前就知道哪些部分的文档是最重要的。数据表是外设的应用程序编程接口(API)手册。因此在详细揭示数据手册的秘密之前,请确保手中的数据表版本是最新的(检查制造商的网站并在线搜索以再次确认)。这些秘密包括一些窍门,如哪些应该读两次,哪些应该在需要的时候再去读。警告: 不幸的是,很多制造商只有在签订了保密协议(NDA)的情况下才会发布数据表。因此他们的网站只是对其产品的一个概述或者总结。硬件组件的信息在数据表中描述。因为数据表充斥了大量信息,所以看起来有点吓人。阅读数据表是一门艺术,需要经验和耐心。关于数据表,首先应该明白的就是它们通常不是真正写给软件工程师看的。它们是写给电气工程师看的,更精确地说,是给早已熟悉这个组件及其相关组件的电气工程师看的。在某些方面,阅读数据表的过程就好像是中途加入一场技术对话。看一看图3-2,这像是个真正的数据表,即使它不是软件真正要打交道的一个组件。每个数据表靠近最上面的地方是特征列表的一个概述。这是关于这个芯片的一个总结,但是如果没有用过85%与此相同的组件,那么这个总结部分对我们可能就没有多大用处。另一方面,如果曾经用过三四个模拟三角龙(或者加速器及任何类似东西),那么只需要看一看这个器件的概述部分,就可以知道这个器件与之前的使用经验有哪些相同和不同的地方。如果数据表花时间去解释每个新手都想要了解到的信息,那么每个数据表都将成为一本书(绝大多数都会有相同的信息)。事实上,新手不会大量采购这个器件,只有那些有经验的并熟悉这个器件的工程师才会大量购买。
图3-2:Dino Industries的模拟三角龙数据表的顶部因此,我认为直接跳过头部的概述性信息(或者至少应该过一会儿再来看这部分)。我比较喜欢通常出现在第一页的功能框图,但是它们和概述部分很像。如果不知道应该看什么,那么功能框图也可能没什么作用。因此可以从描述部分开始。这部分通常会占据第一页一半内容,有时候也会在第二页延续出一小部分。在描述部分,不应该仅仅读了几个单词之后就匆匆跳到下一个段落。虽然没有一页那么长,但是文字信息相当密集。通读这个部分。在大声读的时候要标记出重要的信息(可能是其中的大部分信息)。3.2.1 遇到问题时需要查找的数据表部分在第一页之后的信息,每个数据表都会不一样。而且,不是所有的数据表都包括所有的章节。即使如此,也不用仔细阅读那些对软件如何使用外设没有任何帮助的部分。为了节省时间和心力,可以跳过绝对最大额定值、推荐工作条件、电气特性、包装信息、布局,以及机械特性等部分。硬件团队早已阅读数据表的这些信息,相信他们可以做得不错。某一天,当我们不再面临完成产品设计的压力时,再回头看看这些部分还是值得的。虽然你跳过了这些部分,但请记住它们的存在。这些是在出错的时候需要的,比如在拿出一台示波器并试图找出为什么这个器件不工作的时候,或者(更糟糕)这个器件看起来是工作的,但是和期望的不一样的时候。请注意,这些内容是存在的,因此可以在需要的时候再回过来看看。在开始的时候忽略它们是没有问题的:每个可用的封装类型的引脚输出如果需要在调试的时候探测芯片,那么就需要知道引脚的输出。理想情况下,这个并不重要,因为在软件可以正常工作时,没有必要探测芯片。引脚配置展示了一些名字,在名字上面是横条(如图3-3所示)。横条表示这些引脚是低电平有效,意思是它们在低电压时导通。在引脚描述中,低电平有效的引脚名前面都有一个斜线。你也可以看到其他表示低电平有效信号的方法。如果大部分引脚都有一个名字,那么可以采用修饰符将名字表达成诸如nNAME、_NAME、NAME*、NAME_N等的格式。基本上,如果在名字旁边有修饰符,那么就得看看它是不是低电平有效的,这需要在引脚描述部分特别注意。注意: 如果以前从来没有接触过这些东西,那么考虑从一本电子学入门指南入手,如可以从“延伸阅读”部分列出的书挑出一本来阅读。引脚描述这是一个如图3-4所示的表格。在需要这些信息的时候就回过来看看,可能在需要看看哪些引脚应该是低电平的时候,或者正在试着确认用示波器显示出来的波形和数据表上的时序图是否一样的时候。性能特性这些表格和图形准确地描述了这个器件是干什么的,提供了相对于第一次阅读来说更多的信息。但是,如果器件正在通信却不能正常工作,性能特性就可以帮助我们找出可能的原因(比如,器件应该工作在0~70癈,但它刚好靠近非常热的处理器,或者在输入电压正常时外设可以工作,但当输入电压略微超出指定范围时,精度会有所下降)。示例原理图有时候拿到驱动程序代码,这些代码可以像我们所期望的那样工作,如果最终可能有些修改,但不需要对驱动程序做太多的修改。示例原理图是电气工程版的驱动程序代码。在器件工作不正常时,如果原理图和示例原理图相当相似,那么是一件很让人欣慰的事情。但是,正如供应商提供的驱动程序代码一样,有太多不错的理由会导致实际的实现与示例实现不一致。如果碰到麻烦,并且原理图与示例不一致,那么请教电气工程师差别在什么地方。可能什么差别都没有,但是这样做却是非常重要的。
3.2.2 对软件开发者比较重要的内容最后,也许在数据表一半的地方,会看见一些文字(如图3-5所示)。标题可能是“应用信息”或者“工作原理”。或者数据表从表格、图形转换为文字和框图。这是作为一个软件工程师,需要开始阅读的地方。事先浏览一下以找到需要的信息在哪里,这样做是没有问题的,但是最终需要从头到尾地仔细阅读这些内容。一个额外的好处就是,这里的文字会链接到应用说明和用户手册。通读数据表,考虑如何为系统实现驱动程序。怎么和这个器件通信?怎么初始化它?软件需要怎么做才能高效地使用它?是不是有些严格的时序要求,处理器如何处理这些要求?在通读数据表的时候,对那些可能对实现代码有影响的部分要做好标记,以便可以很快地找到。时序图是个不错的地方停下来,歇口气(见图3-6)。试着将这些和文字以及要实现的东西联系起来。在“时序图如何帮助软件开发者”中有关于时序图更多的信息。工作原理在正常模式下,三角龙有一个移相输出,相反的信号会被同步(FT1和HND2、FT2和HND2)。每个信号会在大约1/4周期内保持高电平。在充电模式(HORN引脚被拉低)下,所有的输出引脚都被同步。在三角龙充电的过程中,在基态下,它会在手和脚上花较少的时间:每个信号在每个1/4周期里都保持低电平。它还有较高的循环速率,这个速率递增得越来越快,直到达到最大充电速度。这个输出状态会一直保持到充电结束(HORN引脚被拉高)或者到三角龙遇到意外的阻抗(崩溃)而导致重启引导模式。虽然不是必需的,但是HORN引脚通常会在系统崩溃之后被拉高,以避免器件过热。图3-5:模拟三角龙的工作原理除了要确保有关于元器件最新的数据表外,我们还需要检查制造商的网站以得到勘误表,它提供了关于数据表上的所有错误的更正信息。用零件号和单词“勘误表”在网页上搜索就可以得到结果(见图3-7)。勘误表可以指出数据表或零件中的错误。注意: 数据表可能有不同的修订版本,元器件也有不同的版本。要拿到与使用的器件版本号相对应的最新版本的数据表。当读完所有这些信息后,如果足够在行或者足够幸运,那么你就已经掌握了使用这个芯片的所有信息。通常,大多数人将开始为这个芯片写驱动程序,并在写芯片接口的时候花一定的时间去重读一部分内容,然后是通信方法,最后实际使用这个芯片。阅读数据表就像一场龟兔赛跑,乌龟肯定会赢野兔。
图3-6:模拟三角龙的时序图
图3-7:模拟三角龙的勘误表在完成了所有的驱动程序开发,并且这些驱动程序能正常工作之后,再通读数据表顶部的特征总结部分,因为这个时候我们已经了解了这类器件,能够很好地理解这个总结。虽然如此,当需要实现类似的设计时,可能还需要读一读数据表的某些部分,但是这个过程应该简单多了。此时,可以从数据表标题页的总结部分获得对这个器件更好的概述。在使用外部设备的时候,可以使用其他一些资源:如果芯片有用户手册,请务必要了解一下。应用说明部分常常有些特定的使用案例,这些案例可能是有用的。来自于现有使用者的论坛和例子。在深入问题之前,先到处看一看,也许在某些地方可以找到一些疑难问题的答案。时序图如何帮助软件开发者时序图揭示了转换之间的关系。有些转换在相同的信号上,有些转换可能在不同的信号上。例如,如图3-6顶部所示,在正常模式下,手(HND1和HND2)的交替状态,一只手会在另一只手放下后立即举起来。在研究时序图的时候,从信号名的左边开始。时间从左往右前进。大多数时序图集中于对数字状态的描述,说明某个信号什么时候变为高电平,什么时候变为低电平(记住,检查引脚名是否有修饰符,这标志着低电平有效)。有些图中包括了一个斜坡(比如图3-6引导顺序图中的手和脚的信号),这个斜坡说明了信号正处于转换状态。还可以看到一些信号既是高电平又是低电平(如图3-6引导顺序图中的角信号),这表示这个信号处于一个不确定状态(对于输出来说)或者处于没有被监控状态(对于输入来说)。有些重要的时间特性用带有箭头的线突出显示。这些特性通常会在表格中详细规定。同时,也应该看看表示信号顺序(一般用虚线表示)和因果关系(一般为从一个信号指向另一个信号的箭头)的标记。最后,图中的脚注部分经常也包含了极其重要的信息。3.2.3 用数据表评估元器件在本节中讨论评估一个实现后的元器件,可能看起来有些奇怪。在项目中,通常不需要这么做。然而,在工程开发周期中却需要这么做。一般说来,在选取系统元器件之前,你必须首先从别人设计的系统中去学习如何实现一些部件。所以,与阅读数据表相比,评估元器件是一个高级技能,电气工程师要先于软件工程师掌握这个技能。在评估元器件的时候,目标应该是尽可能快地剔除那些不能用的器件。例如,某个器件需要120V的交流电,而系统却只有5V的直流电,那么就没有必要把宝贵的时间浪费在准确地定义如何基于该器件去实现特征X。从一个必须具备的列表和一个期望的列表开始,在此基础上,就可以生成一个备选的元器件池,再对其做进一步的调查评估。在没有更深入地进行这个调查评估之前,我们先来看看数据表上没有提到的东西。数据表通常不包含价格信息,因为价格依赖于多重因素,特别是计划订购量。数据表也不会说明交货期(所以,请小心设计完美器件,它可能要在等待6个月之后才可用)。除非在线订购,否则我们就必须和供应商或者经销商进行沟通。这也是一个向他们询问是否有该器件的使用指南、初始化代码、应用说明、白皮书、论坛,或者任何可以让我们深入了解问题的好机会。供应商也意识到这些都可能是卖点,他们的应用工程师一般都乐意提供帮助。经销商也会帮助我们对不同的方案进行比较和对比。注意: 即使是在与某个经销商沟通的过程中,Digikey(http://www.digikey.com)也常常是获取价格和交货期信息的非常有用的渠道。再回到数据表,这一次那些被跳过的部分成为最重要的部分了。从最大额定值和电气特性开始(见图3-8)。如果它们与期望的标准不匹配,那么把数据表丢在一边。现在的目标是快速地浏览这些数据表。如果一个器件不能满足最基本的要求,记下哪些没有满足,然后继续往下看(保持记笔记是有用的,否则最终会重复地拒绝同一份数据表)。也可以对数据表按照超出标准的范围进行排序。如果最后发现没有任何数据表可以满足我们的标准,那么可以再去检查最接近的那个,看看是不是可以用它。
图3-8:模拟三角龙最大额定值当基本电气特性和机械要求满足后,下一步就是考虑典型特性,以决定这个器件是否是所需要的。在规格要求上,我帮不了什么忙,因为这些依赖于具体的系统需求和具体的元器件。这里有一些通用的关于功能参数的问题:器件是否足够快?输出是满足还是超出具体的系统要求?对于一个传感器或者模数转换器,噪声是不是可以接受的?当有一个或者两个数据表通过首轮筛选之后,就可以对它们进一步深入研究。如果有一个应用章节,那就是个不错的出发点。这些应用是不是和我们的系统比较接近?如果是,那么就继续;如果不是,那么就要稍微有点担心了。将一个外部器件第一次使用在特定的场合可能是可以的,但是,如果这个器件是特定地用于水下传感器网络的,而现在想把它用在超级智能烤面包机上,我们可能就会感到很奇怪,为什么把该应用定义得如此狭窄。更严重的是,总有个理由可以解释为什么建议的应用不能覆盖所有的使用情形。比如,特定用于汽车上的芯片,在数量较少时,可能没有办法获取。数据表的目的是为了将产品卖给那些使用类似器件的人,所以给出的使用范围比较有限是有理由的。下一步,看看性能特征并决定它们是否满足要求。通常,在这部分会发现新的需求,比如,意识到系统需要在A部分有温度响应,在B部分有供电电压响应,在C部分需要有噪声阻抗等。将所有的这些需求整理为标准并将那些不满足要求的去掉(同样需要对标准进行排序,以免将自己陷入困境)。此时,应该至少有两个但不超过四个数据表。如果有多于四个数据表,那么了解一下看看是不是某个供应商在你的采购部门有比较好的信誉、比较短的供货周期,或者比较优惠的价格。可能还会回来看看那些多出的供应商,但选出其中四个是个不错的做法。如果将所有的数据表都剔除了,或者只剩下一个,那么不要就此停住。这并不是说所有的东西都是没有用的(或者只有一个有用)。而是说,我们定义的标准可能太严格了,需要对可选方案进一步研究。因此选择最好的两个器件,即使一个或者全部都不满足所有这些最挑剔的标准。对于剩下的数据表,我们希望能找出对实现来说最棘手的部分以及看看这个器件是否能很好地应用于系统中。这就是类似器件使用经验起作用的地方。在读数据表的时候,就想象如何去实现相应的代码。事实上,如果你没有类似的使用经验,那么就可能要写代码以便将这一切变成现实。如果可以将这些器件和真实的硬件做成原型,那么非常好!如果不能,我们也可以做个心理原型,在心里演练一下那些实现步骤并预计会发生什么。即使在针对2~4个器件做了以上的事情之后,也可能只使用其中一个,这也会在最终选择这个器件后能够非常快地开始代码工作。这样一个深入分析的过程需要很多时间,但会排除掉器件可能不工作的风险。原型做到何种程度取决于不同的人(和具体的日程计划)。如果仍然面临多个选择,那么不妨看看这个系列的器件。如果有些东西不够用(如空间、引脚或者范围),那么在同一个系列中是不是有引脚到引脚(pin for pin)兼容的其他器件呢(理想情况是相同的软件接口)?这样留有一定的余地会容易很多。最后,有了选定的器件后,特征总结部分就是一个练习比较文学的地方。既然已经阅读类似的器件好几份数据表,数据表的概述部分对我们来说就没有问题了。如果还有数据表需要评估,那么就从这里开始吧。将已经评估完和和待评估的进行对比,就对每个芯片可以做什么以及不同的参数如何相互作用(例如,速度可能与成本成正比)有一个快速的了解。
相关资源:嵌入式系统设计与实践