基于单片机的IDE硬盘控制的研究与设计
,则跳入错误处理子程序。
其程序流程图如图3:
3.2 写扇区操作
如图4所示,处理器在接收到写扇区的命令后,读IDE的状态,查询硬盘是否准备好(DRDY=1?);若准备好则把逻辑块地址写入到相应寄存器,告之所需要操作的扇区;将写扇区命令代码写入命令寄存器,同时驱动器设置状态寄存器的DRQ位,表示准备好接收数据,处理器通过数据寄存器将数据写入扇区缓冲区,当扇区缓冲区添满后,驱动器清除DRQ位,并置位BSY。驱动器将扇区缓冲区中的数据写入硬盘,当写盘结束,清除BSY位,发中断请求信号 INTRQ,CPU接收到中断信号后,读驱动器状态寄存器,同时将中断信号INTRQ清除。而后处理器读取状态寄存器,若DRQ=1,则将扇区缓冲区中的数据读走,完毕后,驱动器置BSY,准备读下一个扇区,直到请求的扇区全部读完。
在写的过程中查询状态寄存器的ERR位,若有错误产生,则跳入错误处理子程序。
3.3逻辑块寻址操作
IDE可以用两种方法来寻址即物理寻址方式(CHS)和逻辑寻找方式(LBA)。由于LAB是将物理参数转换成线性地址,对用户来说驱动器是有由连续数据块(扇区)组成的存储介质,不需要知道驱动器的磁头、磁道等参数。因此,本系统采用LBA,其与CHS影射关系为:
LBA=(柱面号*磁头数+磁头号)*扇区数+扇区编号1
在该操作中,处理器根据上述映射关系通过写4个字节LBA地址分别向磁头号寄存器、柱面号高字节寄存器、柱面号低字节寄存器以及起始扇区号寄存器写入数据,以得出需要操作的扇区。
3.4 ide_rd线程和ide_wr线程
处理器通过ide_rd线程和ide_wr线程,设置8255工作模式,对IDE硬盘的寄存器进行读写操作,控制IDE读写周期。
读周期(ide_rd):
ide_rd:
push acc
mov dptr, #cfg8255
mov a, #rd_ide_8255
movx @dptr, a ;配置8255的 工作方式为读模式
mov dptr, #ide_8255_ctl
pop acc
movx @dptr, a ;选中所需寄存器
orl a, #ide_rd_line
movx @dptr, a ;使能读引脚
mov dptr, #ide_8255_msb
clr a
movc a, @a+dptr ;读寄存器高字节
mov r3,a
mov dptr, #ide_8255_lsb
clr a
movc a,@a+dptr ;读寄存器低字节
mov r2, a
mov dptr, #ide_8255_ctl
clr a
movx @dptr, a ;将控制端口复位
ret ;子程序返回
写周期(ide_wr):
写周期与读周期类似,首先将8255配置为写模式,选中所所要操作寄存器,将寄存器高8位和低8位数据分别送到端口A、B,激活IDE总线的写信号;写完毕,通过复位端口的相应位清除IDE总线的写信号。
3.5错误处理操作
在对硬盘读写操作时,需要查询状态寄存器的ERR位,判断是否有错。若有错,查询IDE的错误寄存器,判断错误类型,进行相应的错误处理:在写扇区操作中,当检测到坏扇区(BBK)错误时,跳过并标记坏扇区,重新分配扇区;在读写操作中,如果没有发现0磁道,将调用驱动器重校命令来使驱动器从错误中恢复出来;在读扇区过程中,若发生错误,驱动器将重读出错扇区,若仍有错误,操作将被终止。
4. 结束语
本系统提出了一种单片机控制硬盘的方法,能够比较简洁方便对硬盘进行读写等操作,并成功的应用实际产品中,具有良好的可靠性和稳定性,可以应用到许多要求大容量数据存储的系统中,并可取得了良好的社会效益。
参考文献
[1]. 李华 MCS—51系列单片机实用接口技术[M] 北京 北京航空航天大学出版社 1993 P98-120
[2]. 陈利学 孙彪 赵玉连 微机总线与接口设计[M] 成都 电子科技大学出版社 1988 P45-90
[3].AT Attachment with Packet Interface Extension (ATA/ATAPI-5) ANSI NCITS 1998 P317
[4].Maury Wright. Disk Drivers at 40 Lean . Mean Storage Machines .1996 P41
[5]. 徐厚俊 IDE接口和IDE硬盘驱动器 新浪潮 1996 P17
- 基于DSP的音频会议信号合成算法研究(05-10)
- 基于定点DSP的MP3间频编码算法研究(07-04)
- DSP的并联电力有源滤波器的仿真研究(02-15)
- PCI总线数据采集系统的硬件研究(09-12)
- PIC单片机在温度测量领域的应用及仿真研究(11-23)
- 嵌入式软PLC 的设计与研究(06-27)