>
首页 » 技术文章 » 机载电子盘设计

机载电子盘设计

作者:姜运生,范秀峰,周宇辰,乔卫华  时间:2007-02-10 14:44  来源:

摘要:本文介绍了机载电子盘的硬件设计、调试和软件测试方法。该系统满足了机载航空图数据处理量大、吞吐率高、环境恶劣的环境要求,在嵌入式电子盘设计中具有典型性和实用性。内容充实,信息量大,工程实践性强。

关键词:电子盘;与非阵列;IDE接口;写保护

中美撞机,勇士入海,“浪花与泪花齐飞,海水共长天黯色”。从此,制造新一代功能强大的、能及时搜索、导航和定位的营救机,成为国人注目的大事。这不仅需要功能强大的搜索雷达,同时需要功能强大的处理定位计算机。采用电子航空图和多普勒雷达、GPS及惯导组成综合导航系统就是增强营救机功能的重要举措。在航空图上能够对导航参数形象直观、及时准确的换算定位,将飞行员从繁多的、令人头疼的导航仪表和枯燥的需大量记忆的数据中彻底解放出来。但是通常的机载计算机只配有小容量存储器,采用诸如VxWorks等字符操作系统,无法显示和处理全国范围的小比例尺的航空地图。显示和处理大数据量的共同瓶颈在于没有适合机载的硬盘,无法采用图形操作系统和存贮大容量数据。本文介绍我们在解决这一问题的一些做法,与大家切磋。

IDE接口概述

目前硬盘接口以IDE(Intelligent Device Electronics)为主,又称ATA(AT-Attachment)接口。其主要特点是把原来ST-506接口的控制器部分移到驱动器中去,使得主机的IDE适配电路并不包括硬盘控制器,扩大了适应性,亦可连接CD-ROM等设备。IDE接口一般采用40线转插,信号名称和位置可参考图4的电路,它是16-Bit总线。表1是接口内部寄存器分配。

表1 IDE接口内部寄存器映象

/CS3FX

/CS1FX

A2 A1 A0

寄 存 器

读操作 (/IOR=0, /IOW=1)

写操作 (/IOR=1, /IOW=0)

1

0

0 0 0

数据 (读)

数据 (写)

1

0

0 0 1

错误 (Error)

特征 (Feature)

1

0

0 1 0

扇区数 (Sector Count)

扇区数 (Sector Count)

1

0

0 1 1

扇区号 (Sector Number)

(LBA7-0)

扇区号 (Sector Number)

(LBA7-0)

1

0

1 0 0

柱面低(Cylinder Low)

(LBA15-8)

柱面低(Cylinder Low)

(LBA15-8)

1

0

1 0 1

柱面高(Cylinder Hight)

(LBA23-16)

柱面高(Cylinder Hight)

(LBA23-16)

1

0

1 1 0

驱动器/磁头 (Drive/Head)

驱动器/磁头 (Drive/Head)

1

0

1 1 1

状态 (Status)

命令 (Command)

0

1

1 1 0

后备状态 (Alternate Status)

设备控制 (Device Control)

0

1

1 1 1

驱动地址 (Drive Address)

保留 (Reserved)

PC机中IDE接口作为I/O外设处理,一般有2个IDE接口。主要片选信号线/CS1FX、/CS3FX对应的译码地址如表2所示,表中同时给出了IRQ资源占用。/CS1FX有效(低电平)时选择命令寄存器,/CS3FX有效时选择控制寄存器。IDE接口对硬盘有两种操作方式。一是物理寻址(CHS-Cylinder/Head/Sector)模式,即主机应该具体给出要读写的柱面/磁头/扇区,另一是逻辑块寻址(LBA-Logical Block Address)模式。在LBA模式下,将所有扇区按照柱面优先的原则编号,组成线性扇区地址。由IDE控制器把逻辑扇区号译码为对应的CHS后再操作。一个逻辑块容量等同一个物理扇区,亦即512字节。在机械式磁盘结构时,LBA模式可使连续扇区操作节省磁头移动定位时间。软件采用LBA模式操作,可以简化管理算法。

