摘要:AMD53CF94是AMD公司生产的增强型SCSI-2控制器,它支持Fast SCSI-2控制协议,广泛应用于磁盘驱动器、CD-ROM、DVD、HDD硬盘驱动器、扫描仪和主机适配器等各个领域。文中给出了AMD53CF94的一个具体接口连接电路,并给出了该接口电路SCSI端口初始化、接收PC机数据和向PC机发送数据的软件程序框图及详细的程序清单。
关键词:接口电路 SCSI 控制器 数据传输 AMD53CF94
目前,在计算机及其外设中,SCSI标准接口应用越来越广泛。其范围遍布了从磁盘驱动器、CD-ROM、DVD、HDD(硬盘驱动器)、Scaner(扫描仪)到主机适配器等各个领域。由于其自身所具有优点,近几年SCSI标准及其应用得到了迅速的发展。它允许串接多个外设,传输速度也从SCSI-1的5MB/s发展到Ultra2(Side)的80MB/s。
但在目前阶段,该接口最成熟且最广泛的应用还是SCSI-2标准,SCSI-2标准的传输速率为10MB/s(8bit)和20MB/s(16bit),已能满足大部分外设的数据传输需要。本文介绍一种利用AMD53CF94 SCSI-2控制器来实现与外设进行SCSI-2标准接口的软件、硬件设计方法。
1 硬件设计
AMD53CF94是AMD公司的产品,属于增强型SCSI-2控制器。支持Fast SCSI-2控制协议。其同步模式传输速率可达10Mbytes/s,在异步模式时,其传输速率达5Mbytes/s。它具有24位传输计数器(即最大块传送字节数达16Mbytes),采用3总线设计方案(16位DMA接口、8位CPU接口总线和8位SCSI数据接口)。AMD53CF94控制器直接支持选择、再选择、信息传输和失连命令,同时还带有省电模式(减少功率消耗)。它内含一个可编程抗干扰电路,可以消除宽度达35ns的干扰脉冲,从而极大地提高了系统的可靠性。该芯片采用84脚PLCC封装形式。
AMD53CF94在系统中有多种接法,可以根据具体的应用需求选择最佳的连接方式。CPU对AMD53CF94的控制具有查询和中断两种方式。本文介绍的应用采用中断工作方式。具体的硬件电路如图1所示,图中:命令和信息利用CPU接口进行传输和执行,数据利用DMA通道进行传输,电路中的89C51单片机完全可以满足高速数据传输的要求。
2 软件设计
AMD53CF94的接口软件程序包括SCSI端口初始化、接收PC机数据和向PC机发送数据三部分。
2.1 SCSI端口初始化
图2所示是AMD53CF94接口软件中的SCSI端初始化程序框图。具体的程序清单如下:
;*** SCSI INTERFACE INITIALIZATION SUBROUTINE***
PROC SCSIINI
SCSIINI:MOV A,#02H ;CMDREG(Command Register)为命令寄存器单元
MOV DPTR,#CMDREG;02为Reset Chip命令
MOVX @DPTR,A;复位所有片内功能,返回失连状态,产生硬复位条件
MOV A,#00H ;00为Nop命令
MOVX @DPTR,A ;空操作,释放命令寄存器
MVV A,#01H ;01为Flush FIFO命令
MOVX @DPTR,A ;初始化数据FIFO为空
MOV A,#00H ;STCREGL(Start Transfer Count Register Low)
MOV DPTR,#STCREGL ;清除传输置数寄存器低8位
MOVX @DPTR,A
MOV DPTR,#STCREGM ;STCREGM(Start Transfer Count Register Middle)
MOVX @DPTR,A ;清除传输置数寄存器中间8位
MOV A,#07H ;SDIDREG(SCSI Destination ID Register)
MOV DPTR,#SDIDREG ;指定SCSI设备将要选择的SCSI设备的总线ID编码值
MOVX @DPTR,A ;此处为Target模式,指定Initiator ID为7
MOV DPTR,#STIMREG ;STIMREG(SCSI Timeout Register)
MOV A,#98H ;SCSI超时寄存器单元,SCSI推荐标准值为250ms
MOVX @DPTR,A ;设置SCSI选择或再选超时为250ms
MOV DPTR,#STPREG ;STPREG(Synchronous Transfer Period Register)
MOV A,#04H ;同步传输周期寄存器单元
MOVX @DPTR,A ;设置同步传输周期为100ns,即最大传输速率为10M字节/秒
MOV DPTR,#SOFREG ;SOFREG(Synchronous Offset Register)
MOV A,#00H ;同步偏移寄存器单元
MOVX @DPTR,A ;00表示异步传输
MOV DPTR,#TARGETID;读取Targer ID 跳线设置
MOVX A,@DPTR
ANL A,#07H
ORL A,#10H ;允许53C94报靠复位中断和奇偶错误
MOV DPTR,#CTNLREG1 ;CTLREG1(Control Register One)
MOVX @DPTR,A ;设置控制寄存器1
MOV DPTR,#CLKFREG ;CLKFREG(Clock Factor Register)
MOV A,#00H ;时钟因子寄存器单元,为专门产生内部时序而设置
MOVX @DPTR,A ;此处应用40M外时钟,对应为00H
MOV DPTR,#FTMREG ;FTMREG(Forced Test Mode Register)
MOVX @DPTR,A ;清除测试寄存器单元
MOV DPTR,#CTNLREG2 ;CTLREG2(Control Register Two)
MOV A,#6CH
MOVX @DPTR,A ;设置控制寄存器2
MOV DPTR,#CTLREG3 ;CTLREG3(Control Register Three)
MOV A,#18H
MOVX @DPTR,A ;设置控制寄存器3
MOV DPTR,#CTLREG4 ;CTLREG4(Control Register Four)
MOV A,#20H
MOVX @DPTR,A ;设置控制寄存器4
MOV DPTR,#DALREG ;DALREG(Data Alignment Register)
MOV A,#00H
MOVX @DPTR,A ;清除数据校准寄存器
MOV DPTR,#STCREGH ;STCREGH(Start Transfer Count Register High)
MOVX @DPTR,A ;清除传输置数寄存器高8位
MOV A,#44H ;44H为Enable Selection命令
MOV DPTR,#CMDREG
MOVX @DPTR,A;发送响应总线初始选择命令
SETB EX1 ;开SCSI中断
RET
;************************
2.2 接收PC机数据
图3所示是利用AMD53CF94接口电路接收PC机数据的程序框图。其具体的程序清单如下:
***** SCSI INTERFACE RECEIPT SUBROUTINE******
PROC SCSIRXD
SCSIRXD:
CALL SCSIINI
MOV DPTR,#CMDREG
MOV A,#2AH ;2AH为Receive Data命令
MOVX @DPTR,A ;接收数据后产生中断
RET
;*********************
;***** SCSI RECEIPT INTERRUPT SUBROUTINE*****
RXDINT:
MOV DPTR,#FIFOREG ;接收数据在FIFO中
MOVX A,@DPTR ;读取FIFO寄存器单元
MOV DATARXD,A ;把数据放入数据接收单元DATARXD
MOV A,#00H ;00H代表Good状态
MOVX @DPTE,A ;00H代表Command Complete消息
MOVX @DPTR,A ;把状态和消息送入FIFO再发送出去
MOV DPTR,#CMDREG
MOV A,#24H ;24H为Terminate Sequence命令
MOVX @DPTR,A ;发送一个状态字节和一个消息字节失连
;适用于完成命令后失连
RETI
;**********************
2.3 向PC发送数据:
利用AMD53CF94接口电路向PC机发送数据的程序图如图4所示。以下是其具体的程序清单:
;*** SCSI INTERFACE TRANSMIT SUBROUTINE***
PROC SCSITXD
SCSITXD:
CALL SCSIINI
MOV DPTR,#FIFOREG ;发送数据在发判断数据单元DATATXD放入FIFO中
MOV A,DATATXD
MOVX @DPTR,A ;发送数据放入FIFO中
MOV DPTR,#CMDREG
MOV A,#22H ;22H为Receive Data命令
MOVX @DPTR,A ;发送数据后产生中断
RET
;*************************
;*****SCSI TRANSMIT INTERRUPT SUBROUTINE*****
TXDINT:
MOV DPTR,#FIFOREG ;FIFO寄存器单元
MOV A,#00H ;00H代表Good状态
MOVX @DPTR,A ;00H代表Command Complete消息
MOVX @DPTR,A ;把状态和消息送入FIFO再发送出去
MOV DPTR,#CMDREG
MOV A,#24H ;24H为Terminate Sequence命令
MOVX @DPTR,A ;发送一个状态字节和一个消息字节失连
;适用于完成命令后失连
RETI
;************************