ENGLISH 简体中文 日本語 한국어  


应用笔记3412

TINIS400外部串口参考设计

摘要:本应用笔记介绍了如何在运行1.1x版本TINIOS的DSTINIS400插座板上实现外部串口。该实现方法包括三个显著的部分:硬件、RTL和软件。硬件由一个包括双路UART的子板实现,并插到TINI插座板上。TINI至每路UART的硬件接口由Verilog RTL实现。软件基于应用笔记AN706 Writing a Device Driver for TINIOS,以及现有的TINISerialPort类实现。软件包括汇编和Java语言代码,并以可加载库的形式实现。为简化参考设计,在可能的地方使用已有的硬件和软件API。

需求

以下为本应用笔记的需求:
  1. DSTINIS400 rev. B插座板
    • 必须安装Xilinx XC2C64CPLD以及配套的支持硬件。
  2. 本文档参考的87-2C400-SXB硬件。原理图和电路板布局可从Dallas Semiconductor的FTP站点下载。Texas Instruments的TL16C752B双路UART (DUART)必须工作于36.864MHz或更高的频率,以确保与DSTINIM400一起可靠工作。
  3. 1.15或更新版本TINIOS
  4. 熟悉硬件设计、Verilog、8051汇编语言和Java™

硬件

外部串口子板(图1)是基于Texas Instruments的TL16C752B 3.3V DUART实现的。地址、数据和控制线通过连接器J1与DSTINIS400上的CPLD相连。为降低电流消耗,DUART在未使用时进入休眠模式。Maxim的MAX3245E收发器具有两个状态信号和两个控制信号,但在本设计中没有使用状态信号。FORCEON和FORCEOFF信号通过J1连接至CPLD,在不使用端口时用来关闭器件。使用36.864MHz振荡器作为DUART的时钟输入。CPLD保持其OE引脚为有效状态。


(点击打开大图)

图1. DSTINIM400串行扩展硬件原理图(87-2C400-SXB)

RTL

RTL源文件使用Verilog编写,并通过Xilinx XC2C64 CPLD实现(图2)。用Xilinx Webpack进行编译、综合及载入实现。包括地址译码、状态和控制等一些功能是使用RTL实现来完成的。

图2. CPLD接口
图2. CPLD接口

在TINI运行环境中,StatusControl寄存器映射至基地址0a00000h。除了CE5、PSEN和WR外,无需做进一步译码。任何对地址0a00000h至0c00000h的读或写操作,都将访问StatusControl寄存器。串口serial2与serial3映射至基地址600000h和800000h。最简单的译码逻辑可以映射DS80C400 (位于DSTINIM400上)的地址线A2:A0至串口地址线S_A2:S_A0。这可为每个UART提供8个寄存器地址。但是,这样会限制寄存器访问为FIFO方式读写。换句话说,如果需要从数据寄存器读取32字节数据,必须从同一地址读取32次。通常这32字节数据会被写入位于TINI运行环境的堆(输入缓存)中一个地址连续的块内。但是在本设计中,A18:A16映射至S_A2:S_A0,这样每个寄存器均具有64k地址范围。所以从64k地址范围内的任意位置都能有效进行读操作,并返回数据寄存器中的数据,而无论地址是什么。

UART的地址映射选择基于DS80C400增强的数据指针功能。数据指针具有自动转换(自动在两个数据指针间来回转换)和自动递增(自动递增数据指针的地址值)功能。如果一个数据指针访问FIFO,另一个访问连续缓存,那么用户不能同时使用自动转换和自动递增功能。这是因为自动转换和自动递增必须用于成对的数据指针。在大多数Dallas Semiconductor基于8051的微控制器中,由一个缓存读入数据并写到另一个缓存所需的代码如下所示:
LoopOrig:
  MOVX A, @DPTR       ; get FIFO byte
  INC DPTR           ; increment dptr
  INC DPS            ; select second dptr
  MOVX @DPTR, A       ; put byte into buffer
  INC DPTR           ; increment pointer
  INC DPS            ; select first dptr
  DJNZ R0, LoopOrig
对于DS80C400和DS80C390微控制器,以下汇编语言指令利用了数据指针的自动转换功能,将INC DPS操作作为指令的一部分来执行,从而使代码更加紧凑、高效和易读。
INC DPTR
MOV DPTR, #data
MOVC A, @A+DPTR
MOVX A, @DPTR
MOVX @DPTR, A
利用该功能,上述代码可精简为:
LoopAutoToggle:
  MOVX A, @DPTR ; get byte and toggle
  MOVX @DPTR, A ; put byte and toggle
  INC DPTR ; inc pointer and toggle
  INC DPTR ; inc pointer and toggle
  DJNZ R0, LoopAutoToggle