表2 IDE接口I/O地址范围及资源分配

/CS1FX

/CS3FX

中断请求

DMA请求

第一IDE接口

1F0H—1F7H

3F0H—3F7H

IRQ14

DRQ3

第二IDE接口

170H—177H

370H—377H

IRQ15

DRQ4

IDE控制器SST55LD017

实现IDE接口的办法有多种,世界著名的电子盘生产商BiTMCRO生产的电子盘内嵌入了PowerPC 403来组成控制器,这种办法需要为PowerPC写一些软件,速度较慢。SST公司最近推出的SST55LD017是比较理想的Flash盘的IDE接口控制器,图1是它的功能框图。电路简单、速度快、可靠性高是专用IDE控制器的优点。

从图中可以看出,它里面包含了一个微控制器和嵌入的Flash文件管理系统。控制器和主机的接口允许数据写入Flash介质以及从Flash介质读出。MCU负责把IDE命令转换成Flash介质操作所需的数据和控制信号。SRAM缓冲极大地优化了主机和Flash介质之间的数据传输。内部DMA直接把缓冲数据传输到Flash介质,越过MCU,提高数据吞吐率。嵌入式Flash文件系统为基于文件的操作系统提供了方便。多任务接口可以对多个Flash介质器件进行读、编程和擦除操作。SCI接口用于重新进行芯片初始化过程和配置ID号,为硬件调试提供方便。对于具体的管脚定义可以参考后面图5的逻辑电路。

三 与非阵列Flash存储介质

机载硬盘不能使用通常的机械式磁头和磁介质,必须用E2PROM来存储。电子盘只要满足IDE接口格式,读写操作对操作系统是透明的。东芝的TH58100是128M x 8Bit的E2PROM,比较适合做电子盘的存储介质,图2是它的功能框图。

TH58100使用+3.3V电压,其与非阵列安排为 528字节 x 32 页 x 8192块。它里面有一个528字节的静态寄存器,允许编程数据和读出数据在寄存器和存储阵列之间以528字节为单位传输。IO1—IO8管脚既是地址线,又是双向数据线,同时承担命令输入。发出命令后,擦除操作和编程(写入)自动进行。具体管脚可参考图5的电路。

四 电子盘设计

“手中有粮,心里不慌”。掌握了IDE控制器和Flash介质,设计电子盘就很容易。设计时要考虑机载的电磁环境比较恶劣、机械振动要求较高这一特点。下面从三个方面介绍设计的主要部分。

4.1 电源与复位

Flash介质只使用+3.3V电源,而IDE控制器同时使用+5V和+3.3V,但PC机及扩展的EIDE接口都仅使用+5V电源。为了和PC兼容,电源一方面来自机载系统,另一方面仍可从PC标准电源传入,VCC = +5V。如图3所示,XS就是PC电源标准接口。使用DC/DC电压转换器,将+5V电压转换为+3.3V,满足IDE控制器和Flash介质需要。机载环境下外供电源极不稳定,经常有长达20ms的瞬间掉电。为保证上电/掉电时可靠复位,不要采用普通的RC复位电路,图中使用MAX703实现可靠复位。上电复位信号/POR接图5的D1.24管脚,使上电和下电瞬间,IDE处于确定的复位状态,拒绝接收主机的误操作命令,避免对Flash介质进行误操作。D2.6腿是手工复位输入信号/RSTHD,允许调试过程随时复位。图3中的WP_PD# 信号接至图5的D1.62管脚,是写保护跳线。

4.2 IDE接口设计

