光驱改CD,呵呵

二、IDE(ATAPI)引脚定义
从表一可以看到ATAPI各引脚的定义,下面是几个在实例中要使用的引脚具体说明:
1. DD(15:0)Device Data
DD占用3-18引脚,是一个8位或16位的双向数据线,在用于读写CDROM的寄存器时只使用低8位,而在传送信息包或数据时使用全部16位。
  2. CS(1:0)Chip Select
CS0,CS1是用于选择指令寄存器芯片的,为低电平有效,它和DA组合就可以选择所要操作的寄存器。
  3. DA(2:0)Device Address
DA为三位的地址线,和CS组合选取要操作的寄存器。
  4. DIOR(Device I/O read)
DIOR为控制寄存器或数据口读的引脚,低电平有效。

5. DIOW(Device I/O write)
DIOW为控制寄存器或数据口写的引脚,低电平有效。
  6. RESET
当此引脚为低电平时CDROM会被复位。
  7. INTRQ (Device interrupt)
INTRQ为中断请求,当CDROM在读写数据等状态下会在此引脚输出信号以使控制器中断程序得以执行,本实例中没有使用到这个方法。
  8. IORDY (I/O channel ready)
这个引脚可判断CDROM的数据口是否就绪,等待数据的输入或输出。同样实例中没有使用到些引脚。
  前6种引脚都在实例电路中一一连接在51单片机的IO引脚上,我们可以根据CDROM引脚所要求的电平去实现该引脚的功能,如RESET引脚为低电平有效,连接于单片机的P0.7引脚上,用如下的51C语言就可以实现对CDROM实行复位操作:
P0_7 = 0; //拉低P0_7,RESET为低,复位开始
dmsec(100); //调用延时函数延时一段时间
P0_7 = 1; //拉高RESET,复位完成

 三、认识ATAPI寄存器

地 址
功 能
CS0
CS1
DA2
DA1
DA0
读操作(DIOR)
写操作(DIOW)
A
N
0
0
0
数 据
A
N
0
0
1
错误寄存器
Features
A
N
0
1
0
ATAPI Interrupt Reason/扇区计数(Sector Number)
A
N
0
1
1
扇区数(Sector Number)
A
N
1
0
0
传输字节计数低8位/Cylinder Low
A
N
1
0
1
传输字节计数高8位/Cylinder High
A
N
1
1
0
驱动器选择(Select)
A
N
1
1
1
状态寄存器
命令寄存器

    *注:在功能中同一个寄存器在读操作和写操作时可能会有两个不同的功能。灰色部分的功能会受到BSY(忙)和DRQ(数据请求就绪)这两个状态影响。表中CS栏中的A表示为有效状态(低电平),N为无效状态(高电平),DA栏中的1为高电平,0为低电平。

表3 ATAPI常用寄存器表

   在IDE界面中寄存器的作用可以分二类,一种是用于传送指令和返回数据,一种是用于控制设备和返回控制状态。表3中指明了各ATAPI常用寄存器的地址和功能。地址是用CS和DA组成,CS为寄存器区段的选择,再加上三位地址的DA就可以组合出多个地址编码选择不同的寄存器。在单片机控制程序中可以把P3口IO引脚和DA、CS相连,在程序中控制P3口各引脚的电平状态去选择要操作的寄存器,再通过控制DIOR/ DIOW引脚电平实现读写寄存器。部分的寄存器地址是相同的,如状态寄存器和命令寄存器使用同一个地址,读这个地址时为操作状态寄存器,写这个地址时为操作状态寄存器。下面是本实例中用于控制CDROM用于CD播放时用到的部分寄存器的简单说明。
  1. 错误(ERROR)寄存器