使用DS80C400的自动转换和自动递增功能,代码可进一步简化:
LoopAutoToggleAutoInc:
  MOVX A, @DPTR ; get, inc and toggle
  MOVX @DPTR, A ; put, inc and toggle
  DJNZ R0, LoopAutoToggleAutoInc
如果硬件配置为上述的FIFO访问方式,必须去除其中一个INC DPTR操作。这种情况下,不能使用自动递增功能,因为它工作于成对的数据指针。如果去除LoopAutoToggle示例中的两条INC DPTR指令之一,那么循环体中自动转换的次数为奇数,并且每次循环后数据指针的状态都是相反的 (即每次循环后,读、写以及递增操作都将针对不同的数据指针进行)。对于FIFO访问方式的唯一选择是LoopOrig (去掉FIFO读操作后的INC DPTR指令)。

如果每个UART寄存器的映射范围为‘n’个地址,那么递增UART数据指针不会产生问题,只要循环次数小于或等于‘n’次。这允许使用代码更少的LoopAutoToggleAutoInc。所选择的UART寄存器地址映射方案,允许每个寄存器映射至DS80c400上连续的地址范围。选择64k大小是因为CPLD只能访问DS80C400的{A21:A16, A3:A0}地址线。这是容纳每个UART上64字节FIFO的最小地址范围。

RTL还执行控制操作,并提供状态信息。两个UART中断在CPLD内部合为单个中断,并接至DS80C400的nExtInt (INT0)。在StatusControl寄存器内部具有两个状态位(StatusControl[1:0])。这两个状态位直接与每路UART的中断信号相连,以允许驱动程序通过单个读操作来辨别中断源。控制位 StatusControl[5:2])与收发器的FORCEON和FORCEOFF输入相连。使用这些控制位,驱动器可以在端口打开时开启收发器,而当端口关闭时关断它们。

软件

软件设计运行于1.15或更高版本的TINIOS,它由两部分组成:底层本地驱动和高层Java类。可加载的TINI本地库实现底层驱动和对时间要求严格的操作。该库在任何时候只能加载一个实例。需要多个外部串口的应用软件,应该在单个进程内实现。Java类com.dalsemi.comm.TINIExternalCommDriver,用于实现javax.comm接口。该类要求在TINI中包括/etc/javax.comm.properties文件,并且必须包含“Driver=com.dalsemi.comm.TINIExternalCommDriver”行来加载库。更加可靠完美的应用软件应该检查properties文件是否存在,并且如果不存在可生成该文件。这样即使在文件系统初始化后或者文件被擦除的情况下,也能确保驱动的成功加载。Java类com.dalsemi.comm.TINIExternalSerialPort对com.dalsemi.comm.TINISerialPort类进行了扩展(图3)。本软件的很大一部分基于应用笔记AN706 Writing a Device Driver for TINIOS。这里没有重复AN706的细节,除了为充分理解串口驱动提供的附加信息。

图3. 串口类结构
图3. 串口类结构

对用于TINIOS 1.15的本地和Java库进行了扩展,以使子类化TINISerialPort更加容易,提高了任何情况下与javax.comm的兼容性,当然也提高了与其它TINIOS串口的兼容性。为结合TINIOS.setSerial方法实现底层功能,增加了本地函数System_InstallSetSerialHandler。该函数接受一个参数,即安装串口处理程序的函数指针。传递一个#0 (null)至TINIOS.setSerial方法会去除已安装的处理程序。Java方法TINIOS.setSerial (static int setSerial(int command, int portNum, byte[] data))的参数会传递至本地处理程序并由处理程序返回,而不会被OS更改。对于外部串口,在处理程序中执行的函数为SERIAL_EX_GET_DIVISOR和SERIAL_EX_SET_DIVISOR。

其它的函数或者由javax.comm实现,或者与DSTINIM400设计中的外部串口没有关系。不需要TINIm390的serial2/3函数,比如SERIAL_EX_SET_PORT_ADDRESS,因为驱动以库的形式加载,因而很容易更改和重新编译。并且,动态变量例如地址会降低代码执行效率。由具有固定地址的可加载库提供地址,这样使用单条指令即可加载地址。
  MOV DPTR, #SERIAL2_BASE_ADDR