在设计时,既在逻辑上实现了IDE接口,将有关信号嵌入系统总线,又在物理上直接使用了标准的IDE-40芯插座,可以直接连接到PC机硬盘连线,方便软件开发。其设计如图4所示。为保证上电时DMA请求DRQ处于低电平,避免主机错误响应,应该使用5.6K电阻下拉。同样,IORDY使用1K电阻上拉。S2跳线用来进行主盘(Master)和从盘(Slave)设置,断开时将IDE接口设置为从盘,短接时设置为主盘。在复杂电磁环境下,还应该给DRQ串联33Ω的端电阻,给IORDY串联82Ω的端电阻。根据ATA-4规范,应该给数据线HD7下拉10K电阻,使主机能够迅速识别是否安装硬盘。这些措施在图4中并没有体现出来,在工程实践时要特别注意是否采用。

4.3 控制器设计

控制器主设计如图5所示。LD017控制器一边负责IDE接口,一边负责对TH58100存储介质进行读写操作。上电复位信号/POR来自图3的MAX703输出,普通复位/HDRST来自主机IDE接口,同时允许软件复位。主从选择线CSEL在芯片内部已上拉,悬空时做从盘(Slave),接地时做主盘(Master)。当主从盘同时存在时,要将主从盘的诊断信号/PDIAG连在一起。

控制器和存储介质之间有/FCE0--/FCE4五根片选线,可以组成5 x 128MB容量的电子盘。地址、数据和命令复用线FAD7—FAD0,操作时由FALE和FCLE锁存信号区分。其中FALE是地址锁存使能,FCLE是命令锁存使能。图5中的SCI接口(S2)只是示意性质,具体可参考图7电路。

当控制器对存储介质读写时,由操作准备好信号FRDY应答。当该信号为低时表示忙。这个信号是集电极开路(OC)结构,必须有上拉电阻。其阻值可根据信号上升时间Tr和下降时间Tf的要求调整。无论连接几片TH58100,只能有一个统一的上拉电阻,以防止过大的灌电流。

双重写保护设计

机载环境下,电子盘文件系统经常遭受破坏,抗干扰和写保护设计是非常重要的。图3中的S1跳线开路时,写保护信号WP_PD# 处于高电平,经过软件设置可使LD017控制器处于写保护状态。不再执行主机发送的任何破坏性命令,诸如格式化、写缓冲、写扇区、验证式写等命令。当需要装入程序或合法记录飞行状态时,将S1短接并用软件开锁。这是第一重写保护。第二重保护应该设计在LD017控制器和存储介质之间。在图5的D2.19管脚,即TH58100的写保护用10K的电阻下拉,确保上电/掉电瞬间LD017在未知状态时的误操作不被执行。这一措施在图5中并没有体现出来。

动态写保护设计

在图3的写保护电路中,S1采用手工跳线进行写保护。在运行时只能一直保持在某种状态,例如在写保护模式下,应用程序无法写入。若要写入,必须断电重新跳线。

6是一种动态写保护改进设计。WP_PD#写保护信号由应用程序控制,根据需要将电子盘设置在可读写模式或只读(写保护)。图中使用GAL16V8实现这种功能,地址和IO读写信号都来自EISA总线,其逻辑核心编程用ABEL描述如下:

… …

EQUATIONS