错误寄存器是返回当前的错误信息或指令的执行状态,它是一个只读寄存器,如写入这个寄存器则是写入到Features寄存器中。在实例中的初始化CDROM的函数中执行驱动器自身诊断命令后,可以读取在错误寄存器中返回的诊断结果并和进行标准值对比判断驱动器是否可用。读取的方法很简单,先查表3,得知错误寄存器的地址后,设置对应的引脚电平,这时就可以在DD中的低8位读取到寄存器中的数据。
  2. 状态(Status)寄存器
状态寄存器也是一个只读寄存器,读取它时将会在DD中的低8位返回驱动器的当前状态或指令运行的状态。返回数据的每一位定义如下:

7
6
5
4
3
2
1
0
BSY
DRDY
#
#
DRQ
obsolete
obsolete
ERR
表4 状态(Status)寄存器

BSY为1时表示驱动器正处于工作状态--忙。如在驱动器上电时,驱动器复位,这时BSY为1,等到复位完成后BSY为0。当驱动器处于忙状态时将不会响应其它命令,在程序中可以不断的查询BSY位等到变为0时才继续发达命令。

   DRDY为1是表示驱动器准备就绪。当这个位为0时驱动器没有就绪这时无法使用。
   #号所占的位会根据不同的指令返回的指代表的意思也不同。
   DRQ为1时表示数据请求就绪,这时驱动器准备接受数据,如向命令寄存器发送A0H(PACKET命令)后,DRQ位置1,表示驱动器这时可以接受命令信息包了
   Obslete位一般不使用ATAPI,只是部分旧式的ATA设备所使用。
   ERR位为1时表示指令执行失败或驱动器存在错误。
  3. 命令(Command)寄存器
命令寄存器和状态寄存器同一个地址,是只写寄存器。向这个寄存器传送命令字时将会立即被执行。传送的方法是先设置好地址线,再向DD数据口的低8位写入指令字节。
  4. Cylinder Low/High寄存器
这两个寄存器是可读也可以写,分别为所要发送或接收的数据长度的高低字节,写入数据值N时表示主设备要向驱动器写入或读出写入N次十六位的数据。这在发送信息包时很重要,信息包的长度一般为12个字节长度,那么就可要求先在Cylinder Low/High寄存器写入0006H(L写入06H,H写入00H),也就是说12个字节会分成6次传送,每次2字节(16位)。具体的C语言实现可以参看实例中的void SendPacket(unsigned char SkipDRQ)函数。

 四、ATA命令
ATAPI是在ATA发展而来的,所以仍支持绝大部分的ATA命令。这些命令会直接送到Command寄存器后被ATAPI设备所执行。在这里只说明一下实例程序中所用到的一些相关命令。
1.ATAPI设备软复位命令(08H)
当向命令寄存器写入08H时,驱动器会执行软件复位命令,执行效果和硬件复位差不多。

2. 设备诊断(90H)
执行这个命令时,驱动器会运行自身诊断程序,诊断结束后会返回一个值到错误寄存器,读取错误寄存器值并和标准值比较,当返回值不等于01H或81H时则说明CDROM自身诊断未通过(Device0)。
  3.识别信息包功能IDENTIFY PACKET DEVICE(A1H)
这个命令执行后可以返回当前所选择的驱动器的信息包参数和其它相关的参数,如信息包的长度、驱动器的型号、驱动器序列号等等。先向命令寄存器发A1H,然后就可以在DATA寄存器中读取驱动器相关信息,每次可以读取两个字节,应信息串的格式较长这里不再一一说明,可以参考文章结尾的网页地址中资料。
  5. 信息包功能 PACKET(AOH)
执行这个命令后驱动器将准备发送信息包命令,在执行这个命令之前应先向 Cylinder Low/High寄存器写入将发送一个值为命令信息包的长度除于2的数值,以让驱动器知道要接收多少次数据。
  限于篇幅有限更加详细的说明可以参看'Information Technology AT Attachment with Packet Interface Extension(ATA/ATAPI-4)'的第8章节或'ATA Packet Interface for CD-ROMs SFF-8020i'的第7章节。

(0)

相关推荐