介绍
本篇应用笔记目的是演示如何使用PC并口构建一种快速、简单和经济的2线(与I?C兼容)接口。本片应用笔记专门为接收或者订购Dallas Semiconductor器件样片且意识到他们需要与2线设备通信的用户编写。虽然存在好多解决方案,在本篇笔记中给出的方案不需要微处理器、固件,也不存在购买芯片的困难。而是通过Windows 95/98软件,帮助解决同时调试硬件和软件的困难。在给出的软件的同时,也给出几个调试工具,能够使硬件快速工作运行。
既然硬件并不与PC接口,不需要作标准的声明。虽然给出的硬件和软件一起构建和测试,用户使用有一定的风险。确保再三地检查所有的连接和电源电压,因为电源直接连接到PC的并口电路。Dallas Semiconductor/Maxim对可能引起的损害不负任何责任。本解决方案仅用于评估目的,不是用于产品或者发行品。虽然现在的软件仅适用于Win95/98,将来的版本会支持Win NT。
为什么使用并口,而不是串口或者USB?
在本篇应用笔记中选择并口作为接口是因为目标是建造一种快速、简单和经济的接口。这个并行接口是基于74HC05逻辑芯片和一些无源元件。另外一个方面,串口解决方案需要一个微处理器、固件、编程器或者系统可编程、电平转换、晶体以及更多的无源器件。同样地,USB除了工作量大的软件和固件投入外,也需要相当数目的硬件。而且调试USB硬件经常需要昂贵的协议分析仪。因此,根据我们的目标,很明显地选择并口。然而在作出最终决定时,必须分析缺点以确保这些缺点是可容忍的。
并口最大的缺点是它的未来。更多的PC制造商放弃了并口和串口,转而支持USB。并口的另外一个缺点是大多数的配置需要在PC的BIOS里设置。这意味着在PC和硬件之间不能建立通信时,PC必须重新启动才能进入BIOS工具(通常在启动时按F1或者DEL键)设置并口配置。在工程或者评估环境中,中断不会花费太多时间,而一旦投入到市场中大量的支持将成为问题。虽然更大的麻烦是PC之间的差异。因为并口是遗留硬件,好多年来一直在发展变化和改进。然而,在设计硬件时,要使硬件能够工作在老版本和新版本的并口上。这样在设计接口硬件时必须作个假设(定时和电气)。最后,另外一个缺点是操作系统,在Windows NT系统中,需要设备驱动程序。Windows NT不允许用户程序直接读/写硬件寄存器。在软件方面如果购买驱动程序的话是非常昂贵的。
幸运的是,在评估环境中使用Windows 95和Windows 98并不是很麻烦,一旦软件修正以支持Windows NT则不必在意这个话题。
硬件
图1给出了并行2线接口原理图。很容易获得所有的元器件。可使用表贴元件或者直插元件构建接口。
图1. 2线并口接口
该接口基于一个74HC05芯片构建,在原理图中以U1表示。74HC05包含六个集电极开路输出的反相器 。在本应用中该芯片具有好几个功能。首先,它为PC并口电路与下一级电路提供隔离功能。同时将并口的TTL信号转成2线接口需要的集电极开路输出。集电极开路输出需要连接双向SDA信号到一个专门的并口输入引脚和一个专门的并口输出引脚(与使用一个并口双向引脚的情形相反,这通常需要用户设置PC BIOS)。
既然2线接口的SCL信号对芯片来说为仅输入(不实现时钟扩展),可使用并口的D0产生SCL (PCDB-25连接器的引脚2),配置为输出。 D0连接到74HC05反相器(U1E)的一个输入。然而,一些并口可能不能输出足够高的电压,反相器无法判断电压为高电平,所以电阻R3用作上拉电阻使接口对PC之间的差异不敏感。同样地,为补偿这种差异,电容C4作为一个空的元件包括进去,如果与带有噪声的PC并口连接时可将C4安装上去。对大多数应用不需要该电容,但是如果PCB正在构建,并不影响,至少包括电容的封装。最后,反相器U1E的输出为SCL。因为输出为漏极开路,需要上拉电阻R1实现高电平逻辑。
另外一个方面SDA信号是双向。使用一个输入引脚(PC DB-25连接器引脚12)和一个输出引脚(D1,PC DB-25连接器引脚3)实现双向工作。从PC到2线设备的通信由产生SCL信号的同样电路实现。并口的输出D1连接到另外74HC05 (U1)的另一个反相器的输入(U1A)。再强调一次,为保证并口高电平逻辑足够高,反相器能够正确判断,上拉电阻R4将信号D1电平上拉到VCC。同样地,电容C5作为一个空的元件,在遇到噪声的并口时可安装用以滤波。反相器的输出为漏极开路,需要R2实现高电平逻辑。
使用并口的一个输入引脚(引脚12)和74HC05反相器(U1B)实现从2线设备到PC的SDA通信。应该指出的是,为使设备能够与PC通信,应用软件必须使D1为低电平,这样反相器的输出释放SDA,允许2线设备控制SDA。反相器U1B的输入监视SDA。反相器的输出通过R6上拉到VCC,R6负责判定高电平逻辑。串联电阻R5用作冲突状态下的保护。在这个例子中不需要串联电阻,因为并口的引脚12仅用作输入。如果使用并口引脚作为输入输出,在并口输出高电平电压且外部将高电平电压加入到并口上时这个电阻变得非常重要。即使应用软件没有导致冲突,可能另外一个程序也要在一段时间内访问该端口(例如,操作系统周期性搜索打印机)。
仅需要74HC05六个反相器中的三个用于实现2线通信,其余三个反相器并未没用。为避免浪费,原理图也包括了一个可选的电路,使用两个未使用的门驱动LED,可在软件控制下开启或者关闭。并口引脚17为输出引脚,用于控制反相器U1C和U1D,并行提供足够的拉电流驱动各种LED。电阻R7,与R3、R4一样,使反相器输入具有足够高的电压,确保高电平逻辑。电阻R8是LED限流电阻,用于控制LED的亮度。有趣的是,并口引脚17,对PC内部有反相器。对引脚17写0将转化成高电平,在到达DB25之前。高电平输入到U1C和U1D引起输出低电平,打开LED。
其余没有用到的反相器输入应当连接到GND,输出高阻以防止冲突。
电容C1和C2用于电源电压的旁路,尽量靠近PCB上电源。同样地,去藕电容C3应该尽可能靠近74HC05的VCC和GND放置。
当连接SCL和SDA到2线设备时,应确保接口地与2线设备地共地。如果接口的SCL和SDA连接到包含2线设备的电路时,注意R1和R2与应用电路2线上拉电阻并联。如果你计划在电路内与2线设备连接,可适当调整R1和R2,如果应用电路已经有SDA和SCL上拉电阻,可去掉R1和R2。
最后,在原理图中给出的,阴型DB25接口用在接口原型中。在原理图中给出了制造商和器件型号以及阳型DB25电缆。取决于电源,很容易使用阳型DB25连接器和DB25阳型到阴型电缆。
并口寄存器
PC与接口之间的通信使用三个寄存器中的四位实现(表1)。并口(LPT1)缺省基地址为378h。其余的两个可能地址为3BCh和278h。基地址为8位数据字节的地址。该字节包含控制引脚D7-D0的位,最低有效位(LSB)为D0。在数据字节后面、基地址 + 1处的字节为状态字节。在给出的原理图中,状态字节的第5位(位0为LSB)为SDA的输入。状态字节位5的读数指示SDA的状态(通过U1B的倒相)。在执行读操作之前,确保数据字节中的D1写为低电平使得反相器U1A为高阻,允许反相器U1B检测SDA的状态。状态字节之后基地址 + 2处的字节为控制字节。我们感兴趣的是控制字节的位3 (位0为LSB)。位3通过PC内部的反相器,然后输出到PC的DB25接口的引脚17。该位使能LED或者使LED无效。读写该位的例子后面的章节给出。
表1. 并口寄存器
校验和调试硬件
一旦硬件完成构建,首先对硬件做仔细检查。在连接到PC或者电源之前,确保所有的连接是安全的、正确的,且没有短路存在。确保VCC没有连接到地。一旦执行这些防范措施后,连接5V电源到该接口(不要连接并口电缆)。如果电源有电流读数,确保电流不超过10mA到15mA。如果出现更大的电流,再三检查所有连接。
确保芯片连接正确,再次检查可能用到的极性电容的极性,比如C1。另一个可能导致大工作电流是不正确的上拉电阻的阻值,比如使用470Ω代替4.7kΩ电阻会导致电流增大。
如果一切都正常,连接并口电缆。由于上拉电阻的存在,电流稍微发生变化。到此你可以试试附送的软件,或者根据下一部分学会如何使用微软的调试工具直接读写并口寄存器,这样可以校验或者调试硬件。使用Debug Microsoft Windows 95和98和DOS工具Debug读写并口寄存器。虽然Windows NT包含Debug工具,但是操作系统不允许直接访问硬件。在NT使用Debug对硬件不会有任何效果。为运行Debug,单击Sart菜单选择Run命令..在编辑框输入Debug。带“-”提示符的DOS窗口出现。图2给出了Debug的屏幕截图。很容易使用Debug。例如,读字节地址378h,在提示符“-”后输入:
i 378
结果是从指定地址中读出两个数字(一个字节)十六进制数。可使用Debug写存储器。例如,将00h写入378h,输入以下然后回车:
o 378 00
建议小心使用Debug,仅可、访问已知的寄存器。访问其他的寄存器会可能导致未知或者不希望的副效果。键入q退出Debug,键入?寻求帮助。
这里给出使用Debug校验/条是硬件的例子(使用缺省的LPT地址)。图2的Debug屏幕截图给出了这些例子。
-i 378 读数据字节。
-o 378 00 数据字节写为00h。SDA和SCL输出高电平。
-i 378 读数据字节。这会返回00,因为刚写入00。
-o 378 01 使SCL低电平,SDA高电平。
-o 378 02 使SDA低电平,SCL高电平。
-o 378 03 使SDA和SCL输出低电平。
-o 378 00 在执行下列命令时确保SDA为高电平。
-i 379 这返回SDA的状态。如果位5为0,则SDA为高电平,如果位5为1,SDA为低电平。注意
到要读入SDA的值,数据字节应首先写入0,
这样反相器(U1A)会释放SDA。如果外部没有将SDA拉低,位5读入为0。
-o 378 02 使SDA为低电平。
-i 379 读SDA状态,这时位5读入为1。
为将LED开启和关闭。建议控制字节中未使用的的位保持不变。可通过读寄存器,然后使用与或者或操作设置清除位3。注意PC内部有反相器。
-i 37A 读控制字节。可看到如屏幕截图所示,PC返回0C
(当前LED关闭)。为打开LED,位3必须清除。
可用F7h与上控制字节的读数。对于读数0C,清除位3
得到04。将其写入控制字节会开启LED。
-o 37A 04 开启LED
图2. Debug屏幕截图
并口软件工具
图3给出了并口软件的屏幕截图,该软件专为本篇应用程序中的硬件设计。可从以下地址下载: http://files.dalsemi.com/system_extension/AppNotes/AN3230/ParallelPort.exe
屏幕截图可能与所下载的程序稍微有出入,因为软件有可能改进了或者增添了功能。
图3. 并口工具屏幕截图
软件缺省的LPT地址为378h。如果发现软件不能与硬件通信,可以选择不同端口的地址。最容易判断软件是否与硬件通信的方法是单击LED On和LED Off按钮。如果成功,单击Test按钮,它控制D1 (U1A),从U1B读入值。读数结果会显示在状态栏里。
忽略同步脉冲。如果你希望使用示波器捕捉2线通信,可以使能同步脉冲,将示波器探针放到DB25的引脚17上,作为触发器。
到此,可以准备与你已连接的2线设备通信了。确保设备的SDA,SCL和GND连接到硬件上。确保74HC05的VCC尽可能等于设备的VCC。
有两种方法可以与设备通信,首先需要确保软件知道2线设备从地址通信。软件缺省地址为A0 (hex),这恰好为数字电压表的地址,虽然这常取决于设备地址引脚,如果有许多的话。要改变2线设备地址,在编辑框中键入地址,单击“Change”。如果不知道2线设备的地址,请检查设备数据资料。
最容易读写一个或者两个字节设备寄存器的方法是使用软件中的“One and Two Byte Reads/Writes”部分。该部分适合对设备编程/配置,因为2线设备中所有细节(start,stop,ACK,NACK,等)自动隐藏。只需要输入需要的存储器地址去读或者读或者写。如果希望写,用需要的数据填充“DATA”域。
与设备通信的另外一种方法是用“2-Wire Functions”部分,如果需要学习2线设备协议,这部分功能很适合。在演示例子之前,需要解释几个按钮的含义。“Send Write”按钮是用2线地址从2线地址域,将LSB (R/W位)屏蔽为0,然后发送8位。“Send Read”按钮是用同样的2线地址,但是将LSB (R/W位)屏蔽为1,指示下一步将进行读操作。8位数据发送。“Bus Reset”按钮在SCL输出9个时钟周期,重新设置2线设备总线。
例子(使用缺省的从地址):
写存储器地址7Fh到01h。
Start
Send Write
Data [7F]
Data [01]
Stop
读存储器地址7Fh (一个字节)。
Start
Send Write
Data [7F]
Start - 通常称作重新读。
Send Read
这里使用Rd w/NACK - Rd w/NACK是因为仅读1个字节。
Stop
读存储器地址F0h和F1h (多个字节读)。
Start
Send Write
Data [F0]
Start
Send Read
Rd w/ACK - 如果超过2字节需要读,命令会重复。
Rd w/NACK - 最后的读必须是w/NACK。
Stop