CS_WP = (!IOW # !IOR) & (SAddr == OurAddr);

Q.clk = WrCLK;

Q.OE = !OE;

Q.CLR = !HDRST # !POR; // 复位.

FBQ = !Q.FB; // 反相输出.

State_Diagram [Q];

State S0 : // 写保护状态.

if (!IOW) then S1;

State S1 : // 可读写状态.

if (!IOR) then S0;

end WrProtect

6中,当WP_PD# 和Q连接时,上电复位时Q=L,处于写保护模式。应用程序在写盘(文件)时可以这样编写

outp(WrCtrlReg,AByte); // 写该端口,退出写保护模式。

… … // 写盘(文件)操作.

Inp(WrCtrlReg); // 读该端口,恢复写保护模式。

WP_PD# 和 //Q连接时,上电复位时 /Q=H,处于可读写模式。应用程序在写盘(文件)时和接Q端刚好相反,亦即写端口进入写保护模式,读端口退出写保护模式。

五 调试方法调试软件

“三分设计,七分调试”。硬件设计过程就应考虑调试的方便性。LD017有一个串行通讯接口,可以监控硬件。可以扩展利用。

5.1 SCI调试接口设计

通过SCI接口可以得知出错类型信息,更新ID号,改变CHS和PIO模式等,非常有利于调试。其扩展电路具体方法如图7所示。

LD017提供的SCI接口遵从RS232通讯协议,但它是TTL电平。使用MAX232进行电平转换,就可以和PC机的串口连接,进行通讯检测和调试。调试时要将图中S2短接,即接地,使能SCI接口功能。PC串口初始化时配置固定为:

波特率9600BPS Odd Parity(奇校验) 和 1 Stop bit(停止位)。

5.2 调试软件

调试软件除PC机串口和SCI通讯有关命令外,主要集中在IDE接口命令操作。下面是基于OOP技术,采用Delphi语言,为电子盘创建的类(Class)的描述。这个TEDisk类提供可设置的属性(Property)和操作方法(Method),供硬件调试时灵活调用。当循环调用某一方法时,可重复产生特定信号波形,用示波器捕获分析。

const

// IDE 接口命令集.

ChkPwr_CMD = $E5; // or 98H,Check-Power 检查电源模式.

Diagnst_CMD = $90; // Execute-Drive-Diagnostic:驱动器诊断.

… …

ReadSctr_CMD = $20; // or 21H,Read-Sector(s): 读扇区

WriteSctr_CMD = $30; // or 21H,Read-Sector(s): 读扇区

type

TIDEPort = ( idePrimary, ideSecondary);

TDrive = ( drvMaster, drvSlave);

TAdrMode = ( amLBA, amCHS);

// 以下为TEDisk组件(类)正式定义的框架。

TEDisk = class(TComponent)

private

FIDEPort : TIDEPort; // IDE 端口号

FDrive : TDrive; // 主从盘.

FAdrMode : TAdrMode; // 寻址模式.

… …

// CS1FX 信号有效时的寄存器

FDataReg : Word; // 读写,数据寄存器

… …

FCommandReg : Word; // 只写,命令寄存器

// CS3FX 信号有效时的3个寄存器

FAltSReg : Word; // 只读,预备的状态寄存器

FDevCtrlReg : Word; // 只写,设备控制寄存器

FDevAddrReg : Word;

… …

function WaitNotBusy:boolean;

function WaitDRQ:boolean;

public // 公用方法

constructor Create( AOwner: TComponent ); override;

procedure ChkPwrMode; // 检查电源模式.

function Diagnostic(Var Diag:byte):boolean; // 电子盘诊断.

… …

function WriteSctr(SctrNo:DWord;Buf:array of Word):boolean; // 写扇区

function ReadSctr(SctrNo: DWord;var Buf: array of Word): boolean; // 读扇区

… …

published

property IDEPort: TIDEPort read FIDEPort write SetIDEPort default ideSecondary;

property Drive: TDrive read FDrive write SetDrive default drvMaster;

property AdrMode: TAdrMode read FAdrMode write SetAdrMode default amLBA;

… …

end;

implementation

… …

在具体实现时,我们只示意性说明组件二个比较主要的方法,即写扇区和读扇区。其源代码如下:

//-----------------------------------------------------------------------------------------------

// function WriteSctr(SctrNo:DWord;Buf:array of Word):boolean;

// 功能:

// 向电子盘接口写一扇区. 假定采用 LBA 逻辑扇区寻址模式.

// 入口参数:

// SctrNo: 写操作起始扇区号,32-Bit.

// Buf: 写扇区数据缓冲,16-Bit.

// 返回结果

// Result = True: 操作完成.

// False: 操作出错.

//------------------------------------------------------------------------------------------------

function TEDisk.WriteSctr(SctrNo: DWord; Buf: array of Word): boolean;

var AByte:byte;

i:integer;

begin

outp(FSectrCntReg,1); // 设置读写扇区数

AByte := SctrNo;

outp(FSectrNoReg,AByte); // 设置起始扇区号,亦即 LBA7-0.

AByte := (SctrNo and $0000FF00) shr 8;

outp(FCylLowReg,AByte); // 设置柱面号(低),亦即 LBA15-8.

AByte := (SctrNo and $00FF0000) shr 16;

outp(FCylLowReg,AByte); // 设置柱面号(高),亦即 LBA23-16.

AByte := (SctrNo and $0F000000) shr 24;

outp(FCylLowReg,FDriveHead or AByte); // 亦即 Drive,LBA27-24.

outp(FCommandReg,WriteSctr_CMD); // 发写扇区命令.

WaitDRQ; // 等待 DRQ,即 IDE 准备接收写数据.

for i := 0 to 255 do

OutpW(FDataReg,Buf[i]); // 写16-Bit数据寄存器,

Result := WaitNotBusy; // 查看操作结果.

end;

//------------------------------------------------------------------

// function ReadSctr(SctrNo:DWord;var Buf:array of Word):boolean;

// 功能:

// 从电子盘接口读一扇区. 假定采用 LBA 逻辑扇区寻址模式.

// 入口参数:

// SctrNo: 读操作起始扇区号,32-Bit.

// 出口参数:

// Buf: 所读扇区数据缓冲,16-Bit.

// 返回结果

// Result = True: 操作完成.

// False: 操作出错.

//-------------------------------------------------------------------

function TStdIDEPort.ReadSctr(SctrNo: DWord;var Buf: array of Word):boolean;

var AByte:byte;

i:integer;

begin

WaitNotBusy; // 等待上次操作结束.

outp(FSectrCntReg,1); // 设置读写扇区数

AByte := SctrNo;

outp(FSectrNoReg,AByte); // 设置起始扇区号,亦即 LBA7-0.

AByte := (SctrNo and $0000FF00) shr 8;

outp(FCylLowReg,AByte); // 设置柱面号(低),亦即 LBA15-8.

AByte := (SctrNo and $00FF0000) shr 16;

outp(FCylLowReg,AByte); // 设置柱面号(高),亦即 LBA23-16.

AByte := (SctrNo and $0F000000) shr 24;

outp(FCylLowReg,FDriveHead or AByte); // 亦即 Drive,LBA27-24.

outp(FCommandReg,ReadSctr_CMD); // 发读扇区命令.

Result := WaitDRQ; // 等待 DRQ,即 IDE 准备接收好数据.

if Result then

for i := 0 to 255 do

Buf[i] := InpW(FDataReg); // 读数据寄存器, 16-Bit.

end;

在上面读写程序中,我们每次只指定了一个扇区数,在实用程序时应该将扇区数作为一个参数传递。代码中使用的Inp、OutP、InpW、OutpW等I/O操作函数是使用嵌入汇编实现的工具性函数,例如 OutpW和InpW的实现过程如下:

procedure OutpW(Port,Value:Word);

asm

MOV DX,Port

MOV AX,Value

OUT DX,AX

end;

function InpW(Port:Word):Word;

asm

MOV DX,Port

IN AX,DX

end;

其它细节不再叙述,对源代码有兴趣的读者,可直接和作者联系。

六 结束语

按照上面原理设计的电子盘已经通过装机试飞,图8是试飞的一个画面。试飞证明,电子盘逻辑设计合理、可靠,通过了机载设备所需的各种严格实验,已经开始投入使用。我们相信,随着第4代飞机性能提高,一定有能力保卫祖国领空和领海的安宁与祥和。“落霞与孤鹜齐飞,秋水共长天一色”的美景永存。

相关推荐

基于FPGA的IDE硬盘接口卡的实现

fpga;actel;ide接口  2007-06-25

机载电子盘设计

在线研讨会
焦点