微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 硬盘存储在单片机上的应用

硬盘存储在单片机上的应用

时间:02-13 来源:互联网 点击:

2) 忙状态检测子程序

功能为,读状态寄存器,在BUSY=0和没有错误时,返回A=0和C=0。
Busy:
mov dptr, #status; 读状态寄存器
movx a, @dptr
jb acc.7, Busy; 在BUSY为高时,等待
jb acc.0, errors; 若第0位为1,表示有错误产生,跳转到error处理
clr a ; A C 为0表示非忙,没有错误
clr C ;
ret ;
errors:
mov dptr, #Error_Reg
movx a, @dptr; A中值表示错误指示
setb C ; C为1,表示有错误产生
ret

3) 等待数据准备好子程序

功能为,读状态寄存器,在BUSY=0,DRQ=1,没有错误时,返回A=0和C=0。
WaitDRQ:
mov dptr, #status; 读状态寄存器
movx a, @dptr
jb acc.7, WaitDRQ ; 在BUSY为高时,等待
jnb acc.3, WaitDRQ ; 在第3位DRQ为0时, 等待
jb acc.0, errors ; 若第0位为1,表示有错误产生,跳转到error处理
clr a
clr C ; A C 为0表示非忙,没有错误,数据已准备好
ret

4) 置硬盘工作在8位数据IO模式子程序

功能设置硬盘属性,使其工作在8位模式,与8031的8位数据总线配合。
Enable8bit:
acall Busy
mov dptr, #Features
mov a, #01h ; 使能8位模式
movx @dptr, a
mov dptr, #COMMAND
mov a, #0EFh; 0xEF为设置硬盘属性命令
movx @dptr, a
ret

5) 填充硬盘寄存器子程序

入口为R2(扇区数目),R3(LBA地址的b0-b7),R4(LBA地址的b8-b15), R5(LBA地址的b16-b23) ,R6(低4位为LBA地址的b24-b27), R7(命令字)

功能为将R2-R7中值写入到硬盘寄存器组。
Function:
acall Busy; 调用Busy子程序,如三.2)所述
mov dptr, #Sectr_Cnt; 扇区数目寄存器
mov a, R2 ; R2中值为扇区数目
movx @dptr, a
mov dptr, #LBA0_7; LBA地址的b0-b7寄存器
mov a, R3 ; R3中值为LBA地址的b0-b7
movx @dptr, a
mov dptr, #LBA8_15; LBA地址的b8-b15寄存器
mov a, R4 ; R4中值为LBA地址的b8-b15
movx @dptr, a
mov dptr, #LBA16_24; LBA地址的b16-b23寄存器
mov a, R5 ; R5中值为LBA地址的b16-b23
movx @dptr, a
mov dptr, #Drv_Head; 模式寄存器
mov a, R6 ; R6中值为低4位为LBA地址的b24-b27
anl a, #00001111b
orl a, B;B在Init子程序中已赋值.
movx @dptr, a
mov dptr, #command; 命令寄存器
mov a, R7 ; R7中值为命令字
movx @dptr, a
ret

6) 写扇区子程序

假定对LBA地址为0x0A的扇区写,
Write_Sctr:
mov R2, #1 ; 对R2-R7填入适当值,调用Function
mov R3, #0Ah ;
mov R4, #0
mov R5, #0
mov R6, #0
mov R7, #WriteSctr
acall Function
acall WaitDRQ
acall Write512
ret
Write512:
mov R0, #high(message) ; 取需写入信息的高位地址
mov R1, #low(message) ; 取需写入信息的低位地址
mov R7, #2 ; 512字节 = 2 * 256
mov R6, #0
write:
mov dph, R0 ;
mov dpl, R1
clr a
movc a, @a+dptr ; 读取信息的内容
inc dptr ; 指针指向下一个字节地址
mov R0, dph ;
mov R1, dpl
mov DPTR, #Data_Reg ; 数据寄存器
movx @dptr, a ; 写一个字节到硬盘
djnz R6, write
djnz R7, write ; 循环直到512个字节全部写完
ret

四、总结

由于篇幅所限,不详细介绍对硬盘的读操作,其流程类似于写操作。感兴趣读者可对照ATA协议规范,编写相应的驱动程序。对硬盘操作的ATA命令很多,可以通过ATA命令进行电源管理,读取硬盘参数,进行多个扇区的读写操作。欲详细了解对硬盘的操作,可参照最新的ATA-6协议。本文中,对硬盘的访问采用轮询模式,也可以使对硬盘的访问工作于中断模式,使其在BUSY=0或DRQ=1时触发中断。

在8031上,硬盘只可以工作在8位IO,PIO模式,依照本文的思路,可使硬盘工作于任何嵌入式系统中,工作于DMA模式或16位IO模式。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top