对应动态地址的相同程序如下:
  MOV DPTR, #SERIAL2_BASE_ADDR
  MOVX A, @DPTR
  MOV DPL1, A
  INC DPTR
  MOVX A, @DPTR
  MOV DPH1, A
  INC DPTR
  MOVX A, @DPTR
  MOV DPX1, A
库的大多数“Native_”方法提供与TINISerialPort原有的实现方法相同的功能。对于大多数数据存储,库使用静态DB (定义字节)变量,并与库代码存储在相同的存储器空间。DB访问快于状态块访问,并且不像间接访问那样消耗共享资源。更大的存储器变量,例如输入缓存,由malloc从TINI运行环境的堆中分配,指向这些缓存的指针存储为静态变量。增加了函数Native_TESP_GetVersionNumber,因为外部串口驱动程序的版本独立于TINIOS的版本。Native_GetDriverNumber是必需的,因为NativeComm驱动调用需要驱动编号(参考AN706),而为本地库分配的是动态驱动编号。

为实现对javax.comm功能的动态访问,提供了TINIExternalCommDriver类。如果javax.comm发现/etc/javax.comm.properties文件,它会试图加载“Driver=”行所列的驱动。这种情况下,驱动应该是TINIExternalCommDriver。如果该类未被加载,那么会加载静态TINICommDriver类。由于外部串口驱动是为了补充原有的串口驱动,而不是替代它,所以TINIExternalCommDriver将作为TINICommDriver的代理,并在使用serial0、serial1或者serial4时加载TINISerialPort (图4)。

图4. 加载Comm驱动
图4. 加载Comm驱动

TINIExternalSerialPort类扩展了原有的TINISerialPort类,仅多加载了少量方法。构造器public TINIExternalSerialPort(String name)必须查询本地库以获取动态驱动编号。为利用NativeComm驱动方法,原有的大多数方法中使用了该编号(参考AN706)。修改了getPortNames方法以返回新的串口名称“serial2”与“serial3”。TINISerialPort类实例化了一个内部类TININativeThread,以管理事件线程。该类过分依赖于TINIOS的核心功能,因此增加了一个新的TINIExternalNativeThread类,来处理serial2/3的事件。编写了addEventListener与removeEventListener两个TINIExternalSerialPort方法,用来管理新的事件线程。加载其余的TINIExternalSerialPort方法以处理serial2/3的特定功能。

结论

TINI外部串口的设计和实现可以使用现有的硬件和软件,以降低整个开发成本。在本参考设计中,现有的TINIS400插座板与可选的CPLD一起使用,并利用RTL硬件实现简化硬件设计。本方法还提供了更改设计的灵活性,而无需修改现有的电路板。为处理特殊串口问题,对TINISerialPort类进行子类化。充分利用应用笔记706 Writing a Device Driver for TINIOS,可为本地驱动开发提供有效的帮助。应参考该应用笔记,并弄清楚该过程的所有问题。通过利用这些资源,主要工作就只剩下设计硬件和实现底层特定UART驱动功能了。

参考资料

  1. 原理图(源码和二进制—示例/TINI SDK 1.15或更高版本的ESerial400目录)
  2. 应用笔记706:Writing a Device Driver for TINIOS
  3. 微控制器文档
  4. DS80C400数据资料
  5. Java Communications API
  6. 用户讨论版 (English only)

Java是Sun Microsystems, Inc.的商标。


我们期待您的反馈!
喜欢?不喜欢?有待改善?或为我们提供建议?请与我们联系 — 我们将根据您的意见或建议改善我们的工作。 网页评价或提供建议


自动更新
需要自动接收最新发布的应用笔记吗?请订阅EE-Mail™ (English only)。



更多信息  APP 3412: Apr 08, 2005
DS80C400 网络微控制器 完整的数据资料
(PDF, 2.1MB)
免费样品
DSTINIM400 网络微控制器评估板 完整的数据资料
(PDF, 876kB)
DSTINIS400 DSTINIs400/DSTINIx-00x插座板 完整的数据资料
(PDF, 496kB)
MAX3245E ±15kV ESD保护、1µA、1Mbps、3.0V至5.5V、RS-232收发器,提供AutoShutdown Plus 完整的数据资料
(PDF, 1.2MB)
免费样品
 

下载,PDF格式下载,PDF格式 (101kB)
 AN3412, AN 3412, APP3412, Appnote3412, Appnote 3412


      隐私权政策    法律声明

      © 2008 Maxim Integrated Products, Dallas Semiconductor版权所有