时间:2023-01-09 06:10:17
序论:在您撰写通信管理论文时,参考他人的优秀作品可以开阔视野,小编为您整理的7篇范文,希望这些建议能够激发您的创作热情,引导您走向新的创作高度。
关键词:通信;RS-232RS-485/RS-422收发器LMS202E/LMS485
1概述
LMS202E和LMS485分别是美国国家半导体公司生产的RS-232通信用双收发器和多点传输线用高速双向数据通信差分总线/线路收发器。这两种器件均使用5V单电源供电,电源电流分别为1mA(LMS202E)和0.32mA(LMS485的典型值)。
LMS202E满足E1A/T1A-232和CCITTV.28规范,数据传输率可达230kbps,而其±15kV的静电放电(ESD)保护指标符合IEC1000-4-2(EN61000-4-2)标准要求。LMS202E主要用于销售点终端POS(条形码阅读机)、手持式设备(或装置)和通用目的RS-232通信等方面。
LMS485满足ANSI标准E1A/T1ARS485/RS-422,数据速率为2.5Mbps。LMS485的应用领域主要是低功率RS-485系统网络中心、桥路和路由器销售点设备(自动柜员机ATM、条形码扫描仪)、局域网(LAN)、综合业务数据网(ISDN)、工业可编程逻辑控制器、高速串/并联应用以及噪声环境下的多点应用系统等。
2RS-232双收发器LMS202E
LMS202E采用16引脚SOIC封装,可与MAXIM公司的MAX202E相互代换。
LMS202E的内部结构及典型应用电路如图1所示。该器件内含DC-DC变换器,利用电路中的C1~C4使内部对偶充电泵为两个发送器提供±10V的双电源。通过C1,电荷泵可将+5V的电源电压转换为+10V,并存储在C3中。而通过C2电荷泵则可将+10V转换为-10V电压,而后再把-10V存储在C4中。
发送器输入信号可从脚11和脚10输入且两个发送器在14脚和7脚上的输出与T1A/E1A-232E电平一致。T1和T2两个发送器的输出摆幅为±8V,开路输出电压摆幅为(V+-0.6V)~V-。接收器的R1IN和R2IN信号从脚13和脚8输入以接收T1A/E1A信号,并从脚12和脚9输出与TTL/CMOS兼容的信号。RS-232接收器的输入电压VRi范围为-30V~+30V,VS为5V时的输入低门限电平是1.4V,高门限电平为2V。接收器输出电压的最大范围为-0.3V~(VS+0.3V),从输入到输出的传输延迟时间为0.08μs(典型值)。
LMS202E的所有引脚都带有ESD保护。除了发送器输出脚(7脚和14脚)和接收器输入脚(8脚和13脚)外,其它引脚带有±2kV的人体模型(HBM)和±200V的机器模型(MM)ESD额定值。RS-232总线引脚(7脚、8脚、13脚和14脚)带有±15kV的HBM和IEC1000-4-2的耐冲击ESD保护。此外,总线引脚还能满足±8kV的IEC1000-4-2接触ESD保护要求。因此,这种ESD结构在加电、断电等场合可以承受较高ESD冲击。
3LMS485低功率差分数据收发器
LMS485采用8引脚DIP或SOIC封装,可与MAX485互相代换。LMS485芯片在内部集成了一个TRI-STATETM差分线路驱动器(D)和一个差分输入接收器,图2所示是LMS485芯片的内部结构及引脚排列图。
LMS485的DI(4)脚是驱动器输入,DE(3)脚为驱动器输出使能输入,A(6)脚和B(7)脚分别是驱动器(同相和反相)输出和接收器输入,RO(1)脚和RE(2)脚分别是接收器输出和接收器输出赋能输入,GND(5)脚为接地脚,VCC(8)脚为5±0.25V电源电压输入端。
LMS485的输入与输出逻辑真值表如表1所列。其中“X”为不相干,“Z”为三态,“OPEN”为非终止(仅开路输入)。
表1真值表
驱动器
REDED1AB
XHHHL
XHLLH
XLXZZ
接收器
REDEA-BRO
LL≥+0.2VH
LL≤-0.2VL
HXXZ
LLOPENH
LMS485的主要特点如下:
满足ANSI标准RS-485-A和RS-422-B;
采用5V单电源工作,低功率BiCMOS工艺可保证电源电流典型值不超过320μA,工作温度范围为-40~85℃;
总线上允许挂接的收发器数目多达32个,数据速率可达2.5Mbps;
带热关闭保护、短路保护和接收器开路故障安全保护功能;
关键词:VXD实时串口通信
引言
在微软的视窗操作系统中,系统内核掌管所有的应用程序,通过独特的任务调度算法实现CPU的分时多任务处理方式。多任务处理对大多数用户可能是件好事,但是对那些想把实时通信建立在Windows操作系统上的特殊用户来说,操作界面的图形化并不比MS-DOS的单任务更具吸引力。在视窗操作系统里可以进行实时通信和控制码?答案是:VXD技术可以帮我们在获取友好的人机界面的同时还拥有很强的实时性。
1VXD技术解析
VXD技术可追溯到Windows3.1,它的引入就是要让操作系统实现多工以及硬件资源的共享。为了支持多个MS-DOS任务同时执行,Windows98让每个MS-DOS应用程序在各自的虚拟机(VM)上运行,各自互不相干;而所有的Widnows应用程序却都在一个虚拟机上运行。图1所示的结构框图很好地说明了Windows98的整体架构。
图1中,由众多的VXD组成系统级代码处于最底层。其中,处于中心地位的是一名为VMM32的VXD,它负责协调和管理所有的VXDs。其它VXDs则通过消息机制(这个消息机制由VMM32.VXD来维护)彼此联系。由所有VXDs开放出的服务接口(API)组成了一个服务网,它们彼此通过合作的方式,提供Windows98的系统底层驱动服务。
从以上Windows98系统架构可以看出,要想在视窗平台下获取很强的实时性,仅靠提升应用程序线程优先级的方法是不够的。因为Win32应用程序代码属于Ring3级,而VXD代码则属于Ring0级;采用VXD撰写的实时通信程序可以完全不受代码限制,可以直接对硬件进行操作。VXD的这个特点正是实时通信建立所必须的。
设计实时通信的VXD前,先解释以下几个问题:
①VMM32使用VPICD.VXD虚拟化每个硬件和软件中断。VMM32为每个虚拟机(VM)维护一个IDT结构,当中断发生时,CPU先保护中断现场,然后经由当前VM的IDT把这个中断引导至相应的中断处理程式。
中断的虚拟化,使我们有机会给每个中断提供新的中断处理函数,并可以让多个硬件共享同一个中断号。VPICD.VXD为我们提供这些服务。
②VMM有两个调度器,用以在多个线程和VMs之间实现抢占式多工。主调度器负责选定下一个将被执行的线程。这个选择可以是一个,也可以是多个。然后,主调度器把选择结果送给所谓的时间片调度器,并由后者完成各个应用程序间的时间片分配。调度器也时应用程序经由呼叫Win32线程优先调整API(如SetThreadPriority和SetPriorityClass等)做出回应。当中断发生时,VMM32自动提升中断处理函数所在VM之优先级,保证中断处理函数能及时被执行。
③VXD和Win32应用程序可直接通信。Win32应用程序可通过一个系统API(DevicelOControl(…))来呼叫位于底层的VXD为其服务。在呼叫VXD前,首先必须调用CreatFile(…)这个API加载该VXD(如果该VXD是一个静态VXD,则不用加载)。所有的呼叫动作其实都通过VMM32完成。VXD也可以通过消息方式和位于上层的Win32应用程序通信。She11.VXD为所有希望以消息机制和Win32应用程序通信的VXD提供了这一服务。
以上是编写一个串口通信驱动需要的系统层面知识。对于Windows底层的了解。
2用VXD实现一个实时串口通信驱动
接下来用VXD技术实现一个实时串行通信的驱动。这个VXD是一个动态(Dynamic)VXD,当它的服务被呼叫时,VMM32会动态加载这个VXD。作者采用的工具是C+98DDK。当然也可以使用其它的工具,如MASM6.11(或更高版本)、VtoolsD。用C搭配DDK完成VXD构建的好处是,可以使用C语言完成绝大部分的程序,程序比较容易阅读和维护。
用C来实现一个VXD驱动,需要准备如下条件:一个.ASM的汇编语言接口文件(在其中定义VXD要处理的系统消息和输出API),一个.C的函数实现文件(在其中完成自己函数实体),一个.DEF的定义文件(在其中定义VXD中各个段的别名并汇成一个DDB)和一个.MAK档(用来编译并连接生成VXD,可有可无)。在这里,仅给出用C实现的函数档。至于其它的文件,可以从本文所列的参考书目或其它文献中找到相关文档的说明。
这个串口通信驱动程序的功能是:实时送出一个Byte的数据,实时接收一个Byte的数据。作为演示之用,并没有加入其它代码。该VXD驱动主要由如下3个系统消息(由VMM32来维护和管理)处理函数组成,其代码如下:
(1)OnSysDynamicDeviceInit()函数
BOOLOnSysDynamicDeviceInit()
{//OnSysDynamicDeviceInit
irqhandle=VPICD_Virtualize_IRQ((DWORD)(&irq4));
if(irqhandle==0){
returnFALSE;
}
returnTRUE;//OnSysDynamicDeviceInit
}
该函数用来完成VXD初始化所做的工作。在本例中,由于实时监视串口中断的需要,要给COM1的中断安装一个自定义的断服务函数。98DDK已经提供了这个函数的C语言版,其原型是HIRQstaticVPICD_Virtualize_IRQ(PVIDpvid),在vpicd.h中。该函数需要一个指针作为参数(指向名为VPICD_IRQ_Descriptor的结构体),函数传回一个指向该虚拟IRQ的句柄(该句柄在后来的VPICD服务中需要提供)。VPICD_IRQ_Descriptor结构体的组成为:
typedefstructVPICD_IRQ_Descriptor{
USHORTVID_IRQ_Number;//IRQ号(0~15)
USHORTVID_Options;//标志位选项
ULONGVID_Hw_Int_Proc;//硬件中断服务程序的地址
ULONGVID_Virt_Int_Proc;//虚拟中断服务程序
ULONGVID_Mask_Change_Proc//MaskChange调用例程
ULONGVID_IRET_Proc;//IRET调用例程
ULONGVID_IRET_Time_Out;//在Vm的进程优先级提升之前的最大等待时间
ULONGVID_Hw_Int_Ref;//硬件中断服务程序的数据存放地址
}VID;
其中只用到三位。在本例中需要声明一个名为irq4的全局变量为VID结构,并付给如下初值:VIDirq4={4,0,hwproc,0,0,0,0,500,0},表示将要虚拟化IRQ4,改变其中断处理函数为voidhwproc(void),该函数的原型如下:
voidhwproc(void){
_asm{
movdx,0x3f8
inal,dx
movbyteptr[readin],al
clc
}
return;
}
在这个中断处理中,仅仅从COM1的数据寄存器(地址为3F8h)中读取接收到的数值,并把该数值存放在一个类型为BYTE、名为readin的内存中。
(2)OnSysDynamicDeviceExit()函数
BOOLOnSysDynamicDeviceExit()
{
VPICD_Force_Default_Behavior(irqhandle);
//解除IRQ4虚拟化
returnTRUE;
}//OnSysDynamicDeviceExit
该数提供了用于善后处理VXD在卸载时需要完成的事件。在本例中,和VXD初始化对应,需要解除对COM1的中断IRQ4的虚拟化。作者也是用98DDK在vpicd.h中提供的外包函数voidstatic_inlineVPICD_Force_Default_Behavior(HIRQhirp)。该函数唯一需要的参数便是使用VPICD_Virtualize_IRQ函数传回的IRQ句柄。
(3)OnDeviceIoControl()函数
DWORDOnDeviceIoControl(PDIOCPARAMETERSp){
Switch(p->dwIoControlCode)
{
case1://端口写功能
if(!p->lpvOutBuffer||p->cbOutBuffer<1)
{//输出缓存的有效性检查
returnERROR_INVALID_PARAMETER;
}
if(serial_out((DWORD)(p->lpvInBuffer)))
{//数据发送
*(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);
}
else{
*(BYTE*)(p->lpvOutBuffer)=0;
}
open_int();//打开com1中断
return0;
case2://端口读功能
if(*(BYTE*)reading==0x00)
{//数据读入
*(BYTE*)(p->lpvOutBuffer)=0x00;
return0;
}
*(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);
return0;
}
return0;
}
return0;
}
OnDeviceIoControl函数用来处理Win32应用程序对VXD的呼叫。Win32应用程序的呼叫会让VMM32送给该VXD一个系统信息,并传递进一个DIOCPARAMETERS结构的指针。该结构里包含Win32应用程序呼叫时传递进来的各个参数。这个结构的组成如下:
TypedefstunctDIOCParams{
DWORDInternall;//指向客户寄存器的指针
DWORDVMHande;//该VM的句柄
DWORDInternal2;//指向DDB结构的指针
DWORDdwIoConrolCode;//DeviceIoControl例程中呼叫的控制码
DWODlpvInBuffer;//DeviceIoControl例程呼叫所传递进来的输入缓冲区地址
DWORDcbInBuffer;//输入缓冲区的大小
DWORDlpvOutBuffer;//DeviceIoControl例程呼叫所传递进来的输出缓冲区地址
DWORDcbOutBuffer;//输出缓冲区的大小
DWORDlpcbBytesReturned;//拷贝到输出缓冲区中的字节数(可以为NULL)
DWORDlpOverlapped;//DeviceIoControl例程呼叫所传递进来的重叠I/O块结构
DWORDhDevice;//Ring3层呼叫应用程序句柄
DWORDtagProcess;//例程标签
}
DIOPARAMETERS;
其中,dwIoControlCode指明了Win32应用程序需要VXD提供的哪一项服务。在本例中采用一个switch-case语句作为服务入口,如下所示。其中服务1为让串口送出一个字节,服务2为读取一个已经由串口接收的字节。函数open_int()是用来初始化串口以便接收字节数据;函数BOOLserial_out(DWORDpBuffer)是让串口发出一个字节。它们的函数体分别如下:
BOOLserial_out(DWORDpBuffer){
if(pBuffer==NULL){
returnFALSE;
}
_asm{
pushfd
cli
pusheax
pushedx
movdx,0x3fb;设置COM1的波特率
moval,0x83
outdx,al
movdx,0x3f8
moval,12
outdx,al
movdx,0x3f9
moval,0
outdx,al
movdx,0x3fb;设置COM1的线控项
moval,3
outdx,al
movdx,0x3f9;CMM1关中断
moval,0
outdx,al
movdx,0x3fa;关闭com1的FIFO功能
moval,0
outdx,al
movdx,0x3f8;字节发送
moval,byteptr[pBuffer]
outdx,al
popedx
popeax
popfd
sti
}
returnTRUE;
}
serial_out这个函数体的实现是用汇编语言实现的。因为涉及到很多的端口提供以及CPU的标志(flag)和压栈操作,因此考虑到用汇编语言编写会简化代码。因为此串口传输中,用到了关闭中断的指令(cli),所以,当写操作所要求完成的任务很多时,此关中断指令会让程序的实时性很好地体现出来,但cli指令有效时间过长会导致系统问题,所以还是要谨慎使用。
Voidopen_int(void){
_asm{
movdx,0x3f9;COM1开中断
moval,0x05
outdx,al
}
return;
}
open_int函数用来把PC串口的中断设备按照需要设立起来。函数体很简单,仅改变了地址为3F9h的内容,意为设置Rxdataready和Linestatus中断位,以便让CPU可以及时在COM1的中断服务程序里读取串口接收到的字节。
以上涉及到串口输入和输出的函数体实现代码中,用到了PC16550UART的资料。
至此,一个可用于实时串口通信的VXD驱动程序已经完成。由于篇幅所限,不能将其它必要的文档一同提出来讨论。
3Win32客户测试程序
有了上述VXD驱动程序,还需要搭配一个Win32客户程序来进行测试。在网络补充版中,给出一个笔者在VC6下编制的一个控制台应用程序片断,以供参考。
现在编制VXD驱动还没有一个集成开发环境(IDE)。本文的驱动程序是用VC6.0自带的编译器编译的。由于要编译汇编文档,所以还需要把一个MASM汇编器(要求6.0以上版本)及其相关文档拷贝到VC6.0的vc98\u30446目录下。
关键词:NRZHDB3单片机E1收发芯片DS2153Q
常用的NRZ码不适合在高速长距离数据通信的信道中传输,因而选用了另外一种编码—HDB3码。HDB3码是串行数据传输的一种重要编码方式。和最常用的NRZ码相比,HDB3具有很多优点,例如:消除了NRZ码的直流成分,具有时钟恢复更好的抗干扰性能,这使它更适合于长距离信道传输。
E1信号选用HDB3编码方式,速率2.048Mbps,可以在特性阻抗120Ω的RJ45平衡双绞线上传输1.5km,能够满足大多数情况下数据的高速长距离传输。在数据速率小于2.048Mbps的高速速率时,可以通过插入额外数据比特提高数据数率。E1收发芯片DS2153Q完全符合E1信号标准,而且具备微控制器接口,大大提高了该芯片的可用性。
E1有成帧、成复帧与不成帧三种方式。在成帧的E1中,第0时隙用于传输帧同步数据,其余31个时隙可以用于传输有效数据;在成复帧的E1中,除了第0时时隙外,第16时隙是用于传输信令的,只有第1~15,第17~31共30个时隙可用于传输有效数据;而在不成帧的E1中,所有32个时隙都可用于传输有效数据。本文提出的NRZHDB3码制转换器的E1工作在不成帧方式,也就是说E1的32个时隙均用于传输有效数据。
1E1收发芯片DS2153Q简述
DS2153Q是Dallas公司的T1/E1收发芯片,符合最新的E1线路标准,包括ITUG.703、G.704、G.706、G.823、I.431、ETSI300011、300233、TBR12和TBR13等,该芯片能完成NRZ和HDB3码间的相互转换,码率可达2.048Mb/s,而且在片内集成了接收NRZ码的数据时将恢复电路,更有利于后级接收电路。片内D/A能够实现G.703标准的输出波形,适用于75Ω和120Ω特性阻抗的双绞线,并且具有完善的数据流状态监测功能,可以实时指示数据流的传输状况。
DS2153Q的微控制器接口使其可以很容易与单片机等MCU接口连接。其内部的71个8位寄存器使用户可以通过MCU对DS2135Q进行功能配置和状态监测这些寄存器主要有接收控制寄存器、发送控制寄存器通用控制寄存器、中断屏蔽寄存器和工作状态寄存器图1为DS2135Q的内部结构图。
2码制转换器电路设计
NRZ-DB3码制转换器为NRZ码到HDB3码和HDB3码到NRZ码的转换,设计选用专用E1收到芯片DS2153Q和单片机AT89C51实现该码制的转换功能。该码制转换器把输入的NRZ转换为HDB3码输出,同时接收E1线路上的数据转换成HRZ码,并恢复出数据时钟,供后级数据接收单元使用。
AT89C51为Atmel公司的8位单片机,负责控制通信芯片DS2153Q的工作模式和状态监,使其完成NRZ码到HDB3码和HDB3码到HRZ码的转换。同时,该单片机的电路还包括μP监控电路IMP813L,用于提高码制转换器工作的抗干扰能力和可靠性。
图2是该码制转换器的结构框图。
DS2153Q的并行数据/地址线与单片机的P0口相连;片选信号选用单片机的P2.0;单片机的读写信号与DS2153Q的读写信号相连;同时,DS2153的两个中断申请线与单片机的INT0和INT1相连。这样DS2153Q可以通过中断的方式及时通知单片机自身的工作状态。AT89C51与DS2153Q的电路连接图如图3所示,通过以上的硬连接,实现单片机对DS2153Q的控制和状态监控。
图3AT89C51与DS2153Q电路连接图
该码制转换器选用IMP813L作为μP监控电路,实现可靠上电复位和看门狗控制。DS2153Q的时钟信号是通过对单片机时钟信号的二分频来实现的。单片机选用16.384MHz的时钟信号,使用74HC74二分频后,得到8.192MHz的频率信号作为DS2153Q输入时钟。
在DS2153Q的电路设计中,为了使其工作在不成帧方式,发送的数据全部从TSER引脚输入,需要将引脚TLINK和TSER短接。发光二极管用于转换器的工作指示,可以直观判断当前数据转换是否正常。
该码制转换器使用特性阻抗120Ω的RJ45平衡双绞线进行数据传输,DS2153Q收发电路如图4所示,传输变压器输入输出匝数比为1:1.36。
3单片机控制程序设计
转换器单片机控制程序包括两部分:DS2153Q的功能配置和DS2153Q工作状态监控。DS2153Q的功能配置实现HDB3码的正常动作;DS2153Q工作状态监控用来实时获得当前转换器是否工作正常,并及时上报和指示。
3.1DS2153Q功能配置
转换器上电后,首先由μP监控电路进行有效复位,保证单片机的正常初始化,一单片机即进入通信芯片DS2153Q的配置过程。
①初始化测试寄存器,向相应测试寄存器写0即写。
②进行接收控制存器(RCR)的配置,包括接收帧模式、自动重同步使能、重同步准则和接收动态存储功能等,使DS2153Q接收单片工作在AutoResync、DisableElasticStore。
③进行发送控制存器(TCR)的配置,包括发送帧模式、自动设置故障位和16位引脚的功能选择等,使DS2153Q发送单元工作在E-bitsnotautomaticallysetinthetransmitdirection,并根据当前转换模式的不同设置16引脚的功能,0=ReceiveLossofSync(RLOS)、1=LossofTransmitClock(LOTC)。
④进行通用控制存器(CCR)的配置,使能DS2153Q、HDB3码的接收和发送、配置错误计数器更新时间、禁止动态存储发送数据等。
⑤初始化中断屏蔽寄存器,使能接收载波丢失、接收失步中断、接收数据全0和全1中断,使能发送时钟丢失中断,通过这些中断使单片机可以及时得知DS2153Q的工作状态,实现单片机对其的实施监测。
⑥初始化传输线接口单元,向LIRST数据位写0,然后写1,使传输线接口进入正常工作模式。
⑦初始化传输线接口控制寄存器,包括传输波形选择、接收均衡器增益选择、抗抖动抑器选择等。
单片机控制流程如图5所示。
下面是DS2153Q的功能配置程序(部分)。
;*****************************************************;
MOVA,02H
MOVDPTR,#RCR1
MOVX@DPTR,A;写寄存器RCR1,使能自动重新同步
NOP
MOVA,#04H
MOVDPTR,#RCR2
MOVX@DPTR,A;写寄存器RCR2,禁止弹性存储功能
NOP
MOVA,#41H
MOVDPTR,#TCR1
MOVX@DPTR,A;写寄存器TCR1,TSYNC为输出方式
NOP
MOVA,#0F9H
MOVDPTR,#TCR2
MOVX@DPTR,A;写寄存器TCR2,E数据位禁止自动置位
NOP
MOVA,#44H
MOVDPTR,#CCR1
MOVX@DPTR,A;写寄存器CCR1,允许接收和发
NOP;HDB3码
NOVA,#00H
MOVDPTR,#CCR2
MOVX@DPTR,A;写寄存器CCR2,配置错误计数寄存器
NOP
;********************************************************
3.2DS2153Q状态监控设计
在完成DS2153Q的寄存器配置后,单片机即进入传输状态监测程序,实时监控DS2153Q的工作正常与否,包括状态寄存器的读取和DS2153Q中断的响应,并从中判断故障、及时通报。
(1)发送状态监控
DS2153Q的发送状态监控是通过单片机的INT1来实现的。当状态寄存器的发送状态位置1,则DS2153Q产生中断,片机响应该中断来读取当前状态寄存器的故障位。当读取完毕后,需要向该状态寄存器特定状态位写1,保证以后的故障可以正确置位。
下面给出了NRZ发送时钟丢失故障的状态监控程序(中断1处理程序)。
MOVDPTR,#SR2;读DS2153Q状态寄存器2
NOP
MOVXA,@DPTR
ANLA,#04H
JNZERROR
SJMPFAVER
ERROR:SETBERR_SR
SJMPLOCKE
FAVER:CLRERR_SR
LOCKE:JNBERR_SR,WORK;判断发送数据时钟丢失与否
SETBP1.0;故障,工作指示二极管灭
SJMPEVER
WORK:CLRP1.0;正常,工作指示二极管亮
EVER:MOVDPTR,#SR2
MOVA,#04H
MOVX@DPTR,A
RETI
(2)接收状态监控
DS2153Q的接收状态监控是通过单片机的INT0来实现的。当状态寄存器的发送状态位置1,则DS2153Q产生中断,单片机响应该中断来读取当前状态寄存器的故障位。当读取完毕后,需要向该状态寄存器的特定状态位写1,保证以后的故障可以正确置位。
下面给出了HDB3码接收载波丢失故障的状态监控程序(中断0处理程序)。
MOVDPTR,#SR1;读DS2153Q状态寄存器21
NOP
MOVXA,@DPTR
ANLA,#02H
JNZERROR
SJMPFAVER
EPPOR:SETBERR_SR
SJMPLOCKE
FAVER:CLRERR_SR
LOCKE:JNBERR_SR,WORK;判断接收载波丢失与否
SETBP1.0;故障,工作指示二极管灭
SJMPEVER
WORK:CLRP1.0;正常,工作指示二极管亮
EVER:MOVDPTR,#SR1
MOVA,#02H
MOVX@DPTR,A
RETI
关键词:多通道缓冲串行口McBSPTMS320C5402μPD780308SPIDSP
1引言
随着信息技术革命的深入和计算机技术的飞速发展,DSP技术也正以极快的速度被应用到科技和国民经济的各信领域。在很多工程开发设计中,由于要求实现单片DSP与单片DSP、多片DSP芯片以及及其它处理芯片之间的通信,因此,怎样更高效、更便捷的实现这些通信,已成为广大DSP应用者首先要解决的一个问题。
本文根据笔者在工程应用和调试方面用TI的DSPTMS320C5402与NEC的μPD780308单片机进行通信的经验,介绍并讨论了将TMS320C5402DSP的多通道缓冲串行口McBSP(Multi-channelBufferedSerialPort)配置为SPI模式(即时钟停止模式),从而实现DSP与其它单片处理器之间的通信设计方法同时给出了实现方法的部分程序代码。
2多通道缓冲串行口McBSP
多通道缓冲串行口McBSP的功能是提供器件内外数据的串行交换。同以前的串口相比,McBSP串口具有相当大的灵活性。表1给出了有关TMS320C5402的McBSP管脚说明。其中串口接收、发送时钟和同步帧信号既可由外部设备提供,又可由内部时钟发生器提供,从而大大的提高了通信的灵活性。
表1TMS320C5402的有关McBSP管脚说明
管脚说明说明
DR数据输入端
DX数据输出端
CLKR接收数据位时钟
CLKX发送数据位时钟
FSR接收数据帧时钟
FSX发送数据帧时钟
CLKS外部提供的采样率发生器时钟源
3SPI协议中的McBSP时钟停止模式
SPI协议是以主从方式工作的,这种模式通常有一个主设备和一个或多个从设备,其接口包括以下四种信号:
(1)串行数据输入(也称为主进从出,或MISO);
(2)串行数据输出(也称为主出从进,或MOSI);
(3)串行移位时钟(也称为SCK);
(4)从使能信号(也称为SS)。
图1为设备的SPI接口示意图。该接口在工作时,主设备通过提供移位时钟和从使能信号来控制信息的流动。从使能信号是一个可选的高低电平,它可以激活从设备(在没有时钟提供的情况下)的串行输入和输出。在没有专门的从使能信号的情况下,主从设备之间的通信则由移位时钟的有无来决定,在这种连接方式下,从设备必须自始至终保持激活状态,而且从设备只能是一个,不能为多个。
TMS320C5402提供的时钟停止模式可用于SPI协议通信,当McBSP被配置为时钟停止模式时,发送器和接收器在内部是同步的,即可将发送数据帧时钟(FSX)用作从使能(即SS),而将发送数据位时钟(CLKX)用作SPI协议中SCK。由于收数据位时钟(CLKR)和接收数据帧时钟(FSR)在内部与FSX和CLKX是相连的,因此,该管脚不能用于SPI模式。
当McBSP被配置为一个主设备时,传送输出信号(BDX)被用作SPI协议的MOSI信号,而接收输入信号(BDR)则被用作MISO信号。图2所示为McBSP用作主设备时的SPI接口示意图。
同样地,当McBSP被配置为一个从设备时,BDX被用作MISO信号,BDR则被用作MOSI信号。图3为McBSP用作从设备的SPI接口示意图。
当TMS320C5402的McBSP被用于时钟停止模式时,寄存器SPCR1的CLKSTP位域和引脚配置寄存器的CLKXP位的配置如表2所列。
表2时钟停止模式配置
CLKSTPCLKXP说明
0XX不可用时钟停止模式。时钟被激活用于非SPI模式
100时钟开始于上升沿(无延迟)
110时钟开始于上升沿(有延迟)
101时钟开始于下降沿(无延迟)
111时钟开始于下降沿(有延迟)
4其它有关寄存器的配置
为了更好地掌握和了解McBSP作为SPI设备时的有关寄存器配置,现以McBSP作为SPI从设备来介绍有关McBSP的其它有关寄存器的配置,若McBSP做为SPI主设备,则相关配置正好相反。当McBSP作为SPI从设备时,主设备外部产生主时钟。CLKX引脚和FSX引脚必须被设置为输入。由于CLKX引脚和CLKR信号在内部相连接,因而传送和接收回路均由外部主时钟计时(CLKX)。同时,由于FSX引脚和FSR信号也已在内部连接,因此,CLKR引脚和FSR引脚不再需要外部信号的连接。
尽管CLKX信号由主设备外部产生且与McBSP同步,但是,McBSP的采样率发生器仍然必须正确启动SPI从设备,同时,采样率发生器还应被设置为最大速率(CPU时钟速率的一半)。另外,内部采样率时钟常被用来同步McBSP逻辑和外部主时钟以及从使能信号。每次传送时,McBSP一般在从使能信号的上升沿进行FSX输入。也就是说,在每次传送的开始,主设备必须维护使能信号,而在每次传送完成后,则必须消除从使能信号。在两次传送之间,从使能信号不能一直保持为高电平。对正确的SPI从设备而言,McBSP的数据延迟参数必须设置为0,在这种运行模式中,设置值为1或2没有定义。配置McBSP为从设备所需的寄存器位值如表3所列。
表3SPI操作模式下的寄存器位值表
位域值功能描述寄存器
CLKXM0配置BCLKX引脚为输入PCR
CLKSM1由CPU时钟产生的采样率时钟SRGR2
CLKGDV1为采样率时钟选择2的划分因素SRGR1
FSXM0配置BFSX引脚为输入PCR
FSGM0对每个包传送,BFSX信号被激活SRGR2
FSXP1配置BFSX引脚为活动低电平PCR
XDATDLY0为SPI从设备运行,必须为0XCR2
RDATDLY0为SPI从设备运行,必须为0RCR2
5程序设计
下面是有关TMS320C5402器件的McBSP各个控制寄存器的配置,该配置程序笔者在实践中已经过测试,并已成功运用在了某工程设计中。
VoidMcBSP1_Config(void)
{
offlset=0x0000;
SPCR11=0x1800;;配置串口时钟停止模式CLKSTP=10
offlset=0x0001;
SPCR21=0x0222;
offlset=0x0005;
SRGR11=0x00FA;
offlset=0x0007;
SRGR21=0xa00F;
offlset=0x0002;
RCR11=0x0040;;接收一帧含一字,一字含16位
offlset=0x0003;
RCR21=0x0044;接收数据无延迟RDATDLY=00
offlset=0x0004;
XCR11=0x0040;;发送一帧含一字,一字含16位
offlset=0x0005;
XCR21=0x0044;;发送数据无延迟XDATDLY=00
offlset=0x000E;
PCR1=0x000;;发送时钟由外部时钟驱动,CLKX为输入脚CLKX=0,发送时钟极性CLKXP=0,发送帧同步极性FSXP=1
offlset=0x0008;
MCR11=0x0001;
offlset=0x0009;
MCR21=0x0001;
offlset=0x000C;
XCERA1=0x0003;
offlset=0x0001;
SPCR21=0x0262;
offlset=0x0001;
SPCR21=0x0263;
offlset=0x0000;
SPCR11=0x1801;;接收器有效
offlset=0x0001;
SPCR21=0x02e3;;发送器有效
Return;
}
铁路计算机通信网络管理中存在的问题
由于我国铁路建设起步较晚,导致铁路计算机网络管理系统也只是在近些年初步成型。相比于发达国家,我国在铁路计算机通信网络管理运行中缺乏经验。完善的计算机网络管理可以大大提高铁路运行效率,保障列车安全。但是在实际运行中,由于计算机网络建设不够完善、尖端技术人员缺失、硬件软件达不到规范要求等诸多问题,是影响铁路管理正常运行的重要因素。
铁路计算机通信网络管理问题的解决对策
关键词:USB教学机器人通信
EDUROBOT-680-II型教学机器人是上海交通大学机器人研究所采用世界银行贷款研制的一种五自由度多关节的机器人。它具备工业机器的基本功能、良好的开放性以及舒适的使用界面,主要大专院校和科研机构提供教学和科研工具。学生可以通过亲手操作了解和学习工业机器人,它具备工业机器人的基本功能、良好的开放性以及舒适的使用界面,主要为大专院校和科研机构提供教学和科研工具。学生可以通过亲手操作了解和学习工业机器人,科研人员还可对它进行二次开发。
教学机器人的上位机(主控计算机)和下位机(运动控制器)原先采用并行口(LPT1)的SPP方式进行通信。利用LPT1的状态寄存器(StatusPort)具有的读能力和每次传送半字节(Nibble)来实现数据的双向传送功能。每次传送的时序(次序)由软件建立,在控制字的协调下按照教学机器人的通信协议接收和发送数据。
目前USB越来越普及,正逐渐取代串口和并口在计算机接口中的地位。为了研究USB在实时通信时的性能,笔者已将教学机器人上下位机通信改用USB端口实现。
图1PL-2301结构框图
1USB特点及其应用
通用串行总线USB(UniversalSerialBus)是1994年底由Compaq、IBM、Microsoft等多家公司联合提出的一种计算机接噪覆亡,目前已发展到USB2.0。由于USB具有以下几方面的特点,所以迅速普及,逐渐确定了在计算机接口中的主导地位。
(1)易用性。USB支持热插拔和即插即用。
(2)可扩展性。用户可以通过连接USB集线器到一个已有的端口来增加USB端口数量,集线器上还可以连更多的集线器。理论上可以连接127个外设到USB总线上。
(3)快速性。USB1.1版规定了两种传输速率:低速传输和全速传输。低速传输的速率是1.5Mbps,全速是12Mbps。这不但远远高于传统的串口传输速率,也比并口传输快了好多倍。最近推出的USB2.0允许的最高传输速率高达480Mbps。
(4)可靠性。USB的可靠性来自硬件设计和USB数据传输协议两方面的保证。USB驱动器、接收器和电缆的硬件规范消除了大多数可能引起数据错误的噪声;USB协议使用了差错校验和数据重传机制,可以最大程度保证数据传输的准确性。
(5)内置电源。USB总线内置电源线,可以给外设提供5V和最多500mA的电源供应,满足大部分低功耗外设的电源要求。
由于USB具有这些突出的优点,不但一些传统外设开始提供USB接口,而且大量新型外设也把USB接口作为首先甚至唯一的接口,如MP3播放器、移动硬盘等。由于USB的高可靠性和足够快的通信速率,USB开始应用于工业级的实时通信和控制,例如机器人系统中示教盒与控制器的通信。本文论述的用USB端口实现机器人上位机与下位机的通信也属于这些方面的应用。
2用USB实现计算机双机通信
由于USB模型是一种Host-Slave(主机-外设)主从式结构,没有办法使两台主机不通过外设而直接通过USB总线通信。然而可通过增加外设控制器的方法使两台主机利用它们的USB端口通信。每个外设控制器连接到不同的主要,并利用共享的缓冲器交换数据。Cypress公司的EZ-Link和Prolific公司的PL-2301把两个外设控制器和共享缓冲区集成到一块芯片上,作为两台主机通过USB总线通俗诉桥梁。其它公司也提供类似的控制芯片。在教学机器人中,采用PL-2301。
PL-2301是台湾Prolific公司生产的一种全速USB控制芯片。PL-2301的结构框图如图1所示。
PL-2301包括两套独立的USB控制单元。在握手信号的协调下,它们通过两个FIFO缓冲器无阻塞地交换数据。PL-2301包含四个终端:缺省的控制终端(地址00H)、中断终端(地址81H)、块输出终端(地址02H)、块输入终端(地址83H)。控制传输用于在主机列举阶段完成对PL-2301的配置及在两台主机通信时控制PL-2301的握手信号;中断传输用于PL-2301定期(每毫秒一次)向主机报告握手信号的状态;块传输用于两台主机之间实时地交换数据。块传输支持错误检测,这对实时通信和控制很重要。控制传输被确保拥有10%的USB总线带宽,中断传输和等时传输最多可以使用90%的带宽,块传输使用剩余的最大可用带宽(最多95%)。当总线不太忙时,由于块传输只有一个很小的协议头(13字节),它是所有传输类型中最快的。为了确何教学机器人上下位机以最快的速度通信,满足实时性要求,最好不要在USB总线上挂接过多的USB外设。
PL-2301除了能对USB标准请求做出反应外,还能对几种厂商自定义的请求做出反应。自定义请求ClearQuickLinkFeature和SetQuickLinkFeature用于控制两台主机通信时PL-2301的握手信号。这些握手信号是:
(1)TX_RDY指示本地USB端口是否准备好传输数据的指示信号。
(2)S_EN挂起使能信号。置位后,PL-2301支持标准的USB挂起特性。
(3)RESET_O块输出管道的复位信号,用于出现错误时复位块输出通道。
(4)RESET_IN块输入管道的复位信号,用于出现错误时复位块输入管道。
(5)TX_REQ块传输的请求信号。
(6)TX_C块传输完成的指示信号。
(7)PEER_E告诉对方本地端口是否连接好的指示信号。
在这几个握手信号的协调下,上位机和下位机可以双向通信。图2是主机PCA向PCB传输数据的流程图。这些底层的细节问题并不需要控制,由PL-2301的驱动程序完成。
图3教学机器人控制系统软件结构
3软件结构
3.1教学机器人软件结构
EDUROBOT-680-II型教学机器人控制系统的控制软件包括下位机的底层控制软件和上位机的上层控制软件,它们通过USB端口通信。其软件结构如图3所示。
上层控制软件运行在Windows98平台上,它为用户提供与机器人交互的人机接口界面,完成复杂运动控制的数据处理和插补计算。它由人机界面、运算插补、主控、通信四大模块构成。通信模块能够实时地发送控制命令给下位机并从下位机获得反馈信息,同时保证数据传输的准确性。
为了提供对USB的支持(为了使底层控制系统有更好的实时性和更紧凑,下一步准备将底层控制系统改用支持USB的WindowsCE、VxWorks或嵌入式Linux),底层控制系统目前采用Windows98平台。底层控制软件接口收上层控制软件的控制命令,同时解释并执行控制命令。这通过多线程实现。任务调度和管理模块是底层控制软件的主线程,它负责从指令队列中取出指令并解释执行。主线程执行过程会产生一个辅助线程——通信线程。通信线程调用通信模块的输出函数,负责监视USB端口。如果上位机传来控制命令,则遵循教学机器人通信协议接收并存入指令队列中。
3.2通信模块的实现
上位机和下位机控制软件共用相同的PL-2301客户驱动程序、传输模块(由Prolific公司提供)和通信模块。
PL-2301客户驱动程序是典型的WDM驱动程序。驱动程序屏蔽了底层的硬件细节和USB协议,使上层软件仅通过驱动程序接口函数就可以访问PL-2301。主要的几个驱动程序接口函数是CreateFile()、WriteFile()、ReadFile()、DeviceIOControl()。
传输模块(Transfer.dll)是驱动程序的上层模块,它通过调用驱动程序接口函数,实现了两台主机通过PL-2301通信的基本通信能力。Transfer.dll会产生一列三个线程:
(1)发送线程。这个线程对发送请求进行排队并按先后顺序处理请求。如果出现错误,则努力恢复。
(2)接收线程。这个线程等待来自状态线程的消息,如果发现对方主机将要传输数据,就按照传输协议接收数据。接收线程把接收到的数据放在接收FIFO缓冲器中,等待上层软件(Comm.dll)取走。如果有错误发生时,也会努力恢复。
(3)状态线程。这个线程监视PL-2301的状态信号。如果发现有任何状态改变,它将给相关线程发消息或调用回调函数通知上层软件。
Transfer.dll提供几个供上层软件(Comm.dll)调用的输出函数:
·USB_InitService()调用Transfer.dll里的其他输出函数之间必须先调用这个函数。
·USB_OpenConnect()调用此函数获得PL-2301的句柄。发送和接收数据时要用到这个句柄。
·USB_WriteConnect()调用此函数向对方主机发送指定的数据。
·USB_ReadConnect()调用此函数从接收FIFO缓冲器中读取数据。
关键词:单片机系统高速数据通信EPP
前言
单片机系统中常常需要具备与PC机通信的功能,便于将单片机中的数据传送到PC机中用于统计分析处理;有时又需要将PC机中的数据装入单片机系统中,对单片机程序进行验证和调试。目前常用的通信方式是串行通信,但传输速率太低,以9600bps计算,传输1MB至少需要10min(分钟)以上。并行通信克服了串行通信传输速率低的缺点。标准并行口SPP(StandardParallelPort)方式实现了由PC机向外设的单向传输,但实现PC机接收外设发送的数据则非常麻烦;而增强型并行口EPP(EnhancedParallelPort)协议却很好地解决了这一问题,能够实现稳定的高速数据通信。
一、EPP接口协议介绍
EPP协议最初是由Intel、Xircom、Zenith三家公司联合提出的,于1994年在IEEE1284标准中。EPP协议有两个标准:EPP1.7和EPP1.9。与传统并行口Centronics标准利用软件实现握手不同,EPP接口协议通过硬件自动握手,能达到500KB/s~2MB/s的通信速率。
1.EPP引脚定义
EPP引脚定义如表1所列。
表1EPP接口引脚定义
引脚号SPP信号EPP信号方向说明
1StrobenWrite输出指示主机是向外设写(低电平)还是从外设读(高电平)
2~9Data0~7Data07输入/输出双向数据总线
10AckInterrupt输入下降沿向主机申请中断
11BusynWait输入低电平表示外设准备好传输数据,高电平表示数传输完成
12PaperOut/EndSpare输入空余线
13SelectSpare输入空余线
14AutofdnDStrb输出数据选通信号,低电平有效
15Error/FaultnDStrb输入空余线
16InitializeSpare输出初始化信号,低电平有效
17SelectedPrinternAStrb输出地址数据选通信号,低电平有效
18~25GroundGroundGND地线
2.EPP接口时序
EPP利用硬件自动握手实现主机与外设之间的高速双向数据传输,软件只须对相应端口寄存器进行读/写操作。
(1)EPP写操作时序如图1所示。
CPU实现向外设写数据的操作步骤如下:
①程序对EPP数据寄存器执行写操作;
②nWrite置低;
③CPU将有效数据送到数据总线上;
④nDStrb(nAStrb)变低(只要nWait为低);
⑤主机等待nWait变高,确认数据发送成功;
⑥主机等待nWait变高,确认数据发送成功;
⑦EPP写周期结束。
(2)EPP读操作时序如图2所示。
CPU实现从外设读数据的操作步骤如下:
①程序对相应EPP端口寄存器执行读操作;
②nDStrb(nAStrb)置低(如果nWait为低);
③主机等待nWait为高,确认数据发送成功;
④主机从并行口引脚读取数据;
⑤nDStrb(nAStrb)置高;
⑥EPP读操作周期结束。
3.EPP端口寄存器
EPP接口除了保留SPP的3个端口寄存器以外,还新增了5个端口寄存器,如表2所列。
表2
地址端口名称方向
基地址+0SPP数据端口写
基地址+1EPP状态端口读
基地址+2EPP控制端口写
基地址+3EPP地址端口读/写
基地址+4EPP地址端口读/写
基地址+5EPP数据端口读/写
基地口+6未定义(32位传输)读/写
基地址+7未定义(32位传输)读/写
EPP状态端口寄存器
WAITINTRUSER1USER2USER3××TMOUT
WAIT:Wait状态位(1有效);
INTR:中断请求状态位(1有效);
USER1~USER3:用户自定义;
TMOUT:保留(EPP1.7)超时标志位(EPP1.9)。
EPP控制端口寄存器。
××DIRIRQENASTRBINITDSTRBWRITE
DIR:方向位(1输入,0输出);
IRQEN:中断使能位(1有效);
ASTRB:地址选通位(0有效);
INIT:初始化(1有效);
DSTRB:数据选通位(0有效);
WRITE:读/写状态位(0:写,1:读)。
读取接口状态和控制接口都只须对相应的端口寄存器进行操作。以初始化为例:
读操作初始化:outportb(port+2,0x24);
//port为SPP数据端口地址
写操作初始化:outportb(port+2,0x04);
//port+2为EPP控制端口地址
4.EPP1.7和EPP1.9
EPP接口最先有EPP1.7标准定义,由于硬件厂商的原因,EPP现有两个标准:EPP1.7和EPP1.9,可以在BIOS/设备/并行口(BIOS/PeripheralSetup/ParallelPortMode)方式中进行设置。两者有如下不同点:
(1)EPP状态端口寄存器的最低位bit0,在EPP1.9中定义为TMOUT。在EPP操作时序中,如果PC机数据(地址)选通信号变低后,且在10μs时间内,外设未能将nWait置为低,则TMOUT置为1,表示延时。
(2)EPP1.9标准中,只有当nWait为低时,才能开始一个操作周期;但在EPP1.7中,无论nWait状态如何,nAstrb(nDstrb)都会被置低,从而开始一个新的数据(地址)操作周期。
二、EPP接口传输数据的一个实例
在某单片机系统中,须要将单片机系统中数据存储器的大量数据传输到PC机中进行分析处理。EPP接口(采用EPP1.7标准)硬件电路及软件流程图如图3~图5所示。
GAL译码电路方程式为/O1=/I1*/I2*/I3*I4*/I5,EPP接口选通地址为2000H。当单片机执行如下指令:
MOVDPTR,#2000H
MOVX@DPTR,A
就将寄存器A中的数据锁存到数据总线上,便于PC机利用EPP接口进行读操作。
C语言例程:
#defineSPPDATA0x0378//定义各寄存器地址
#defineSPPSTAT0x0379
#defineSPPCNTL0x037A
#defineEPPADDR0x037B
#defineEPPDATA0x037C
#include<stdio.h>
FILE*fp;
Intdata;
Longi;
intk;
fp=fopen(filename,"wb");//打开要存储数据的文件
outportb(SPPCNTL,0x24);
//向控制端口发00100100代码,初始化为读操作模式for(i=0;i<524288;i++)
{
while(!((inportb(SPPSTAT))&0x80))
//查询是否发送完毕
{}
data=inportb(EPPDATA);//读数据
fputc(data,fp);//将数据存入文件
}
fclose(fp);//关闭文件
单片机汇编语言程序为:
FLAG1BITP1.7;标志位
FLAG2BITP3.4
STADDEQU0000H;要传输数据段的起始地址
NUMEQUFFFFH;要传输数据端的字节个数
COMMUN:MOVDPTR,#STADD
COMM1:MOVXA,@DPTR
PUSHDPH
PUSHDPL
MOVDPTR,#EPP_CE
MOVX@DPTR,A
POPDPL
POPDPH
SETBFLAG1;将P1.7置高
CLRFLAG2;将P3.4置低
JBFLAG1,$;查询P1.7为低,即nDStrb为低,表示PC读操作已完成
SETBFLAG2;将P3.4置高
SETBFLAG1;将P1.7置高
INCDPTR
CJNENUM,COMM1;循环NUM次
RET
实际应用该接口电路,能实现1MB/s的传输速率,并且性能稳定可靠。
如果应用EPP1.9标准,硬件电路不用变动,软件中可以省略对nWait进行判断的环节,速率能接近2MB/s。