摘 要本文简要地介绍了航空电子通讯总线ARINC429接口的硬
件设计和软件算法。系统设计中具有典型性和实关键词空电子 差分输出 航空429总线 环形队列
功能相对独立的航空电子系统逐步走向综合,例如将雷达、惯导、GPS和机载计算机联合,组成新型航空图导航系统,各子系统之间的数据通讯变得尤为重要。航空电子系统之间最常的通讯总线是ARINC429和1553B。其中ARINC429广泛使用在波音(Boeing)系列飞机、欧洲空中客车(Airbus)等机种。我国的惯导系统也以ARINC429为主要通讯总线。
ARINC429总线简介
ARINC429规范,又称Mark33数字信息传输系统(DITS---Digital Information Transfer
System),是专为航空电子系统通讯规定的航空工业标准,解决了原来419规范的许多矛盾和冲突。它忽略了不同厂家航电系统接口的复杂性,为系统互联提供了统一平台。根据规范,数字信息通过一对单向、差分耦合、双绞屏蔽线传输,本质属于串行通讯范畴。数据以32-Bit字(Word)格式传送。每个字包含1-Bit校验位,8-Bit标号。标号(Label)定义了飞行数据的功能,即保持被传输数据的所属类型,例如属于精度数据、纬度数据等。其余的数据位或以数字(二进制或BCD编码),或以字母编码,根据Label而区分成不同的域。为了使通讯完全标准化和防止冲突,所有的飞行功能都已经赋予了特定的标号和数据格式。ARINC429数据发送时经过二级差分驱动,如图1波形所示。前级V+、V-是TTL电平,即逻辑1为5V,逻辑0为0V的正逻辑。经过驱动的第二级输出V+、V-电平和参考电压VRef有关。而差分运算结果是参考电压的2倍。图1表示ARINC429逻辑"1"、"Null"空数据和逻辑"0"在差分双绞线上电平定义。在连续传送数据时,每个32-Bit字之间至少插入4个空(Null)状态进行隔离,亦即字间隙。字内格式定义如表1所示。注意,其位号从1开始,不是通常的从0开始。
HS3282芯片和ARINC429收发设计
目前ARINC429收发器以HARRIS公司的HS3282和HS3182最为著名,分别和Device Engineering公司的DEI1016及BD429完全兼容。HS3282是高性能的CMOS型429接口,亦能满足类似的时分多路串行数据通讯。图2是其结构框图,
整个芯片只需单5V工作电源。它具有二路接收、一路发送。接收器和发送器相互独立,同时工作。双通道接收器之间也是独立的并行接收,可以直接连接到ARINC429总线,而不需电平转换。数据字长可以是标准的32-Bit或25-Bit,接收数据时进行校验,而发送数据时产生校验。内部定时器可自动调整字间隙(Word
Gap)。其发送缓冲是一个8 32Bit的FIFO。
HS3282和CPU接口比较简单,发送时经常和HS3182配合。HS3182是满足ARINC429规范的、双极数据输入的线驱动器。这里不再详细介绍这两个芯片的管脚分配,如需要可以参考图3。图3是ARINC429总线收发的经典电路。复位是低电平有效,外部工作时钟为1MHz。具有二路接收,即第一路接收(Rx429A+,Rx429A-)和第二路接收(Rx429B+,Rx429B-),具有一路发送,即(Tx429+,Tx429-)。发送时,HS3282为前级输出,HS3182为正式差分输出。C2、C3为68pF的电容,这两个电容至关重要,最好采用高精度军品电容。一般作为CPU外围I/O设备的接口芯片,都有片选、读、写信号和选择片内寄存器的若干地址线。但HS3282有点特殊,每一个寄存器操作信号都需要对CPU信号进行译码产生。图4是对HS3282控制逻辑示意图。选择CPU时最好直接选择外部数据总线为16-Bit以上的,如MC80186、F240等。如果非要用8-Bit的CPU,则需要2个8-Bit的锁存器,一次将16-Bit先读写到锁存器中,然后分别对2个锁存器读写,硬件和软件都比较麻烦。控制逻辑以CPU提供的I/O操作信号/IS和读写信号/RD、/WR以及地址A2A1为输入,为HS3282产生操作信号,诸如读第一路接收数据寄存器信号/RD429A,第二路/RD429B,发送低字选通信号/WR429LW,高字/WR429HW,发送使能控制TX429EN等。控制逻辑和CPU同时监视HS3282的3个状态信号,第一路接收准备好信号/Rx1RDY,第二路/Rx2RDY,发送准备好/Tx429RDY。这些状态信号一方面可供软件查询,另一方面由控制逻辑产生/INT中断请求。
在图4和下面的逻辑描述中都没有体现为CPU提供READY信号的要求。一般情况下,作为I/O外设的HS3282读写速度要比CPU慢,应该用一个状态机进行速度匹配,为CPU产生READY信号。表2是对图4控制逻辑电路地址的一种分配方法,并不是唯一的。在发送使能信号TX429EN控制中,简单地把发送准备好信号
/TX429RDY反相后输出。亦即只要HS3282发送器有空闲,就允许发送。HS3282的发送器包括一个FIFO,可以存储8个32-Bit的429数据字。在要求爆发式(Burst)发送时,可以把发送使能TX429EN直接由CPU控制。一般处于禁止状态,当CPU填充HS3282的发送FIFO字数达到自定数目(如8个)时,再使能发送,使FIFO中数据倾泻而出。
实现逻辑如下:
IS,RD,WR pin;//CPU方的I/O操作、读写信号,皆为低有效.
IOAddr = [A2,A1,X];//CPU 方 I/O 地址
… …
ENTX429A=!TX429ARDY;//ARINC429 发送使能.
//读第一路ARCIN429 接收寄存器 高低字.
!RD429A = !IS & !RD &
((IOAddr == RX429ALW) # (IOAddr == RX429AHW));
//读第二路ARCIN429 接收寄存器 高低字.
!RD429B = !IS & !RD &
((IOAddr == RX429BLW) # (IOAddr == RX429BHW));
//写 第一路ARCIN429发送寄存器 高低字.
!WR429AL = !IS & !WR & (IOAddr == TX429ALW);
!WR429AH = !IS & !WR & (IOAddr == TX429AHW);
//写 第一片 HS3282 控制寄存器.
!WR429ACW= !IS & !WR & (IOAddr == CR429A);
!INT = !RX1RDY # !RX2RDY;//2路接收准备好,共享中断请求.
… …
软件设计
上电复位后,软件应在正式工作前初始化HS3282,即向控制器写控制字。初始化时可以设置字长为32-Bit或25-Bit。外部提供的工作时钟为1MHz,内部接收和发送速率可以设置为十分之一或八十分之一,即100Kbps或12.5Kbps。也可以设置为自测试模式,即HS3282的发送直接在内部环接到第一路接收,反相接到第二路。发送数据,然后比较发送和接收,判断HS3282工作状况。自测试原理可以参考图1的框图。在此主要介绍正式工作时软件的一些功能算法。
1、原始数据收发
在图3和图4的硬件设计中已经考虑到软件设计的方便性。软件收发既可以采用查询HS3282的状态位进行,也可以采用中断驱动。原始数据的收发是整个系统的瓶颈,一般实用程序都采用中断接收,查询式发送。其中断响应作为核心部分,一般都使用对应嵌入式CPU的汇编语言实现。为清楚起见,采用算法语言描述。中断接收数据首先存放到缓冲区,亦即环形队列中,再由主程序读取,其结构与算法如表3:
// 环形队列缓冲区初始化
procedure InitBuf;
begin
Disable Interrupt;// 禁止中断
RxNum:= 0;// 接收数目清0
WrPtr:= StartAddr; //写指针指向开始地址
RdPtr:= StartAddr; // 读指针指向开始地址
Enable Interrupt; // 使能中断
end;
//ARINC429环形队列中断接收算法.
procedure Rx429Interrupt
begin
Save Register;// 保护现场
DataBuf[W t(WrPtr);//写指针加1,后移.
DataBuf[WrPtr]:=InpW(Rx429AHW);//读HS3282高16- Bit字
Increament(WrPtr);//写指针加1,后移.
Disable Interrupt;// 禁止更高级中断.
Increament(RxNum);//修改接收字数,即加1.
Enable Interrupt;// 开放中断
if (WrPtr ≥ EndAddr) then/ 若写指针到达队尾,环绕之
WrPtr := StartAddr;
Restore Register;// 恢复现场
end;
// 环形队列读取算法.
function Rd429Buf(var LW429,HW429:word):boolean;
begin
Result := False;
if(Rx Num = 0) then exit;//如果没有接收数据,则退出
Result := True;//所读数据有效
LW 429 := DataBuf[RdPtr];//读队列429低16-Bit字
Increament(RdPtr);//读指针加1,后移.
HW429 := DataBuf[RdPtr];//读队列429高16-Bit字
Increament(RdPtr);//读指针加1,后移.
Disable Interrupt;//禁止中断.
Decreament(RxNum);//修改接收字数,即减1.
Enable Interrupt; //开放中断
if(RdPtr≥ EndAddr) then//若读指针到达队尾,环绕之
RdPtr := StartAddr;
end;
环形队列初始化应该在系统开放中断前调用,接收算法本身就是中断响应,而读取算法在主程序中数据处理时调用。环形队列缓冲区大小应该和主程序处理速度取得平衡,太大则浪费空间,太小则容易溢出,造成混乱。
2、多路接收中断共享算法
当2路以上接收共享一个中断时,容易出现覆盖现象,丢掉某一路数据,或使边沿触发的中断失效,不再接收任何数据。这种错误非常隐蔽,如图5波形。当在A点第一路准备号/Rx1RDY
= L,/XINT有效,引起中断,CPU进入中断处理响应,在AB之间已经判定为第一路有效并开始处理。处理到B点时,第二路接收准备好亦引起中断。但/XINT已经有效,不会引起电平变化。中断响应程序继续进行,在C点退出,没有处理第二路接收。如果中断请求是电平
(Level) 敏感,中断处理退出后还可以再次进入。但有相当的系统开销。若中断请求是边沿(edge)触发,在C点退出之后,因未处理第二路接收使中断请求
/INT一直保持电平有效,但不能产生边沿跳变翻转,中断触发条件永远不能满足,系统死锁。各路数据将无一幸免的丢失。
有人解决这个问题时采用"独占中断"办法,将每一路接收准备好只对应到一条硬件中断请求上。嵌入式CPU能提供给外部的硬件中断都比较少,系统外围设备较少时尚能对付,I/O外设和接收通道变多时就束手无策。实质性解决办法需要"软硬兼施"。如前图4所示,将HS3282的
/Rx1RDY,/Rx2RDY等状态信号同时送达CPU,组成只读"状态寄存器",供CPU中断响应时查询。对中断处理方法如下:
//多路共享中断处理程序算法
procedure RxShareIRQ
begin
Save Register;//保护现场
while Data(/INT = L) do//中断请求信号电平有效
begin
Read SR;//读状态寄存器
Treat Receive//根据状态,处理对应接收通道。
end;
Restore Register;//恢复现场
end;
这个方法已经运用在多个不同种类的系统,证明是非常有效的。有人质疑在中断响应中使用循环是否合适,甚至认为在速度快、路数多的情况下CPU可能全消耗在中断循环中,仍然要丢数据。其实,路数越多,这种办法越有效。它进入中断次数少,系统开销就少,对多路爆发式数据接收响应快。至于丢数据则更不可能,CPU一般都比外设处理速度快得多。
3、ARINC429字与HS3282数据转换
ARINC429的32-Bit逻辑字和HS3282数据线上2个16-Bit的物理字并不完全等同,在数据接收后的处理和发送前需要软件进行适当的转换。目前我国在SZ-01规范中规定数字信息传输系统采用HB6096标准,和上面规定差不多,只是把SDI、LSB、MSB统一规定到数据域,定义如表4:
在和上层软件交换数据时,应以ARINC429字格式进行,而在控制HS3282收发时应以2个16-Bit物理字为单位。底层软件要进行互逆转换。总的转换方法如图6所示。注意,两者的标号逐位逆序对应,即D7
→D0等。以下是标号转换算法。
//-----------------------------------------------------
//function TransLabel(value:byte):byte;
//功能: ARINC429数据标号互换
//入口参数:
//value: 原标号值
// Result = 逐位转换后的新标号
//---------------------------------------------------
function TransLabel(value:byte):byte;
begin
Result := 0;
if ((value and $01) then Result := Result or $80;//交换D0 ←→D7
if ((value and $02) then Result := Result or $40;//交换D1 ←→D6
if ((Label and $04) then Result := Result or $20;//交换D2 ←→D5
if ((value and $08) then Result := Result or $10;//交换D3 ←→D4
if ((value and $10) then Result := Result or $08;//交换D4 ←→D3
if ((value and $20) then Result := Result or $04;//交换D5 ←→D2
if ((value and $40) then Result := Result or $02;//交换D6 ←→D1
if ((value and $80) then Result := Result or $01;//交换D7 ←→D0
end;
至于32-Bit的ARINC429数据和2个16-Bit的HS3282物理字的相互转换,可以参考上面标号互换方法,不再给出。
结束语
HS-3282是为ARINC429度身定做的,而且设计针对现今飞机技术最苛刻的要求,所以使用HS-3282来设计ARINC429总线既简单、有效,又严格保证其可靠性。我们已将上述设计应用在多个不同种类的航空电子系统中,证明是十分有效的。随着航空电子系统之间的通讯标准向ARINC429总线靠拢,HS3282的应用将更加广泛。
|