学海荡舟手机网

主页 > 实用文摘 > 教育文摘_22 > > 详细内容

TMS320F240的IDE接口仿真器设计_DSP论文

摘要:介绍以tms320f240为核心,设计ide接口仿零点器的硬件和软件设计方法。突出特点是硬件设计简练实用,监控软件精巧灵活。在设计嵌入式系统调试工具中具有典型性和实用性,对其它系统的调试也借鉴作用。

    关键词:仿真器 监控程序 硬件调试 ide接口

随着航空电子系统数字化的发展,机载嵌入式计算机逐步摆脱了“纯粹嵌入”时代,开始以主要控制角色而显露头脚。其存储系统也和地面计算机系统一样,提出了“海量存储”的要求。借鉴和使用ide接品时一条重要途径。但在调试时一般缺乏ide接口主方(host)控制器。pc机虽然带有两个标准的集成在主板上的ide接口,但在目前的widows系统下却是透明的,无法在硬件调试级进行控制驱动。“工欲善其事,必先利其器”。为解决调试工具,笔者在此前自己动手,设计了一个ide接口仿真器。硬件极其简练实用,软件精巧灵活。介绍出来,与大家切磋。

1 仿真器硬件设计

众所周知,ide/ata接口是16位总线,映像在主机的i/o空间,由主机对接口内的2组寄存器操作来完成“海量存储”。这些寄存器仅由2根片选(cs1fx、cs3fx)和3根地址线(a2、a1、a0)寻址。仿真器硬件只要能在监控程序的控制下产生对应控制信号,便能真实地仿真ide调试所需的环境。需要仿真处理的主要信号如表1所列。信号方向以仿真器为参照,输出(output)方向由仿真器驱动,输入(input)信号由ide设备驱动。

表1 主要仿真处理的信号

信号名方  向有效电平功    能
hdrsto(输出)l(低)复位ide设备
cs1fxo(输出)l(低)第一组寄存器片选
cs3fxo(输出)l(低)第二组寄存器片选
a2~a0o(输出)组合值接口内寄存器偏移地址
ioro(输出)l(低)寄存器读信号
iowo(输出)l(低)寄存器写信号
d15d0i/o(双向)组合值数据总线,写时由仿真器驱动,读时由ide设备驱动
drqi(输入)h(高)dma请求
irqi(输入)h(高)中断请求

ide接口的读写时序和一般cpu外设时序波形相似,其读取周期为70ns,具体波形不再给出。使用ti公司的tms320f240(以下简称f240)可以方便地仿真出ide的时序波形。只要使用外部ready信号,把i/o周期延长到70ns以上,就可以保证仿真数据读写可靠。以f240为核心,仿真器硬件设计真数据读写可靠。以f240为核心,仿真器硬件设计就非常简练。其全部硬件电路如图1、图2和图3所示。除去初期调试和驱动芯片外,整个核心就是f240和gal16v8,已经仿真全部的ide时序波形,图1是仿真器自身调试仿真监控程序时电路。使用2片cy7c199,组成32k×16位的片外ram程序存储器空间。当程序调试完成后,断开h1,将监控程序通过jtag口直接烧入f240,就可以拔去2片外部程序存储器cy7c199。

图1 调试时的程序存储器配置

    当仿真监控程序调试完成后,正式定型的仿真核心电路如图2所示。电路设计总的原则是简练实用,所以复位采用普通的rc电路,外加手工复位开关sw保证仿真器自身复位;利用rs232和主机之间通信,减少硬件额外开销;ide接口的中断请求hirq直接接f240的外部中断xint1(因为hirq高电平有效,所以将蓁不用的外部断xint2等接地,保证蓁中断源不产生中断请求,减少软件中断响应多重判断环节);将f240的pb端口设置为输出端口,dma请求hdrq接到pb端口的最低位pb0,可以直接由硬件检测drq状态即可,并不真正需要dma控制器;将f240的pc端口设置为输出端品,最高位pc7为复位ide端口信号,当该位设置为0(低电平)时,产生复位ide设备信号hdrst,该位设置为1时结束复位。其复位时间可由软件控制。ide设备的寄存器映像在f240的i/o空间从0000h开始的16位地址。外部i/o只有ide接口,不必采用全译码,直接由i/o片选is和地址a3区分产生cfifx和cs3fx即可。接口内偏移地址直接由a2~a0提供。f240的写信号wr可以直接作为接口写信号。但是f240的读信号是状态信号,在连续读操作中保持低电平,并无上升沿,所以需要专门产生读信号。pc主机通过串口和仿真器通信,监控仿真器,从而驱动调试的ide设备。仿真器和ide设备通过标准的硬盘电缆连接。为提高信号的抗干扰能力,这些信号经过总线驱动器驱动。图3是驱动和接口电路。

数据通路用16路驱动的idt74ls16245实现,开门信号直接由i/o片选信号is控制,方向端由写信号wr控制。而单向提供给ide设备的其它信号,都经过54f244驱动。所有控制信号由gal16v8实现。以下是其控制逻辑代码,信号名称和功能可参见图2。

图2 核心仿真控制电路

    ……

equations

!hrst=!por#!hrst;//rc上电复位和f240设置复位都产生ide复位

!cs1fx=!is&!a3; //a3=0;产生第一组寄存器片选cs1fx=!is & a3; //a3=1:产生第二组寄存器片选cs3fx

!ior=!is & !rd; //*专门产生寄存器读信号.

[q1,q0].clk=cpuclk;

[q1,q0].oe=!oe;

[q1,q0].ar=!por; //复位

//==============================================

//f240系统控制状态机

//时钟20mhz,每一拍50ns

//程序存储器cy7c199读写周期≤35ns,无需等待

//ide接口寄存器读写周期≥70ns,等待2拍

//===============================================

state_diagram [q1,q0];

state s0: //空闲状态

ready=h; //支持cy7c199访问

if(!is)then //要访问ide接口寄存器

s1 with {ready240=l;}

state s1: //开始等待

ready240=l;

goto s2;

state s2:

ready240=l;

goto s3;

state3: //时间到

ready240=h;

goto s0; //f240对ready信号只采样一次

end

仿真硬件的核心只有1片f240和1片gal16v8。

图3 驱动与接口电路

2 仿真器监控软件设计

软件设计包括驻留f240的监控程序和pc宿主机的监控程序,两者之间通过串口配合工作。这当然降低了ide接口的数据吞吐率,但在逻辑仿真调试时不是主要焦点。为简约起见,避免复杂的词法分析,主从之间采用单字符监控命令。其串口监控命令通信帧定义如下:

012…n-2n-1
帧标志(aah)命令字符(cmd)参数项校验和checksum

其校验和为前n-1个字节代数和的补码,即

checksum=-∑bi(i=0,1…n-1)

下面介绍几个主要命令和程序实现方法,其中寄存器名称和地址可参考图4界面。

(1)1命令:读ide寄存器

当监控程序识别出1命令后,根据参数提供的寄存器索引,映射为对应的i/o地址。f240的输入/输出命令与x86系列不同,它在指令中必须直接给出地址。

lacc reg

bz isdatreg ;0号索引,即读数据寄存器

sub #1

bz iserror ;/*号索引,即读错误类型寄存器

bz isaltreg ;8号索引,即读后备状态寄存器

sub #1

bz isdrvaddrreg ;9号索引,即读驱动器地址寄存器

isdatreg

in value,datreg ;读数据寄存器

ret

isaltreg:

in value,devaddrreg;读驱动器地址寄存器

ret

当i命令执行完毕后,应该将寄存器读入值回送pc主机。

(2)0命令:写ide寄存器

寄存器输出命令参数需要提供寄存器索引和映射为对应的i/o地址。

(3)h命令:硬件复位ide设备

硬件复位时应将f240的iopc7引脚设置为低电平10ms以上。

ldp #00e1h ;dp=00e1h:708h~70ffh的页址

lacl #8000h ;d15=1:iopc7:作输出

d7=0;设置iopc7=0

sacl pcdatdir ;写pc端口,设置hrst信号为低电平

call delay 10ms ;保持复位信号10ms的低电平

lacl #8080h ;d15=1:iopc7:作输出

;d7=1:设置iopc7=1

sacl pcdatdir ;恢复hrst信号为高电平

类似地,监测dma请求hdrq状态时,可以设置端为输入属性,然后读入iopb0。监测中断请求hirq时,可以直接读xint1状态,即读7070h处的xint1cr寄存器。

(4)s命令:软件复位ide设备

软件复位时可以向ide接口的devctrlreg(设备控制寄存器)写入适当值实现。

ldp #0 ;指向.bss变量区

splk=#000eh,value ;d2=sw rst=1:软件强制复位

;d1=/ien=1:禁止ide发中断

out value,devctrlreg ;复位ide设备

call delay 10ms ;保持复位状态10ms

splk #000ah,value ;d2=sw rst=0:结束复位状态

out value,devctrlreg

call delay 10ms

splk #000eh,value ;d6=lba=1:采用逻辑块寻址模式

out value,drvheadreg ;设置驱动器寄存器

(5)c命令:读取ide设备id号和相关配置

ide设备内的相关配置对其它操作影响较大,主机应该掌握这些参数。诸如柱面数、磁头数、每个磁道的扇区数以及最大扇区号等。这段程序稍微复杂一些。

call waitrdy ;读状态寄存器,等待d6=1,亦即ide设备完成上次命令

splk#000eh,value

out value,drvheadreg ;选择主从驱动器

splk #00ech,value

out value,cmdreg ;发命令,读取配置参数

call waitdrq ;读状态寄存器,等待d6=1并且d3=1,亦即rdy并发出drq请求

mar *,ar1 ;ar1:当前辅助寄存器

lar ar1,#bufsaddr ;ar1→扇区缓冲区开始地址

rpt #0ffh ;循环次数=ffh+1=256

in *+,datreg ;读入配置数据

读出配置参数后,再把它送给pc机的监控程序,从中再细分出具体参数。

    类似地,读一个扇区或写一个扇区的命令与这个命令相似。只是在发命令前应该设置柱面扇区等寄存器定位到具体的扇区。

(6)pc宿主机监控程序功能

pc宿主机监控程序主要通过串口监控仿真器。在底层通信中,应该为每一个监控命令建立对应函数。在应用层,可以将几个简单命令有机组合,完成复杂功能,减小仿真器驻留监控难度。例如,在读取配置参数命令中,分解缓冲数据。在读写扇区命令中,将lba逻辑扇区地址分解成驱动器号、扇区号、柱面号等。

重要的是为用户提供一个windows环境下特别容易操作的接口界面,贴近硬件调试,产生所需信号波形,用示波器捕获分析。图4是宿主机的一个界面,具体方法细节不再讨论。

结语

随着航空电子新系统研制的智能化和接口标准化,硬件调试对仿真设备和环境要求也越来越高。鉴于成本和上市时间的限制,采用嵌入式cpu研制一些简单实用的仿真设备,是解决矛盾的一条重要途径。本文所介绍的ide接口仿真器硬件简练、软件精巧,在多个型号的flash disk研制中发挥了重要作用。